DB系统预警联系人API--python实现
在我们维护系统时,需要把系统的报警信息即时传递给相应同学,如果把联系方式直接写到脚本里,对以后的维护变更将埋下祸根,尤其是成百上千的系统。为此这里写了个获取联系人信息的API 。
数据库配置中心表:
1CREATE TABLE `db_alertcontact` (
2 `id` INT(11) NULL DEFAULT NULL,
3 `levelid` INT(11) NULL DEFAULT NULL COMMENT 'contact level',
4 `contact` VARCHAR(50) NULL DEFAULT NULL COMMENT 'email or phone information',
5 `type` VARCHAR(50) NULL DEFAULT NULL COMMENT 'phone/email',
6 `username` VARCHAR(100) NULL DEFAULT NULL,
7 `group` VARCHAR(80) NULL DEFAULT NULL COMMENT 'contact group'
8)
9COLLATE='utf8_general_ci'
10ENGINE=InnoDB;
11CREATE TABLE `db_alertlevel` (
12 `id` INT(11) NULL DEFAULT NULL,
13 `levelname` VARCHAR(50) NULL DEFAULT NULL COMMENT 'info/warn/err'
14)
15COLLATE='utf8_general_ci'
16ENGINE=InnoDB;
用法帮助:
1[root@skatedb55 pytest]# python contactlist.py --help
2usage: Contanct API v0.1 ,(C) Copyright Skate 2014 [-h] --group GROUP --type
3 TYPE --level LEVEL
4 [--interval INTERVAL]
5 [--load LOAD]
6optional arguments:
7 -h, --help show this help message and exit
8 --group GROUP = The contact group
9 --type TYPE = The mode of contact
10 --level LEVEL = alarm level,info/warn/err
11 --interval INTERVAL = Database query interval(s)
12 --load LOAD = The configure center database,eg:
13 load=user/pass@ip:port:dbname
14[root@skatedb55 pytest]#
例子:
1INSERT INTO `db_alertcontact` (`id`, `levelid`, `contact`, `type`, `username`, `group`) VALUES
2 (1, 1, '[email protected]', 'email', 'skate1', 'p1'),
3 (2, 2, '[email protected]', 'email', 'skate2', 'p2'),
4 (3, 1, '1300000000', 'phone', 'skate3', 'p2'),
5 (4, 1, '1311111111', 'phone', 'skate4', 'p2'),
6 (5, 1, '1322222222', 'phone', 'skate5', 'p2'),
7 (6, 2, '[email protected]', 'email', 'skate6', 'p2');
8INSERT INTO `db_alertlevel` (`id`, `levelname`) VALUES
9 (1, 'info'),
10 (2, 'warn'),
11 (3, 'error');
12[root@skatedb55 pytest]# python contactlist.py --group=p2 --type=phone --level=info --interval=10--load=root/[email protected]:3306:test6
131300000000,1311111111,1322222222,
14[root@skatedb55 pytest]#
15[root@skatedb55 pytest]# python contactlist.py --group=p2 --type=email --level=warn --interval=10--load=root/[email protected]:3306:test6
16[email protected],[email protected],
17[root@skatedb55 pytest]#
优点:
1.在变更联系人或联系方式不需要修改代码
2.联系人的相关信息存储在配置中心数据库,为了减少对数据库的查询,默认每天查一次数据库(自己可以指定),把联系信息放在本地,既提高了速度,也减少了对配置中心的依赖
3.如果想在变更联系信息及时生效,只需把本地的临时文件”/tmp/contact_dbinfo”删除即可
1# -*- coding: utf-8 -*-
2#!/usr/bin/python
3#
4# Author:Skate
5# Time:2014/12/10
6# Function: Contact API
7import MySQLdb,sys
8import argparse
9import os
10import datetime
11class database:
12 def __int__(self,host,user,passwd,port,dbname):
13 self.conn = None
14 pass
15 def conn(self,host,user,passwd,port,dbname):
16 self.host=host
17 self.user=user
18 self.passwd=passwd
19 self.port=port
20 self.dbname=dbname
21 try:
22 self.conn = MySQLdb.connect(host=self.host, user=self.user, passwd=self.passwd, db=self.dbname,port=self.port)
23 except MySQLdb.Error, e:
24 print "MySQL Connect Error: %s" % (e.args[1])
25 return self.conn
26 def closeConn(self):
27 self.conn.close()
28 def execute(self,sql,param):
29 if self.conn==None or self.conn.open==False :
30 return -1
31 sys.exit
32 cur = self.conn.cursor()
33 cur.execute(sql,param)
34 self.closeConn()
35 return cur
36def contactlist(group,type,level,host,user,passwd,port,dbname,interval=86400):
37 tfile='/tmp/contact_dbinfo'
38 list=''
39 if os.path.isfile(tfile):
40 a1=datetime.datetime.fromtimestamp(os.path.getctime(tfile))
41 a2=datetime.datetime.now()
42 diffsec = (a2 - a1).seconds
43 if diffsec > interval:
44 os.remove(tfile)
45 f=open(tfile,'a')
46 db=database()
47 db.conn(host,user,passwd,port,dbname)
48 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"
49 param=(level,group,type)
50 cur=db.execute(sql,param)
51 results=cur.fetchall()
52 for row in results:
53 if row[3] =='phone':
54 #for r in row:
55 list = list + row[0] + ','
56 elif row[3] == 'email':
57 #for r in row:
58 list = list + row[0] + ','
59 if type =='phone':
60 f.write('phonelist='+ group + ':' + list + '\n')
61 f.close()
62 elif type == 'email':
63 f.write('emaillist='+ group + ':' +list + '\n')
64 f.close()
65 else:
66 strsearch = type + 'list='+ group
67 istype = os.popen('cat '+ tfile +' | grep ' + strsearch + ' | wc -l').readline().strip()
68 if int(istype) > 0:
69 line = os.popen('cat '+ tfile +' | grep ' + strsearch).readline().strip()
70 b=line.split('=')
71 a=b[1].split(":")
72 if b[0]=='phonelist':
73 list=a[1]
74 elif b[0]=='emaillist':
75 list=a[1]
76 elif int(istype) < 1:
77 f=open(tfile,'a')
78 db=database()
79 db.conn(host,user,passwd,port,dbname)
80 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"
81 param=(level,group,type)
82 cur=db.execute(sql,param)
83 results=cur.fetchall()
84 #list=''
85 for row in results:
86 if row[3] =='phone':
87 list = list + row[0] + ','
88 elif row[3] == 'email':
89 list = list + row[0] + ','
90 if type =='phone':
91 f.write('phonelist='+ group + ':' + list + '\n')
92 f.close()
93 elif type == 'email':
94 f.write('emaillist='+ group + ':' + list + '\n')
95 f.close()
96 else:
97 f=open(tfile,'a')
98 db=database()
99 db.conn(host,user,passwd,port,dbname)
100 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"
101 param=(level,group,type)
102 cur=db.execute(sql,param)
103 results=cur.fetchall()
104 for row in results:
105 if row[3] =='phone':
106 #for r in row:
107 list = list + row[0] + ','
108 elif row[3] == 'email':
109 #for r in row:
110 list = list + row[0] + ','
111 if type =='phone':
112 f.write('phonelist='+ group + ':' + list + '\n')
113 f.close()
114 elif type == 'email':
115 f.write('emaillist='+ group + ':' + list + '\n')
116 f.close()
117 return list
118if __name__ == "__main__":
119 parser = argparse.ArgumentParser("Contanct API v0.1 ,(C) Copyright Skate 2014")
120 parser.add_argument('--group', action='store', dest='group',required=True,
121 help=" = The contact group")
122 parser.add_argument('--type', action='store', dest='type',required=True,
123 help=" = The mode of contact")
124 parser.add_argument('--level', action='store', dest='level',required=True,
125 help=" = alarm level,info/warn/err")
126 parser.add_argument('--interval', action='store', dest='interval',type=int,default=86400,
127 help=" = Database query interval")
128 parser.add_argument('--load', action='store', dest='load',default='',
129 help=" = The configure center database,eg: \n load=user/pass@ip:port:dbname")
130 results = parser.parse_args()
131 load = results.load
132 group = results.group
133 type = results.type
134 level = results.level
135 interval = results.interval
136 if (load !=''):
137 user_info,url = load.split("@")
138 host,port,db = url.split(":")
139 port=int(port)
140 user,passwd = user_info.split("/",1)
141 str = contactlist(group,type,level,host,user,passwd,port,db,interval)
142 print str
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/python-db-contact-api/4230.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.