db系统预警联系人api 在我们维护系统时,需要把系统的报警信息即时传递给相应同学,如果把联系方式直接写到脚本里,对以后的维护变更将埋下祸根,尤其是成百上千的系统。 为此这里写了个获取联系人信息的api 数据库配置中心表: create table `db_alertconta
db系统预警联系人api
在我们维护系统时,需要把系统的报警信息即时传递给相应同学,如果把联系方式直接写到脚本里,对以后的维护变更将埋下祸根,尤其是成百上千的系统。
为此这里写了个获取联系人信息的api
数据库配置中心表:
create table `db_alertcontact` (`id` int(11) null default null,`levelid` int(11) null default null comment 'contact level',`contact` varchar(50) null default null comment 'email or phone information',`type` varchar(50) null default null comment 'phone/email',`username` varchar(100) null default null,`group` varchar(80) null default null comment 'contact group')collate='utf8_general_ci'engine=innodb;create table `db_alertlevel` (`id` int(11) null default null,`levelname` varchar(50) null default null comment 'info/warn/err')collate='utf8_general_ci'engine=innodb;
用法帮助:
[root@skatedb55 pytest]# python contactlist.py --helpusage: contanct api v0.1 ,(c) copyright skate 2014 [-h] --group group --typetype --level level[--interval interval][--load load]optional arguments:-h, --help show this help message and exit--group group = the contact group--type type = the mode of contact--level level = alarm level,info/warn/err--interval interval = database query interval(s)--load load = the configure center database,eg:load=user/pass@ip:port:dbname[root@skatedb55 pytest]#
例子:
insert into `db_alertcontact` (`id`, `levelid`, `contact`, `type`, `username`, `group`) values(1, 1, 'skate1@163.com', 'email', 'skate1', 'p1'),(2, 2, 'skate2@163.com', 'email', 'skate2', 'p2'),(3, 1, '1300000000', 'phone', 'skate3', 'p2'),(4, 1, '1311111111', 'phone', 'skate4', 'p2'),(5, 1, '1322222222', 'phone', 'skate5', 'p2'),(6, 2, 'skate6@163.com', 'email', 'skate6', 'p2');insert into `db_alertlevel` (`id`, `levelname`) values(1, 'info'),(2, 'warn'),(3, 'error');[root@skatedb55 pytest]# python contactlist.py --group=p2 --type=phone --level=info --interval=10--load=root/root@10.20.0.55:3306:test61300000000,1311111111,1322222222,[root@skatedb55 pytest]#[root@skatedb55 pytest]# python contactlist.py --group=p2 --type=email --level=warn --interval=10--load=root/root@10.20.0.55:3306:test6skate2@163.com,skate6@163.com,[root@skatedb55 pytest]#
优点:
1.在变更联系人或联系方式不需要修改代码
2.联系人的相关信息存储在配置中心数据库,为了减少对数据库的查询,默认每天查一次数据库(自己可以指定),把联系信息放在本地,既提高了速度,也减少了对配置中心的依赖
3.如果想在变更联系信息及时生效,只需把本地的临时文件/tmp/contact_dbinfo删除即可
contactlist.py:
# -*- coding: utf-8 -*-#!/usr/bin/python## author:skate# time:2014/12/10# function: contact apiimport mysqldb,sysimport argparseimport osimport datetimeclass database: def __int__(self,host,user,passwd,port,dbname): self.conn = none pass def conn(self,host,user,passwd,port,dbname): self.host=host self.user=user self.passwd=passwd self.port=port self.dbname=dbname try: self.conn = mysqldb.connect(host=self.host, user=self.user, passwd=self.passwd, db=self.dbname,port=self.port) except mysqldb.error, e: print mysql connect error: %s % (e.args[1]) return self.conn def closeconn(self): self.conn.close() def execute(self,sql,param): if self.conn==none or self.conn.open==false : return -1 sys.exit cur = self.conn.cursor() cur.execute(sql,param) self.closeconn() return curdef contactlist(group,type,level,host,user,passwd,port,dbname,interval=86400): tfile='/tmp/contact_dbinfo' list='' if os.path.isfile(tfile): a1=datetime.datetime.fromtimestamp(os.path.getctime(tfile)) a2=datetime.datetime.now() diffsec = (a2 - a1).seconds if diffsec > interval: os.remove(tfile) f=open(tfile,'a') db=database() db.conn(host,user,passwd,port,dbname) sql=select t.contact,t.username,t.group,t.`type`,l.levelname from db_alertcontact t , db_alertlevel l where t.levelid=l.id and l.levelname=%s and t.group=%s and t.`type`=%s param=(level,group,type) cur=db.execute(sql,param) results=cur.fetchall() for row in results: if row[3] =='phone': #for r in row: list = list + row[0] + ',' elif row[3] == 'email': #for r in row: list = list + row[0] + ',' if type =='phone': f.write('phonelist='+ group + ':' + list + '\n') f.close() elif type == 'email': f.write('emaillist='+ group + ':' +list + '\n') f.close() else: strsearch = type + 'list='+ group istype = os.popen('cat '+ tfile +' | grep ' + strsearch + ' | wc -l').readline().strip() if int(istype) > 0: line = os.popen('cat '+ tfile +' | grep ' + strsearch).readline().strip() b=line.split('=') a=b[1].split(:) if b[0]=='phonelist': list=a[1] elif b[0]=='emaillist': list=a[1] elif int(istype) < 1: f=open(tfile,'a') db=database() db.conn(host,user,passwd,port,dbname) sql=select t.contact,t.username,t.group,t.`type`,l.levelname from db_alertcontact t , db_alertlevel l where t.levelid=l.id and l.levelname=%s and t.group=%s and t.`type`=%s param=(level,group,type) cur=db.execute(sql,param) results=cur.fetchall() #list='' for row in results: if row[3] =='phone': list = list + row[0] + ',' elif row[3] == 'email': list = list + row[0] + ',' if type =='phone': f.write('phonelist='+ group + ':' + list + '\n') f.close() elif type == 'email': f.write('emaillist='+ group + ':' + list + '\n') f.close() else: f=open(tfile,'a') db=database() db.conn(host,user,passwd,port,dbname) sql=select t.contact,t.username,t.group,t.`type`,l.levelname from db_alertcontact t , db_alertlevel l where t.levelid=l.id and l.levelname=%s and t.group=%s and t.`type`=%s param=(level,group,type) cur=db.execute(sql,param) results=cur.fetchall() for row in results: if row[3] =='phone': #for r in row: list = list + row[0] + ',' elif row[3] == 'email': #for r in row: list = list + row[0] + ',' if type =='phone': f.write('phonelist='+ group + ':' + list + '\n') f.close() elif type == 'email': f.write('emaillist='+ group + ':' + list + '\n') f.close() return listif __name__ == __main__: parser = argparse.argumentparser(contanct api v0.1 ,(c) copyright skate 2014) parser.add_argument('--group', action='store', dest='group',required=true, help= = the contact group) parser.add_argument('--type', action='store', dest='type',required=true, help= = the mode of contact) parser.add_argument('--level', action='store', dest='level',required=true, help= = alarm level,info/warn/err) parser.add_argument('--interval', action='store', dest='interval',type=int,default=86400, help= = database query interval) parser.add_argument('--load', action='store', dest='load',default='', help= = the configure center database,eg: \n load=user/pass@ip:port:dbname) results = parser.parse_args() load = results.load group = results.group type = results.type level = results.level interval = results.interval if (load !=''): user_info,url = load.split(@) host,port,db = url.split(:) port=int(port) user,passwd = user_info.split(/,1) str = contactlist(group,type,level,host,user,passwd,port,db,interval) print str
大家有好的意见,欢迎提出
------end-------