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:b:c:ds:t:x")
31 except getopt.GetoptError, e:
32 print >> sys.stderr, "%s: %s " % (sys.argv[0], e)
39 cfg = "/etc/nagios/jabber-notify.ini"
42 subject = "Nagios alert"
57 jids.append({ 'jid': tjid, 'password': a })
63 config = ConfigParser.ConfigParser()
66 for section in a.split(','):
67 jids.append({ 'jid': config.get(section, 'jid'), 'password': config.get(section, 'password')})
69 socket.setdefaulttimeout(timeout)
74 if not section['jid'] or not section['password']:
75 print >> sys.stderr, "%s: jid (-J) and password (-P) are required for `%s'" % (sys.argv[0], section)
79 print >> sys.stderr, "%s: no configured jid accounts found" % sys.argv[0]
83 print >> sys.stderr, "%s: recipient jids are required" % sys.argv[0]
87 logger=logging.getLogger()
88 logger.addHandler(logging.StreamHandler())
89 logger.setLevel(logging.DEBUG)
93 for line in sys.stdin.readlines():
98 if len(body.strip()) == 0:
99 body = "(nagios-jabber.alert warning: missing message body)";
101 message_type = 'chat'
103 class XMPPStreamError(Exception):
104 def __init__(self, msg):
109 class Client(JabberClient):
110 def session_started(self):
113 message = re.sub('<.*?>', '', body)
114 doc = libxml2.parseDoc('<body>' + body + '</body>')
115 doc_element = doc.getRootElement().children
121 msg = Message(to_jid = jid_r, body = message, subject = subject,
122 stanza_type = message_type, thread = "Nagios")
125 node = msg.add_new_content('http://jabber.org/protocol/xhtml-im', 'html')
126 xbody = node.newChild(None, "body", None)
127 html_ns = xbody.newNs('http://www.w3.org/1999/xhtml', None)
129 xbody.addChildList(doc_element.docCopyNodeList(xbody.doc))
131 self.stream.send(msg)
134 def stream_state_changed(self,state,arg):
136 print "*** State changed: %s %r ***" % (state,arg)
138 def stream_error(self,err):
139 raise XMPPStreamError(err.get_message())
144 for attempt in ('first', 'second'):
145 jid = JID(section['jid'])
146 resource = "Nagios/" + hashlib.md5(''.join(recpt)).hexdigest()[:10]
147 if attempt == 'second':
148 # if something went wrong the second time around, it's
149 # most likely a resource name conflict on login, so let's
150 # wait a bit, randomize the resource name and try again
151 resource = resource + '/' + repr(os.getpid())
154 jid = JID(jid.node, jid.domain, resource)
156 c = Client(jid, section['password'], auth_methods = ['sasl:DIGEST-MD5', 'sasl:PLAIN', 'digest'],
157 tls_settings = TLSSettings(require = False, verify_peer = False))
162 except XMPPStreamError, e:
163 # Most likely a duplicate stream problem
164 # don't log anything, just try again
168 err.append("ERROR1: %s: %s" % (section['jid'], e))
170 # don't try another attempt, jump straigt to
174 # stop after first successful attempt at sending the msg
177 err.append("ERROR2: %s: %s" % (section['jid'], e))
179 print >> sys.stderr, "\n".join(err)