Author:Skate

Time:2014/12/16

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 --help

usage: Contanct API v0.1 ,(C) Copyright Skate 2014 [-h] --group GROUP --type

                                                   TYPE --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:test6

1300000000,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:test6

skate2@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 API import MySQLdb,sys
import argparse
import os
import datetime class 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 cur def 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 list if __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-------

最新文章

  1. ASP.NET Core 中文文档 第四章 MVC(01)ASP.NET Core MVC 概览
  2. c++中static关键字的用法总结
  3. Oracle 截取字符串
  4. wildfly jboss deploy 报 拒绝访问
  5. Odoo Many2many 指定默认分组过滤
  6. Capacity Scheduler 队列设置
  7. HDU 5603 the soldier of love 离线+树状数组
  8. 【CF】283D Tennis Game
  9. Codeforces Round #205 (Div. 2) : D
  10. Unity3D开发类似保龄球游戏
  11. poj3928 la4329 pingpong
  12. 搬寝室(经典dp)
  13. php匹配图片、视频文件、音乐文件的正则表达式
  14. turtle文库 ——python
  15. oracle之数据恢复(delete误删)
  16. ionic3样例应用
  17. 利用SSH反向隧道,连接内网服务器
  18. Android定位&amp;地图&amp;导航——基于百度地图,实现自定义图标绘制并点击时弹出泡泡
  19. Second LearningConvolutionalNeuralNetworksforGraphs Experience
  20. laravel 登录后跳转原来浏览的页面

热门文章

  1. Attribute &quot;lazy&quot; with value &quot;true&quot; must have a value from the list &quot;false proxy no-proxy &quot;
  2. bootstrap中的Tooltips工具提示的使用问题
  3. Python成长笔记 - 基础篇 (一)python简介
  4. 用C写的俄罗斯方块游戏 By: hoodlum1980 编程论坛
  5. 针对httptest4net构建elasticsearch集群压力测试用例
  6. WinServer2008 R2搭建TFS2013小结(无法连接Internet手动安装)
  7. C# 中 async/await 调用传统 Begin/End 异步方法
  8. 冲刺阶段 day 6
  9. [WinAPI] API 9 [文件的删除、复制和移动功能]
  10. js继承精益求精之寄生式组合继承