]> git.pld-linux.org Git - packages/nagios-alert-jabber.git/blame - nagios-jabber.alert
pyreindent
[packages/nagios-alert-jabber.git] / nagios-jabber.alert
CommitLineData
02673eb0
ER
1#!/usr/bin/python -u
2# arekm@pld-linux.org, 2006-01
3# glen@pld-linux.org, 2006-03-14
ad7ac473 4# glen@pld-linux.org,arekm@pld-linux.org, 2006-10-30 - added ssl support (for gmail.com)
8a0d8b38 5# glen@pld-linux.org 2006-11-03 - made it work with jabber.pld-linux.org again
20bb0aca 6# glen@pld-linux.org,arekm@pld-linux.org, 2006-11-13 - added config file support
ebbef88a 7# glen@pld-linux.org, 2006-12-07 - added html messages support (-x), thx goes to to jajcus
071905aa 8# luzik@pld-linux.org, 2007-03 - added digest auth method(jabber.gda.pl)
b6621e54 9# arekm@pld-linux.org, 2009-07 - added fallback accounts support
02673eb0 10# usage:
b262787e 11# jabber.alert [-x] [-c config] [-a account_id][,otheraccount_id] [-t timeout ] [-J from_jid -P password] to_jid1 to_jid2 to_jid3
02673eb0
ER
12
13import os
257cdecd 14import hashlib
02673eb0
ER
15import re
16import sys
17import getopt
eca05a2f 18import logging
c49eec10 19import socket
02673eb0
ER
20import string
21import time
ebbef88a 22import libxml2
02673eb0
ER
23
24from pyxmpp.jid import JID
25from pyxmpp.message import Message
26from pyxmpp.jabber.client import JabberClient
ad7ac473 27from pyxmpp.streamtls import TLSSettings
02673eb0
ER
28
29try:
2682443e 30 opts, args = getopt.getopt(sys.argv[1:], "J:P:a:b:c:dt:x")
02673eb0 31except getopt.GetoptError, e:
2682443e
AM
32 print >> sys.stderr, "%s: %s " % (sys.argv[0], e)
33 sys.exit(1)
02673eb0 34
b6621e54 35jids = []
ebbef88a 36html = False
f985e683 37debug = False
5cf88261 38timeout = 20
b262787e 39cfg = "/etc/nagios/jabber-notify.ini"
b6621e54 40tjid = None
02673eb0 41for o, a in opts:
2682443e
AM
42 if o == '-c':
43 cfg = a
44 if o == '-d':
45 debug = True
46 if o == '-t':
47 timeout = float(a)
48 if o == '-x':
49 html = True
50 if o == '-J':
51 tjid = a
52 if o == '-P':
53 jids.append({ 'jid': tjid, 'password': a })
54 if o == '-a':
55 import ConfigParser
56
57 config = ConfigParser.ConfigParser()
58 config.read(cfg)
59
60 for section in a.split(','):
61 jids.append({ 'jid': config.get(section, 'jid'), 'password': config.get(section, 'password')})
02673eb0 62
5cf88261
AM
63socket.setdefaulttimeout(timeout)
64
02673eb0
ER
65recpt = args
66
b6621e54 67for section in jids:
2682443e
AM
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)
70 sys.exit(1)
b6621e54
AM
71
72if not jids:
2682443e
AM
73 print >> sys.stderr, "%s: no configured jid accounts found" % sys.argv[0]
74 sys.exit(1)
02673eb0 75
b6621e54 76if not recpt:
2682443e
AM
77 print >> sys.stderr, "%s: recipient jids are required" % sys.argv[0]
78 sys.exit(1)
02673eb0 79
f985e683 80if debug:
2682443e
AM
81 logger=logging.getLogger()
82 logger.addHandler(logging.StreamHandler())
83 logger.setLevel(logging.DEBUG)
02673eb0
ER
84
85subject = "Nagios alert"
02673eb0
ER
86
87body = ""
88stdin_body = ""
89do_print = True
90for line in sys.stdin.readlines():
2682443e 91 stdin_body += line
02673eb0
ER
92
93body += stdin_body
94
8ccfe18b 95if len(body.strip()) == 0:
2682443e 96 body = "(nagios-jabber.alert warning: missing message body)";
8ccfe18b 97
02673eb0
ER
98message_type = 'chat'
99
257cdecd 100class XMPPStreamError(Exception):
2682443e
AM
101 def __init__(self, msg):
102 self.msg = msg
103 def __str__(self):
104 return self.msg
257cdecd 105
02673eb0 106class Client(JabberClient):
2682443e
AM
107 def session_started(self):
108 if (html == True):
109 import re
110 message = re.sub('<.*?>', '', body)
111 doc = libxml2.parseDoc('<body>' + body + '</body>')
112 doc_element = doc.getRootElement().children
113 else:
114 message = body
115
116 for r in recpt:
117 jid_r = JID(r)
118 msg = Message(to_jid = jid_r, body = message, subject = subject,
119 stanza_type = message_type, thread = "Nagios")
120
121 if (html == True):
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)
125 xbody.setNs(html_ns)
126 xbody.addChildList(doc_element.docCopyNodeList(xbody.doc))
127
128 self.stream.send(msg)
129 self.disconnect()
130
131 def stream_state_changed(self,state,arg):
132 if debug:
133 print "*** State changed: %s %r ***" % (state,arg)
134
135 def stream_error(self,err):
136 raise XMPPStreamError(err.get_message())
257cdecd
MM
137
138
b6621e54
AM
139err = []
140for section in jids:
2682443e
AM
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())
149 time.sleep(0.8)
150 if not jid.resource:
151 jid = JID(jid.node, jid.domain, resource)
152
153 c = Client(jid, section['password'], auth_methods = ['sasl:DIGEST-MD5', 'sasl:PLAIN', 'digest'],
154 tls_settings = TLSSettings(require = False, verify_peer = False))
155 try:
156 c.connect()
157 try:
158 c.loop(1)
159 except XMPPStreamError, e:
160 # Most likely a duplicate stream problem
161 # don't log anything, just try again
162 c.disconnect()
163 continue
164 except Exception, e:
165 err.append("ERROR1: %s: %s" % (section['jid'], e))
166 c.disconnect()
167 # don't try another attempt, jump straigt to
168 # another section
169 break
170 c.disconnect()
171 # stop after first successful attempt at sending the msg
172 sys.exit(0)
173 except Exception, e:
174 err.append("ERROR2: %s: %s" % (section['jid'], e))
b6621e54
AM
175
176print >> sys.stderr, "\n".join(err)
177sys.exit(1)
This page took 0.177354 seconds and 4 git commands to generate.