X-Git-Url: https://git.realraum.at/?a=blobdiff_plain;f=update-xmpp-status.py;h=04bd22cac0de9ee56ed82334c9cbebd36b9fa9b0;hb=d73860aa0723724aa86640c099a8e5a925865c93;hp=2c40cf2a2362e20893bdc4f5ddd0c28cb56f9e19;hpb=ed5e7e306b88e1662073e0db1da6e521b8ab711c;p=svn42.git diff --git a/update-xmpp-status.py b/update-xmpp-status.py old mode 100644 new mode 100755 index 2c40cf2..04bd22c --- a/update-xmpp-status.py +++ b/update-xmpp-status.py @@ -5,6 +5,7 @@ import os.path import sys #import threading import logging +import logging.handlers import urllib import time import signal @@ -14,14 +15,14 @@ import subprocess import types import ConfigParser -logging.basicConfig( - level=logging.INFO, - #level=f, - #level=logging.DEBUG, - filename='/var/log/tmp/update-xmpp-status.log', - format="%(asctime)s %(message)s", - datefmt="%Y-%m-%d %H:%M:%S" - ) +logger = logging.getLogger() +logger.setLevel(logging.INFO) +#logger.setLevel(logging.DEBUG) +lh_syslog = logging.handlers.SysLogHandler(address="/dev/log",facility=logging.handlers.SysLogHandler.LOG_LOCAL2) +lh_syslog.setFormatter(logging.Formatter('update-xmpp-status.py: %(levelname)s %(message)s')) +logger.addHandler(lh_syslog) +lh_stderr = logging.StreamHandler() +logger.addHandler(lh_stderr) class UWSConfig: def __init__(self,configfile=None): @@ -31,8 +32,20 @@ class UWSConfig: self.config_parser.set('xmpp','recipients_debug','xro@jabber.tittelbach.at') self.config_parser.set('xmpp','recipients_normal','xro@jabber.tittelbach.at otti@wirdorange.org') self.config_parser.set('xmpp','recipients_nooffline','the-equinox@jabber.org') - self.config_parser.set('xmpp','msg_opened',"Realraum Tür wurde%s geöffnet") - self.config_parser.set('xmpp','msg_closed',"Realraum Tür wurde%s geschlossen") + self.config_parser.add_section('msg') + self.config_parser.set('msg','bored',"Somebody is bored and in need of company. Go Visit !") + self.config_parser.set('msg','format',"${status_msg}${request_msg}${comment_msg}") + self.config_parser.set('msg','status_opened_msg',"RealRaum door now open") + self.config_parser.set('msg','status_closed_msg',"RealRaum door now closed") + self.config_parser.set('msg','status_error_msg',"ERROR Last Operation took too long !!!") + self.config_parser.set('msg','request_msg',"\safter ${request} request") + self.config_parser.set('msg','comment_msg',"\s(${comment})") + self.config_parser.set('msg','status_still_opened_msg',"Door remains closed") + self.config_parser.set('msg','status_still_closed_msg',"Door remains open") + self.config_parser.add_section('tracker') + self.config_parser.set('tracker','socket',"/var/run/tuer/presence.socket") + self.config_parser.add_section('debug') + self.config_parser.set('debug','enabled',"False") self.config_mtime=0 if not self.configfile is None: try: @@ -44,20 +57,32 @@ class UWSConfig: self.checkConfigUpdates() def checkConfigUpdates(self): + global logger if self.configfile is None: return logging.debug("Checking Configfile mtime: "+self.configfile) try: mtime = os.path.getmtime(self.configfile) - except IOError: + except (IOError,OSError): return if self.config_mtime < mtime: logging.debug("Reading Configfile") try: self.config_parser.read(self.configfile) self.config_mtime=os.path.getmtime(self.configfile) - except ConfigParser.ParsingError, pe_ex: + except (ConfigParser.ParsingError, IOError), pe_ex: logging.error("Error parsing Configfile: "+str(pe_ex)) + self.config_parser.set('msg','comment_msg', self.config_parser.get('msg','comment_msg').replace("\\s"," ")) + self.config_parser.set('msg','request_msg', self.config_parser.get('msg','request_msg').replace("\\s"," ")) + self.config_parser.set('msg','status_error_msg', self.config_parser.get('msg','status_error_msg').replace("\\s"," ")) + self.config_parser.set('msg','status_closed_msg', self.config_parser.get('msg','status_closed_msg').replace("\\s"," ")) + self.config_parser.set('msg','status_opened_msg', self.config_parser.get('msg','status_opened_msg').replace("\\s"," ")) + self.config_parser.set('msg','status_still_closed_msg', self.config_parser.get('msg','status_still_closed_msg').replace("\\s"," ")) + self.config_parser.set('msg','status_still_opened_msg', self.config_parser.get('msg','status_still_opened_msg').replace("\\s"," ")) + if self.config_parser.get('debug','enabled') == "True": + logger.setLevel(logging.DEBUG) + else: + logger.setLevel(logging.INFO) def writeConfigFile(self): if self.configfile is None: @@ -150,7 +175,7 @@ def sendXmppMsg(recipients, msg, resource = "torwaechter", addtimestamp = True, if resource: sendxmpp_cmd += "-r %s " % resource if noofflinemsg: - sendxmpp_cmd += "--headline " + sendxmpp_cmd += "--message-type=headline " sendxmpp_cmd += recipients if addtimestamp: @@ -159,36 +184,63 @@ def sendXmppMsg(recipients, msg, resource = "torwaechter", addtimestamp = True, popenTimeout2(sendxmpp_cmd, msg) -xmpp_msg_lastmsg = "" -action_by = "" -xmpp_firstmsg = True - -def distributeXmppMsg(msg,high_priority=False): - global xmpp_firstmsg, xmpp_msg_lastmsg - if xmpp_firstmsg: - xmpp_msg_lastmsg = msg - xmpp_firstmsg = False - if msg != xmpp_msg_lastmsg: +def distributeXmppMsg(msg,high_priority=False,debug=False): + if debug == False: sendXmppMsg(uwscfg.xmpp_recipients_normal, msg) sendXmppMsg(uwscfg.xmpp_recipients_nooffline, msg, noofflinemsg=(not high_priority)) else: sendXmppMsg(uwscfg.xmpp_recipients_debug, "D: " + msg) - xmpp_msg_lastmsg = msg - -def touchURL(url): - try: - f = urllib.urlopen(url) - f.read() - f.close() - except Exception, e: - logging.error("tochURL: "+str(e)) - -def displayOpen(): - distributeXmppMsg(uwscfg.xmpp_msg_opened % action_by) - -def displayClosed(): - distributeXmppMsg(uwscfg.xmpp_msg_closed % action_by) - + +def formatAndDistributePresence(presence): + if presence == "yes": + distributeXmppMsg("Somebody is present right now") + else: + distributeXmppMsg("Nobody is here, everybody left") + +current_status = (None, None, None) +def filterAndFormatMessage(new_status): + global current_status + if new_status in [current_status, (current_status[0], None, None)] : + distributeXmppMsg("Status recieved but filtered: (%s,%s,%s)" % new_status ,debug=True) + elif current_status == (None, None, None): + current_status=new_status + distributeXmppMsg("Initial Status: (%s,%s,%s)" % new_status ,debug=True) + else: + (status,req,req_comment) = new_status + high_priority_msg = False + req_msg="" + status_msg="" + comment_msg="" + if status == "error": + status_msg = uwscfg.msg_status_error_msg + high_priority_msg=True + else: + if current_status[0] == status: + if status == "opened": + status_msg = uwscfg.msg_status_still_opened_msg + elif status == "closed": + status_msg = uwscfg.msg_status_still_closed_msg + else: + logging.error("Unknown Status recieved: (%s,%s,%s)" % new_status) + distributeXmppMsg("Unknown Status: (%s,%s,%s)" % new_status ,debug=True) + return + else: + if status == "opened": + status_msg = uwscfg.msg_status_opened_msg + elif status == "closed": + status_msg = uwscfg.msg_status_closed_msg + else: + logging.error("Unknown Status recieved: (%s,%s,%s)" % new_status) + distributeXmppMsg("Unknown Status: (%s,%s,%s)" % new_status ,debug=True) + return + if req: + req_msg = uwscfg.msg_request_msg.replace("${request}",req) + if req_comment: + comment_msg = uwscfg.msg_comment_msg.replace("${comment}",req_comment) + msg = uwscfg.msg_format.replace("${status_msg}", status_msg).replace("${request_msg}",req_msg).replace("${comment_msg}",comment_msg) + distributeXmppMsg(msg, high_priority=high_priority_msg) + current_status=new_status + def exitHandler(signum, frame): logging.info("Door Status Listener stopping") try: @@ -207,64 +259,73 @@ signal.signal(signal.SIGINT, exitHandler) signal.signal(signal.SIGQUIT, exitHandler) logging.info("Update-Xmpp-Status started") - + if len(sys.argv) > 1: - socketfile = sys.argv[1] -else: - socketfile = "/var/run/tuer/door_cmd.socket" - -if len(sys.argv) > 2: - uwscfg = UWSConfig(sys.argv[2]) + uwscfg = UWSConfig(sys.argv[1]) else: uwscfg = UWSConfig() -sendXmppMsg(uwscfg.xmpp_recipients_debug,"D: update-xmpp-status.py started") - -sockhandle = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) +distributeXmppMsg("update-xmpp-status.py started", debug=True) RE_STATUS = re.compile(r'Status: (\w+), idle') RE_REQUEST = re.compile(r'Request: (\w+) (?:Card )?(.+)') +RE_PRESENCE = re.compile(r'Presence: (yes|no)') +RE_BUTTON = re.compile(r'button\d?') RE_ERROR = re.compile(r'Error: (.+)') while True: try: - sockhandle.connect(socketfile) + if not os.path.exists(uwscfg.tracker_socket): + logging.debug("Socketfile '%s' not found, waiting 5 secs" % uwscfg.tracker_socket) + time.sleep(5) + continue + sockhandle = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + sockhandle.connect(uwscfg.tracker_socket) conn = os.fdopen(sockhandle.fileno()) - sockhandle.send("listen\n") - sockhandle.send("status\n") + #sockhandle.send("listen\n") + #sockhandle.send("status\n") + last_request = (None, None) while True: line = conn.readline() logging.debug("Got Line: " + line) uwscfg.checkConfigUpdates() + if line == "": + raise Exception("EOF on Socket, daemon seems to have quit") + + m = RE_BUTTON.match(line) + if not m is None: + distributeXmppMsg(uwscfg.msg_bored) + continue + m = RE_PRESENCE.match(line) + if not m is None: + formatAndDistributePresence(m.group(1)) + continue m = RE_STATUS.match(line) if not m is None: status = m.group(1) - if status == "opened": - displayOpen() - if status == "closed": - displayClosed() + filterAndFormatMessage((status,) + last_request) + last_request = (None, None) + continue m = RE_REQUEST.match(line) if not m is None: - #(rq_action,rq_by) = m.group(1,2) - action_by = " von " + m.group(2) - else: - action_by = "" + last_request = m.group(1,2) + continue m = RE_ERROR.match(line) if not m is None: errorstr = m.group(1) if "too long!" in errorstr: - distributeXmppMsg(uwscfg.xmpp_recipients_debug, "Door Error: "+errorstr, high_priority=True) + filterAndFormatMessage(("error",) + last_request) + last_request = (None, None) else: - sendXmppMsg(uwscfg.xmpp_recipients_debug, "D: Error: "+errorstr) + logging.error("Recieved Error: "+errorstr) + distributeXmppMsg("Error: "+errorstr, debug=True) + last_request = (None, None) except Exception, ex: logging.error("main: "+str(ex)) try: - conn.close() - except: - pass - try: sockhandle.close() except: pass + conn=None + sockhandle=None time.sleep(5) -