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

los就是LineageOS,是一个基于Android面向智能手机以及平板电脑的开放源代码操作系统。los的前身为Cyanogenmod,通常称CM,是全球最大的安卓第三方编译团队,促进了用户的安卓版本的第三方升级,在早期曾经先于谷歌为很多手机定制了稳定版的安卓1.6,此后该团队的联合创始人及核心团队,重组了全新的LineageOS,继续为用户提供免费的第三方系统支持。

操作系统实现按名存取的关键在于解决文件名称与具体的物理地址的转换;实现逻辑文件到物理文件间的转换,即按名存取外存上的文件,按名存取实现文件的共享和保密,不同用户能在系统的控制下共享其他用户的文件。

SAP五大模块是:1、物料管理模块,主要有采购、库房与库存管理、供应商评价等管理功能;2、工厂维护模块,提供对定期维护、检查与服务管理的规划、控制和处理;3、质量管理模块,可提供质量计划、质量检测、质量控制、质量文档等功能;4、销售与分销模块,包括销售计划、询价报价、订单管理、运输发货、发票等的管理;5、生产计划模块,可实现对工厂数据、生产计划、能力计划、成本核算等的管理。

荣耀手机使用的是“Magic UI”、“EMUI”和“HarmonyOS”操作系统;荣耀的新机型采用的都是“Magic UI”系统,旧机型普遍使用的是基于安卓的EMUI系统,而部分机型支持升级为华为研发的HarmonyOS操作系统。

方法:1、在电脑桌面上,右击“计算机”,选择“属性”;2、在“系统”界面的“windows 版本”区域即可查看当前系统版本。2、使用“Win+R”快捷键,打开“运行”窗口,输入“winver”回车,在弹出的对话框中即可查看当前系统版本信息。

“funtouch os”是vivo基于安卓系统开发的智能手机操作系统;“funtouch os”是针对vivo公司中高端手机推出的一款人性化手机操作系统,该系统与2013年10月发布,以用户体验为核心,以简约、乐趣、智慧、理念为设计导向。

三星手机是安卓系统,只不过不是原生的安卓系统,而是原生安卓系统经过定制之后的系统,例如OneUI。OneUI是在2018年三星开发者大会上推出的全新基于安卓系统深度定制的用户界面,是三星和google合作进行研发的;可以同时运行在折叠屏产品上和非折叠屏产品上,通过交互的改进让两种不同形态的产品都有相近的操作体验。

Ghost的本质是对磁盘或者硬盘进行快速备份与还原;利用Ghost安装Windows系统最大的优点就是速度快而且一键安装,并且Ghost系统大多集成了大多数电脑所需要的驱动程序以及一些常用的应用软件。需要注意:1、通过网络下载到的Ghost系统,其预置的驱动程序与自己的电脑可能不兼容,会导致安装之后出现蓝屏而无法正常使用;2、Ghost系统捆绑安装的应用软件太多。


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Dreamweaver CS6
Alat pembangunan web visual

SecLists
SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

Pelayar Peperiksaan Selamat
Pelayar Peperiksaan Selamat ialah persekitaran pelayar selamat untuk mengambil peperiksaan dalam talian dengan selamat. Perisian ini menukar mana-mana komputer menjadi stesen kerja yang selamat. Ia mengawal akses kepada mana-mana utiliti dan menghalang pelajar daripada menggunakan sumber yang tidak dibenarkan.

EditPlus versi Cina retak
Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

mPDF
mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),
