class CombaMessenger(): def __init__(self): """ Constructor """ self.channel = 'main' self.section = '' self.rstore = RedisStateStore() self.errnr = '00' self.components = {'controller':'01', 'scheduler':'02', 'playd':'03', 'recorder':'04', 'helpers':'09'} self.fromMail = '' self.adminMails = '' #------------------------------------------------------------------------------------------# def setChannel(self, channel): """ Einen "Kanal" setzen - zb scheduler @type channel: string @param channel: Kanal/Name der Komponente """ self.channel = channel if self.components.has_key(channel): self.errnr = self.components[channel] self.rstore.setChannel(channel) #------------------------------------------------------------------------------------------# def setSection(self, section): """ Einen Sektion / Gültigkeitsbereich der Meldung setzen - zb internal @type section: string @param section: Gültigkeitsbereich """ self.section = section #------------------------------------------------------------------------------------------# def setMailAddresses(self, fromMail, adminMails): """ Einen Sektion / Gültigkeitsbereich der Meldung setzen - zb internal @type section: string @param section: Gültigkeitsbereich """ self.fromMail = fromMail self.adminMails = adminMails #------------------------------------------------------------------------------------------# def send(self, message, code, level, job, value='', section=''): """ Eine Message senden @type message: string @param message: menschenverständliche Nachricht @type code: string @param code: Fehlercode - endet mit 00 bei Erfolg @type level: string @param level: Error-Level - info, warning, error, fatal @type job: string @param job: Name der ausgeführten Funktion @type value: string @param value: Ein Wert @type section: string @param section: Globale Sektion überschreiben """ section = self.section if section == '' else section self.time = str(datetime.datetime.now().strftime('%Y-%m-%dT%H:%M:%S:%f')) self.utime = time.time() state = {'message':message.strip().replace("'","\\'"), 'code':self.errnr + str(code),'job':job,'value':value} self.rstore.setSection(section) self.rstore.store(level, state) ###TODO: hier kann auch was zu redis gepostet werden if level == 'info' or level == 'success': logging.info(message) elif level == 'warning': logging.warning(message) elif level == 'error': logging.error(message) self.sendAdminmail(level, message, state) elif level == 'fatal': logging.critical(message) self.sendAdminmail(level, message, state) #------------------------------------------------------------------------------------------# def sayAlive(self): """ Soll alle 20 Sekunden von den Komponenten ausgeführt werden, um zu melden, dass sie am Leben sind """ self.rstore.setAliveState() #------------------------------------------------------------------------------------------# def getAliveState(self, channel): """ Live State abfragen @type channel: string @param channel: Channel/Komponente """ return self.rstore.getAliveState(channel) #------------------------------------------------------------------------------------------# def setState(self, name, value, expires=None, channel=None): """ Kündigt einen Event an @type name: string @param name: Name des state @type value: string @param value: Wert @type channel: string @param channel: Kanal (optional) """ if not channel: channel = self.channel self.rstore.setState(name, value, expires, channel) #------------------------------------------------------------------------------------------# def queueAddEvent(self, name, eventtime, value, channel=None): """ Kündigt einen Event an @type name: string @param name: der Name des Events @type eventtime: string|datetime.datetime @param eventtime: Datum und Zeit des events @type value: dict @param value: Werte @type channel: string @param channel: Kanal (optional) """ if not channel: channel = self.channel if type(eventtime) == type(str()): eventtime_str = datetime.datetime.strptime(eventtime[0:16].replace(' ','T'), "%Y-%m-%dT%H:%M").strftime("%Y-%m-%dT%H:%M") elif type(eventtime) is datetime.datetime: eventtime_str = eventtime.strftime("%Y-%m-%dT%H:%M") else: raise TypeError('eventtime must be a datetime.date or a string, not a %s' % type(eventtime)) self.rstore.queueAddEvent(eventtime_str, name, value, channel) #------------------------------------------------------------------------------------------# def queueRemoveEvents(self, name, channel=None): """ Löscht Events @type name: string @param name: der Name des Events @type channel: string @param channel: Kanal (optional) """ if not channel: channel = self.channel self.rstore.queueRemoveEvents(name, channel) #------------------------------------------------------------------------------------------# def fireEvent(self, name, value, channel=None): """ Feuert einen Event @type name: string @param name: der Name des Events @type value: dict @param value: Werte @type channel: string @param channel: Kanal (optional) """ if not channel: channel = self.channel self.rstore.fireEvent(name, value, channel) #------------------------------------------------------------------------------------------# def getEventQueue(self, name=None, channel=None): """ Holt events eines Kanals @type channel: string @param channel: Kanal (optional) @rtype: list @return: Liste der Events """ queue = self.rstore.getEventQueue(name, channel) return queue #------------------------------------------------------------------------------------------# def getEvents(self, name=None, channel=None): """ Holt events eines Kanals @type channel: string @param channel: Kanal (optional) @rtype: list @return: Liste der Events """ events = self.rstore.getEvents(name, channel) return events #------------------------------------------------------------------------------------------# def getEvent(self, name=None, channel=None): """ Holt event eines Kanals @type channel: string @param channel: Kanal (optional) @rtype: dict @return: Event """ events = self.rstore.getEvents(name, channel) result = False if events: result = events.pop(0) return result #------------------------------------------------------------------------------------------# def sendAdminmail(self, level, message, state): """ Sendent mail an Admin(s), @type message: string @param message: Die Message @type state: dict @param state: Der State @return result """ if self.fromMail and self.adminMails: subject = "Possible comba problem on job " + state['job'] + " - " + level mailmessage = "Hi Admin,\n comba reports a possible problem\n\n" mailmessage = mailmessage + level + "!\n" mailmessage = mailmessage + message + "\n\n" mailmessage = mailmessage + "Additional information:\n" mailmessage = mailmessage + "##################################################\n" mailmessage = mailmessage + "Job:\t" + state['job'] + "\n" mailmessage = mailmessage + "Code:\t" + state['code'] + "\n" mailmessage = mailmessage + "Value:\t" + str(state['value']) + "\n" mailer = CombaMailer(self.adminMails,self.fromMail) mailer.sendAdminMail(subject,mailmessage) else: return False #------------------------------------------------------------------------------------------# def receive(self): """ Bisher wird nichts empfangen """ return ""