2 # arekm@pld-linux.org, 2006-01
3 # glen@pld-linux.org, 2006-03-14
4 # glen@pld-linux.org,arekm@pld-linux.org, 2006-10-30 - added ssl support (for gmail.com)
5 # glen@pld-linux.org 2006-11-03 - made it work with jabber.pld-linux.org again
6 # glen@pld-linux.org,arekm@pld-linux.org, 2006-11-13 - added config file support
7 # glen@pld-linux.org, 2006-12-07 - added html messages support (-x), thx goes to to jajcus
8 # luzik@pld-linux.org, 2007-03 - added digest auth method(jabber.gda.pl)
9 # arekm@pld-linux.org, 2009-07 - added fallback accounts support
11 # jabber.alert [-x] [-c config] [-a account_id][,otheraccount_id] [-t timeout ] [-J from_jid -P password] to_jid1 to_jid2 to_jid3
24 from pyxmpp.jid import JID
25 from pyxmpp.message import Message
26 from pyxmpp.jabber.client import JabberClient
27 from pyxmpp.streamtls import TLSSettings
30 opts, args = getopt.getopt(sys.argv[1:], "J:P:a:c:dt:x")
31 except getopt.GetoptError, e:
32 print >> sys.stderr, "%s: %s " % (sys.argv[0], e)
39 cfg = "/etc/nagios/jabber-notify.ini"
53 jids.append({ 'jid': tjid, 'password': a })
57 config = ConfigParser.ConfigParser()
60 for section in a.split(','):
61 jids.append({ 'jid': config.get(section, 'jid'), 'password': config.get(section, 'password')})
63 socket.setdefaulttimeout(timeout)
68 if not section['jid'] or not section['password']:
69 print >> sys.stderr, "%s: jid (-J) and password (-P) are required for `%s'" % (sys.argv[0], section)
73 print >> sys.stderr, "%s: no configured jid accounts found" % sys.argv[0]
77 print >> sys.stderr, "%s: recipient jids are required" % sys.argv[0]
81 logger=logging.getLogger()
82 logger.addHandler(logging.StreamHandler())
83 logger.setLevel(logging.DEBUG)
85 subject = "Nagios alert"
90 for line in sys.stdin.readlines():
95 if len(body.strip()) == 0:
96 body = "(nagios-jabber.alert warning: missing message body)";
100 class XMPPStreamError(Exception):
101 def __init__(self, msg):
106 class Client(JabberClient):
107 def session_started(self):
110 message = re.sub('<.*?>', '', body)
111 doc = libxml2.parseDoc('<body>' + body + '</body>')
112 doc_element = doc.getRootElement().children
118 msg = Message(to_jid = jid_r, body = message, subject = subject,
119 stanza_type = message_type, thread = "Nagios")
122 node = msg.add_new_content('http://jabber.org/protocol/xhtml-im', 'html')
123 xbody = node.newChild(None, "body", None)
124 html_ns = xbody.newNs('http://www.w3.org/1999/xhtml', None)
126 xbody.addChildList(doc_element.docCopyNodeList(xbody.doc))
128 self.stream.send(msg)
131 def stream_state_changed(self,state,arg):
133 print "*** State changed: %s %r ***" % (state,arg)
135 def stream_error(self,err):
136 raise XMPPStreamError(err.get_message())
141 for attempt in ('first', 'second'):
142 jid = JID(section['jid'])
143 resource = "Nagios/" + hashlib.md5(''.join(recpt)).hexdigest()[:10]
144 if attempt == 'second':
145 # if something went wrong the second time around, it's
146 # most likely a resource name conflict on login, so let's
147 # wait a bit, randomize the resource name and try again
148 resource = resource + '/' + repr(os.getpid())
151 jid = JID(jid.node, jid.domain, resource)
153 c = Client(jid, section['password'], auth_methods = ['sasl:DIGEST-MD5', 'sasl:PLAIN', 'digest'],
154 tls_settings = TLSSettings(require = False, verify_peer = False))
159 except XMPPStreamError, e:
160 # Most likely a duplicate stream problem
161 # don't log anything, just try again
165 err.append("ERROR1: %s: %s" % (section['jid'], e))
167 # don't try another attempt, jump straigt to
171 # stop after first successful attempt at sending the msg
174 err.append("ERROR2: %s: %s" % (section['jid'], e))
176 print >> sys.stderr, "\n".join(err)