[packages/nagios-alert-jabber] Ver 1.3; convert to python3 and pyxmpp2 (more polishing would be nice)

arekm arekm at pld-linux.org
Thu Sep 22 13:57:04 CEST 2022


commit f15f5dd317d897ca8efb6416b7b071a3c4b06c73
Author: Arkadiusz Miśkiewicz <arekm at maven.pl>
Date:   Thu Sep 22 13:55:16 2022 +0200

    Ver 1.3; convert to python3 and pyxmpp2 (more polishing would be nice)

 nagios-alert-jabber.spec |   7 ++-
 nagios-jabber.alert      | 134 +++++++++++++++++++++++++++--------------------
 2 files changed, 79 insertions(+), 62 deletions(-)
---
diff --git a/nagios-alert-jabber.spec b/nagios-alert-jabber.spec
index 732a8ac..ef6c7f8 100644
--- a/nagios-alert-jabber.spec
+++ b/nagios-alert-jabber.spec
@@ -1,15 +1,14 @@
 Summary:	Program to send (Nagios) alerts via jabber
 Summary(pl.UTF-8):	Program do wysyłania alarmów (Nagiosa) przez jabbera
 Name:		nagios-alert-jabber
-Version:	1.2
-Release:	11
+Version:	1.3
+Release:	1
 License:	GPL
 Group:		Networking
 Source0:	nagios-jabber.alert
 Requires:	cyrus-sasl-plain
 Requires:	nagios-common
-Requires:	python-M2Crypto
-Requires:	python-pyxmpp
+Requires:	python3-pyxmpp2
 BuildRoot:	%{tmpdir}/%{name}-%{version}-root-%(id -u -n)
 
 %define		_sysconfdir	/etc/nagios
diff --git a/nagios-jabber.alert b/nagios-jabber.alert
index 5dd668d..3735b91 100644
--- a/nagios-jabber.alert
+++ b/nagios-jabber.alert
@@ -1,12 +1,4 @@
-#!/usr/bin/python2 -u
-# arekm at pld-linux.org, 2006-01
-# glen at pld-linux.org, 2006-03-14
-# glen at pld-linux.org,arekm at pld-linux.org, 2006-10-30 - added ssl support (for gmail.com)
-# glen at pld-linux.org 2006-11-03 - made it work with jabber.pld-linux.org again
-# glen at pld-linux.org,arekm at pld-linux.org, 2006-11-13 - added config file support
-# glen at pld-linux.org, 2006-12-07 - added html messages support (-x), thx goes to to jajcus
-# luzik at pld-linux.org, 2007-03 - added digest auth method(jabber.gda.pl)
-# arekm at pld-linux.org, 2009-07 - added fallback accounts support
+#!/usr/bin/python3 -u
 # usage:
 #   jabber.alert [-x] [-c config] [-a account_id][,otheraccount_id] [-t timeout ] [-J from_jid -P password] to_jid1 to_jid2 to_jid3
 
@@ -16,20 +8,23 @@ import re
 import sys
 import getopt
 import logging
+import signal
 import socket
 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
+from pyxmpp2.jid import JID
+from pyxmpp2.message import Message
+from pyxmpp2.client import Client
+from pyxmpp2.settings import XMPPSettings
+from pyxmpp2.interfaces import EventHandler, event_handler, QUIT
+from pyxmpp2.streamevents import AuthorizedEvent, DisconnectedEvent
 
 try:
     opts, args = getopt.getopt(sys.argv[1:], "J:P:a:b:c:ds:t:x")
-except getopt.GetoptError, e:
-    print >> sys.stderr, "%s: %s " % (sys.argv[0], e)
+except getopt.GetoptError as e:
+    print("%s: %s " % (sys.argv[0], e), file=sys.stderr)
     sys.exit(1)
 
 jids = []
@@ -58,9 +53,9 @@ for o, a in opts:
     if o == '-s':
         subject = a
     if o == '-a':
-        import ConfigParser
+        import configparser
 
-        config = ConfigParser.ConfigParser()
+        config = configparser.ConfigParser()
         config.read(cfg)
 
         for section in a.split(','):
@@ -72,15 +67,15 @@ recpt = args
 
 for section in jids:
     if not section['jid'] or not section['password']:
-        print >> sys.stderr, "%s: jid (-J) and password (-P) are required for `%s'" % (sys.argv[0], section)
+        print("%s: jid (-J) and password (-P) are required for `%s'" % (sys.argv[0], section), file=sys.stderr)
         sys.exit(1)
 
 if not jids:
-    print >> sys.stderr, "%s: no configured jid accounts found" % sys.argv[0]
+    print("%s: no configured jid accounts found" % sys.argv[0], file=sys.stderr)
     sys.exit(1)
 
 if not recpt:
-    print >> sys.stderr, "%s: recipient jids are required" % sys.argv[0]
+    print("%s: recipient jids are required" % sys.argv[0], file=sys.stderr)
     sys.exit(1)
 
 if debug:
@@ -98,16 +93,29 @@ if not body:
 if len(body.strip()) == 0:
     body = "(nagios-jabber.alert warning: missing message body)";
 
-message_type = 'chat'
-
-class XMPPStreamError(Exception):
-    def __init__(self, msg):
-        self.msg = msg
-    def __str__(self):
-        return self.msg
-
-class Client(JabberClient):
-    def session_started(self):
+class NagiosHandler(EventHandler):
+    """Echo Bot implementation."""
+    def __init__(self):
+        signal.signal(signal.SIGINT, self.exit_gracefully)
+        signal.signal(signal.SIGTERM, self.exit_gracefully)
+
+    def run(self):
+        """Request client connection and start the main loop."""
+        self.client.connect()
+        self.client.run()
+
+    def exit_gracefully(self, signum, frame):
+        logging.info(u"Received signal {0}".format(signum))
+        self.client.main_loop.quit()
+
+    def disconnect(self):
+        """Request disconnection and let the main loop run for a 2 more
+        seconds for graceful disconnection."""
+        self.client.disconnect()
+        self.client.run(timeout = 2)
+
+    @event_handler(AuthorizedEvent)
+    def handle_authorized(self, event):
         if (html == True):
             import re
             message = re.sub('<.*?>', '', body)
@@ -119,7 +127,7 @@ class Client(JabberClient):
         for r in recpt:
             jid_r = JID(r)
             msg = Message(to_jid = jid_r, body = message, subject = subject,
-                            stanza_type = message_type, thread = "Nagios")
+                            stanza_type = 'chat', thread = "Nagios")
 
             if (html == True):
                 node = msg.add_new_content('http://jabber.org/protocol/xhtml-im', 'html')
@@ -128,22 +136,24 @@ class Client(JabberClient):
                 xbody.setNs(html_ns)
                 xbody.addChildList(doc_element.docCopyNodeList(xbody.doc))
 
-            self.stream.send(msg)
-        self.disconnect()
-
-    def stream_state_changed(self,state,arg):
-        if debug:
-            print "*** State changed: %s %r ***" % (state,arg)
+            event.stream.send(msg)
+        event.stream.disconnect()
 
-    def stream_error(self,err):
-        raise XMPPStreamError(err.get_message())
+    @event_handler(DisconnectedEvent)
+    def handle_disconnected(self, event):
+        """Quit the main loop upon disconnection."""
+        return QUIT
 
+    @event_handler()
+    def handle_all(self, event):
+        """Log all events."""
+        logging.info(u"-- {0}".format(event))
 
 err = []
 for section in jids:
     for attempt in ('first', 'second'):
         jid = JID(section['jid'])
-        resource = "Nagios/" + hashlib.md5(''.join(recpt)).hexdigest()[:10]
+        resource = "Nagios/" + hashlib.md5(''.join(recpt).encode('utf-8')).hexdigest()[:10]
         if attempt == 'second':
             # if something went wrong the second time around, it's
             # most likely a resource name conflict on login, so let's
@@ -151,30 +161,38 @@ for section in jids:
             resource = resource + '/' + repr(os.getpid())
             time.sleep(0.8)
         if not jid.resource:
-            jid = JID(jid.node, jid.domain, resource)
+            jid = JID(jid.local, jid.domain, resource)
 
-        c = Client(jid, section['password'], auth_methods = ['sasl:DIGEST-MD5', 'sasl:PLAIN', 'digest'],
-                        tls_settings = TLSSettings(require = False, verify_peer = False))
+        settings = XMPPSettings({
+                            u"password": section['password'],
+                            u"software_name": "Nagios notify jabber",
+                            u"starttls": True,
+                            u"tls_verify_peer": True,
+                            u"tls_cacert_file": "/etc/pki/tls/certs/ca-bundle.crt"
+                            })
+
+        handler = NagiosHandler()
         try:
-            c.connect()
+            c = Client(jid, [handler], settings)
             try:
-                c.loop(1)
-            except XMPPStreamError, e:
-                # Most likely a duplicate stream problem
-                # don't log anything, just try again
-                c.disconnect()
-                continue
-            except Exception, e:
-                err.append("ERROR1: %s: %s" % (section['jid'], e))
+                c.connect()
+                c.run()
+            except KeyboardInterrupt:
                 c.disconnect()
+                logging.info(u"Disconnected due to KeyboardInterrupt")
+                sys.exit(0)
+            except Exception as e:
+                err.append("ERROR1: %s: %s" % (jid, e))
                 # don't try another attempt, jump straigt to
                 # another section
                 break
-            c.disconnect()
-            # stop after first successful attempt at sending the msg
-            sys.exit(0)
-        except Exception, e:
-            err.append("ERROR2: %s: %s" % (section['jid'], e))
+            else:
+                c.disconnect()
+                logging.info(u"Disconnected")
+                # stop after first successful attempt at sending the msg
+                sys.exit(0)
+        except Exception as e:
+            err.append("ERROR2: %s: %s" % (jid, e))
 
-print >> sys.stderr, "\n".join(err)
+print("\n".join(err), file=sys.stderr)
 sys.exit(1)
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/nagios-alert-jabber.git/commitdiff/f15f5dd317d897ca8efb6416b7b071a3c4b06c73



More information about the pld-cvs-commit mailing list