zoukankan      html  css  js  c++  java
  • DB系统预警联系人API

    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 + '
    ')
                   f.close()
               elif type == 'email':
                   f.write('emaillist='+ group + ':' +list + '
    ')
                   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 + '
    ')
                           f.close()
                      elif type == 'email':
                           f.write('emaillist='+  group + ':' + list + '
    ')
                           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 + '
    ')
                   f.close()
               elif type == 'email':
                   f.write('emaillist='+  group + ':' + list + '
    ')
                   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: 
     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-------

  • 相关阅读:
    电脑无损换硬盘,不用重装系统驱动的小技巧
    OSPF协议原理及配置5-LSA分析
    OSPF协议原理及配置3-邻居关系的建立
    OSPF协议原理及配置2-理解邻居和邻接关系
    我在华为写代码
    嵌入式未来发展
    blog to live,do not love to blog
    浮点数转换为新类型时必须做范围检查
    分享点干货
    基础C语言知识串串香14☞增补知识
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5411067.html
Copyright © 2011-2022 走看看