#!/bin/env python # -*- coding:utf-8 -*- """ Смотрим на транки и шлет письмо о разрегистрации""" ## Флаг для sip reload NEED_RELOAD=0 ## Кому слать письсмо. Используется внутренний релей. Адресов может быть несколько в списке. TO_EMAIL=[ 'support@line24.ru'] ## Тема письма ALARM_SUBJECT='SIP Trunk registration problem' HOSTBASH='HOSTNAME24' #TRUNKS=[ "00062553","00017685" ] ## Пауза перед релодом. После паузы делает релоад и проверяет еще раз и затем шлет письмо . TIMEOUT_RELOAD=5 FROM_ADDRESS='root@localhost' import subprocess,time,re,sys import MySQLdb #sys.dont_write_bytecode ### Пароль берется из amportal.conf . Можно заменить. В других версиях пересено на коннектор odbc/ class DbMysql(object): def __init__(self): f=open('/etc/amportal.conf') CONF={} for i in f.readlines(): try: CONF[i.split('=')[0].strip()]=i.split('=')[1].strip() except IndexError: continue f.close() self.host = CONF['AMPDBHOST'] self.db = CONF['AMPDBNAME'] self.username = CONF['AMPDBUSER'] self.password = passwd=CONF['AMPDBPASS'] self.connect() def connect(self): try: self.conn = MySQLdb.connect(host=self.host, user=self.username, passwd=self.password, db=self.db) except MySQLdb.Error, e: print "Error %d: %s" % (e.args[0], e.args[1]) sys.exit (1) def getone(self, sql): cursor = self.conn.cursor () try: cursor.execute(sql) except MySQLdb.Error, e: print "Error %d: %s" % (e.args[0], e.args[1]) result_set = cursor.fetchone() cursor.close() return result_set def closeConnect(self): self.conn.close() def get_trunks(filename='/etc/asterisk/sip_registrations.conf'): f=open(filename) REGS=f.readlines() f.close() regs=re.compile(r"^register=(?P[\d\w]+)\S+@(.*/(?P.*)|.*)") for i in REGS: r=regs.search(i) if r: yield r.groupdict() def get_hostname(file_bash='/root/.bashrc',HOSTBASH='HOSTNAME24'): """Определяем название хоста относительно продуктов Линии24""" m=re.compile(r'^%s\s?=\s?(.*)$' % HOSTBASH) try: o=open(file_bash,'r') for i in o.readlines(): m_=m.match(i.strip()) if m_: o.close() return m_.group(1) except IOError: import socket return socket.gethostname() def sip_trunk_show_unregs(_trunks): TRUNKS=_trunks[:] if not TRUNKS: yield None p=subprocess.Popen('/usr/sbin/asterisk -rx "sip show registry"',shell=True,stdout=subprocess.PIPE) REGS=p.stdout.readlines() for y in REGS: c=1 for i in TRUNKS: if i in y and 'Registered' in y: TRUNKS.remove(i) break elif i in y and "Registered" not in y: TRUNKS.remove(i) yield i def get_trunk_name(id,conn): """ SELECT trunks.name from trunks WHERE trunkid = (SELECT REPLACE(id,'tr-peer-','') FROM `sip` WHERE data='00092611' AND keyword='username'); """ query=""" SELECT trunks.name from trunks WHERE trunkid = (SELECT REPLACE(id,'tr-peer-','') FROM `sip` WHERE data='%s' AND keyword IN ('username','defaultuser') LIMIT 1); """ % id res=conn.getone(query) if res: return res[0] else: return '...' def get_alarm(): ALARM_TRUNK=[] for UNREGS in sip_trunk_show_unregs(TRUNKS): if UNREGS: ALARM_TRUNK.append(UNREGS) return ALARM_TRUNK def try_sip_reload(): subprocess.Popen("/usr/sbin/asterisk -rx 'sip reload'",shell=True,stdout=None) time.sleep(TIMEOUT_RELOAD) def sendmail24(body,emails,from_addr='root@localhost',subj=ALARM_SUBJECT,mail_server_port=25,mail_server='localhost'): """Отправляем почту с телом body""" import smtplib header = 'From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n' % (from_addr,','.join(emails),subj) msg=header + body s = smtplib.SMTP(mail_server, mail_server_port) s.sendmail(from_addr,emails, msg) s.quit() if __name__ == '__main__': TRUNKS=[ x['id'] for x in get_trunks() ] NUMBERS={} NUMBERS.update([(x['id'],x['num']) for x in get_trunks()]) ALARM=get_alarm() conn=DbMysql() if ALARM: SUBJ='[%s] : %s' % (get_hostname(),ALARM_SUBJECT) body="Перестал(и) регистрироваться транк(и) : %s \r\n\n" % len(ALARM) for i in ALARM: body+=" - %(id)s (%(num)s) : %(trunk_name)s - без регистрации\r\n" % {'id':i,'num':NUMBERS[i],'trunk_name':get_trunk_name(i,conn)} if NEED_RELOAD: body+="\r\n\nПробуем перерегистрироваться....\r\r\n" try_sip_reload() ALARM=get_alarm() body+="Состояние через %d секунд...\r\n" % TIMEOUT_RELOAD if ALARM: for i in ALARM: body+=" - %(id)s (%(num)s) - без регистрации\r\n" % {'id':i,'num':NUMBERS[i]} else: body+="Все транки зарегестрировались заново...\r\nВмешательство не нужно\r\n" sendmail24(body,TO_EMAIL,subj=SUBJ,from_addr=FROM_ADDRESS) conn.closeConnect()