#!/usr/bin/python -u
# arekm@pld-linux.org, 2006-01
# glen@pld-linux.org, 2006-03-14
# glen@pld-linux.org,arekm@pld-linux.org, 2006-10-30 - added ssl support (for gmail.com)
# glen@pld-linux.org 2006-11-03 - made it work with jabber.pld-linux.org again
# glen@pld-linux.org,arekm@pld-linux.org, 2006-11-13 - added config file support
# glen@pld-linux.org, 2006-12-07 - added html messages support (-x), thx goes to to jajcus
# luzik@pld-linux.org, 2007-03 - added digest auth method(jabber.gda.pl)
# usage:
#   jabber.alert [-x] [-a account_id] [-J from_jid -P password] to_jid1 to_jid2 to_jid3

import os
import re
import sys
import getopt
import string
import time
import libxml2

from pyxmpp.jid import JID
from pyxmpp.message import Message
from pyxmpp.jabber.client import JabberClient
from pyxmpp.streamtls import TLSSettings

try:
	opts, args = getopt.getopt(sys.argv[1:], "J:P:a:x")
except getopt.GetoptError, e:
	print "%s: %s " % (sys.argv[0], e)
	sys.exit(1)

jid = None
password = None
html = False

for o, a in opts:
	if o == '-x':
		html = True
	if o == '-J':
		jid = a
	if o == '-P':
		password = a
	if o == '-a':
		import ConfigParser

		config = ConfigParser.ConfigParser()
		config.read('/etc/nagios/jabber-notify.ini')

		jid = config.get(a, 'jid')
		password = config.get(a, 'password')

recpt = args

if jid == None or password == None:
	print "%s: jid (-J) and password (-P) are required" % sys.argv[0]
	sys.exit(1)

if recpt == None:
	print "%s: recipient jids are required" % sys.argv[0]
	sys.exit(1)


subject = "Nagios alert"
server = None
port = None

body = ""
stdin_body = ""
do_print = True
for line in sys.stdin.readlines():
	stdin_body += line

body += stdin_body

if len(body.strip()) == 0:
	body = "(nagios-jabber.alert warning: missing message body)";

message_type = 'chat'

jid = JID(jid)
if not jid.resource:
	jid = JID(jid.node, jid.domain, "Nagios")

class Client(JabberClient):
	def session_started(self):
		if (html == True):
			import re
			message = re.sub('<.*?>', '', body)
			doc = libxml2.parseDoc('<body>' + body + '</body>')
			doc_element = doc.getRootElement().children
		else:
			message = body

		for r in recpt:

			jid_r = JID(r)
			msg = Message(to_jid = jid_r, body = message, subject = subject, stanza_type = message_type)

			if (html == True):
				node = msg.add_new_content('http://jabber.org/protocol/xhtml-im', 'html')
				xbody = node.newChild(None, "body", None)
				html_ns = xbody.newNs('http://www.w3.org/1999/xhtml', None)
				xbody.setNs(html_ns)
				xbody.addChildList(doc_element.docCopyNodeList(xbody.doc))

			self.stream.send(msg)
		self.disconnect()

c = Client(jid, password, server = server, port = port, auth_methods = ['sasl:DIGEST-MD5', 'sasl:PLAIN', 'digest'], tls_settings = TLSSettings(require = False, verify_peer = False))
c.connect()
try:
	c.loop(1)
except Exception, e:
	print "ERROR: %s" % e
	c.disconnect()
c.disconnect()
