python写的监控mysql主从的ap

发布时间:2019-09-12 08:00:01编辑:auto阅读(1399)

    1. #!/usr/bin/env python 
    2. # -*- coding: utf-8 -*- 
    3. #File:repl_wx.py 
    4. #creater:wangwei 
    5. import MySQLdb 
    6. import Queue,os,base64,time,sys,wx,threading 
    7. import ConfigParser,logging 
    8. from wx.lib.mixins.listctrl import ListCtrlAutoWidthMixin 
    9.  
    10.  
    11. class Repl: 
    12.     def __init__(self,user,passwd,host,hostname): 
    13.         self.user = user 
    14.         self.passwd = passwd 
    15.         self.host = host 
    16.         self.hostname = hostname 
    17.     def Slave(self,user,passwd,host,hostname): 
    18.         try
    19.             conn = MySQLdb.connect(host,user = self.user,passwd = self.passwd,connect_timeout = 2
    20.             cursor = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor)  
    21.             sql = "SHOW VARIABLES LIKE 'version'" 
    22.             cursor.execute(sql) 
    23.             alldata = cursor.fetchall() 
    24.             version = alldata[0]["Value"].split('.')[0
    25.             sql = "show slave status" 
    26.             cursor.execute(sql) 
    27.             alldata = cursor.fetchall() 
    28.             IO = alldata[0]["Slave_IO_Running"
    29.             SQL = alldata[0]["Slave_SQL_Running"
    30.             if version == "4"
    31.                 Errno = alldata[0]["Last_errno"
    32.                 Error = alldata[0]["Last_error"
    33.             else
    34.                 Errno = alldata[0]["Last_Errno"
    35.                 Error = alldata[0]["Last_Error"
    36.             cursor.close() 
    37.             conn.close() 
    38.             return IO,SQL,Errno,Error 
    39.         except
    40.             return 0,0,0,0 
    41.  
    42. class Check: 
    43.     def __init__(self,app,user,passwd,host,hostname): 
    44.         self.app=app 
    45.         self.user = user 
    46.         self.passwd = passwd 
    47.         self.host = host 
    48.         self.hostname = hostname 
    49.         boss = Repl(user,passwd,host,hostname) 
    50.         IO,SQL,Errno,Error = boss.Slave(self.user,self.passwd,self.host,self.hostname) 
    51.         self.IO = IO 
    52.         self.SQL = SQL 
    53.         self.Errno = Errno 
    54.         self.Error = Error 
    55.     def Status(self): 
    56.         now = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) 
    57.         if not self.IO and not self.SQL: 
    58.             errlist = [self.host,self.hostname,now,'Error:Can not Connect mysql!'
    59.             wx.CallAfter(self.app.ErrorMessage, errlist) 
    60.             a = self.hostname +  " " + self.host + " Can not Connect mysql DB!" 
    61.             logging.basicConfig(level=logging.DEBUG,format='%(asctime)s %(levelname)s %(message)s',datefmt='%Y-%m-%d %H:%M:%S',filename='slave.log',filemode='a'
    62.             logging.error(a) 
    63.             return 0 
    64.         if self.IO == "Yes"
    65.             if self.SQL == "Yes"
    66.                 #print now + " " + self.hostname + " OK -slave is running " + self.host 
    67.                 #errlist = [self.host,self.hostname,now,'OK -slave is running!'] 
    68.                 #wx.CallAfter(self.app.ErrorMessage, errlist) 
    69.                 return 0 
    70.             else
    71.                 #print now + " " + self.hostname + " Critical -slave SQL Error!" 
    72.                 errlist = [self.host,self.hostname,now,'Critical -slave SQL Error!'
    73.                 wx.CallAfter(self.app.ErrorMessage, errlist) 
    74.                 a = self.hostname +  " " + self.host + " Critical -slave SQL Error!" 
    75.                 logging.basicConfig(level=logging.DEBUG,format='%(asctime)s %(levelname)s %(message)s',datefmt='%Y-%m-%d %H:%M:%S',filename='slave.log',filemode='a'
    76.                 logging.error(a) 
    77.                 return 1 
    78.         else
    79.             if self.SQL == "Yes"
    80.                 #print now + " " + self.hostname + " Critical -slave IO Error!" 
    81.                 errlist = [self.host,self.hostname,now,'Critical -slave IO Error!'
    82.                 wx.CallAfter(self.app.ErrorMessage, errlist) 
    83.                 a = self.hostname +  " " + self.host + " Critical -slave IO Error!" 
    84.                 logging.basicConfig(level=logging.DEBUG,format='%(asctime)s %(levelname)s %(message)s',datefmt='%Y-%m-%d %H:%M:%S',filename='slave.log',filemode='a'
    85.                 logging.error(a) 
    86.                 return 2 
    87.             else
    88.                 #print now + " " + self.hostname + " Critical -slave IO and SQL Error!" 
    89.                 errlist = [self.host,self.hostname,now,'Critical -slave IO and SQL Error!'
    90.                 wx.CallAfter(self.app.ErrorMessage, errlist) 
    91.                 a = self.hostname +  " " + self.host + " Critical -slave IO and SQL Error!" 
    92.                 logging.basicConfig(level=logging.DEBUG,format='%(asctime)s %(levelname)s %(message)s',datefmt='%Y-%m-%d %H:%M:%S',filename='slave.log',filemode='a'
    93.                 logging.error(a) 
    94.                 return 3 
    95.  
    96. class StartScan(threading.Thread): 
    97.     def __init__(self,app): 
    98.         threading.Thread.__init__(self
    99.         self.app = app 
    100.         self.timeToQuit = threading.Event() 
    101.         self.timeToQuit.clear() 
    102.     def stop(self): 
    103.         self.timeToQuit.set() 
    104.     def run(self): 
    105.         self.user,self.passwd,self.hostlist,self.a,self.time = self.conf() 
    106.         self.times = 1 
    107.         while True
    108.             threads = [] 
    109.             if self.timeToQuit.isSet(): 
    110.                 break 
    111.             for i in range(self.a): 
    112.                 host = self.hostlist[i][0
    113.                 hostname = self.hostlist[i][1
    114.                 boss = Check(self,self.user,self.passwd,host,hostname) 
    115.                 t = threading.Thread(target=boss.Status,args=()) 
    116.                 threads.append(t) 
    117.             #print 'Total %s Threads is working...' %self.a + '\n' 
    118.             msg = u"第" + "%s"%(self.times) + u"次扫描....." 
    119.             self.app.CurrentScan(msg) 
    120.             for i in range(self.a): 
    121.                 threads[i].start() 
    122.                 time.sleep(0.05
    123.             for i in range(self.a): 
    124.                 threads[i].join() 
    125.             self.times += 1 
    126.             time.sleep(self.time) 
    127.     def CurrentScan(self,msg): 
    128.         wx.CallAfter(self.app.CurrentScan, msg) 
    129.     def conf(self): 
    130.         fp = ConfigParser.ConfigParser() 
    131.         fp.readfp(open('repl.ini')) 
    132.         iplist = fp.get("global""iplist"
    133.         user = fp.get("global""user"
    134.         passwd = fp.get("global""passwd"
    135.         time = fp.getint("global","time"
    136.         user = base64.decodestring(user) 
    137.         passwd = base64.decodestring(passwd) 
    138.         hostlist = [] 
    139.         for i in iplist.split(";"): 
    140.             hostlist.append(i.split(",")) 
    141.         a = len(hostlist) 
    142.         return user,passwd,hostlist,a,time 
    143.     def ErrorMessage(self,errlist): 
    144.         wx.CallAfter(self.app.ErrorMessage, errlist) 
    145.  
    146. class ScanUnit(wx.Panel): 
    147.     def __init__(self, parent,id=-1,title='',port='',): 
    148.         wx.Panel.__init__(self, parent,id) 
    149.         self.parent = parent 
    150.         self.id = id 
    151.         self.title = title 
    152.         self.scaning = wx.StaticText(self,-1,label=u"准备扫描……",style = wx.ALIGN_LEFT|wx.ST_NO_AUTORESIZE) 
    153.         self.openBtn=wx.Button(self,-1,u'打开日志'
    154.         self.openBtn.SetForegroundColour('red'
    155.         #self.openBtn.SetBackgroundColour('purple') 
    156.         self.startBtn=wx.Button(self,-1,u'扫描'
    157.         self.stopBtn=wx.Button(self,-1,u'停止'
    158.         self.stopBtn.Disable() 
    159.         self.list = AutoWidthListCtrl(self
    160.         self.list.SetTextColour("red"
    161.         self.list.InsertColumn(0'IP', width=120
    162.         self.list.InsertColumn(1, u'区组名称', width=100
    163.         self.list.InsertColumn(3, u'发生时间',width=140
    164.         self.list.InsertColumn(4, u'返回信息',width=200
    165.         self.list.DeleteAllItems() 
    166.         self.Bind(wx.EVT_BUTTON,self.OnStart,self.startBtn) 
    167.         self.Bind(wx.EVT_BUTTON,self.OnStop,self.stopBtn) 
    168.         self.Bind(wx.EVT_BUTTON,self.Open,self.openBtn) 
    169.         self._layout() 
    170.     def _layout(self):  #布局 
    171.         action = wx.BoxSizer(wx.HORIZONTAL) 
    172.         action.Add(self.scaning,3, wx.ALIGN_CENTER_HORIZONTAL|wx.EXPAND)#对齐没有解决 
    173.         action.Add(self.startBtn,1, wx.ALIGN_CENTER_VERTICAL|wx.EXPAND) 
    174.         action.Add(self.stopBtn,1, wx.ALIGN_CENTER_VERTICAL|wx.EXPAND) 
    175.         action.Add(self.openBtn,1, wx.ALIGN_CENTER_VERTICAL|wx.EXPAND) 
    176.         listbox = wx.BoxSizer(wx.HORIZONTAL) 
    177.         listbox.Add(self.list, 1, wx.EXPAND) 
    178.         self.box = wx.StaticBox(selfself.id, self.title,style = wx.SUNKEN_BORDER) 
    179.         self.ScanUnit = wx.StaticBoxSizer(self.box, wx.VERTICAL) 
    180.         self.ScanUnit.Add(action, 0, wx.ALL|wx.EXPAND, 2
    181.         self.ScanUnit.Add(listbox, 5, wx.EXPAND, 2
    182.         self.SetSizer(self.ScanUnit) 
    183.         self.parent.sizer.Add(self,1,wx.EXPAND) 
    184.     def OnStart(self,event): 
    185.         self.startBtn.Disable() 
    186.         self.stopBtn.Enable() 
    187.         #self.DeleteItems() 
    188.         self.thread=StartScan(self
    189.         self.thread.setDaemon(True
    190.         self.thread.start() 
    191.         self.scaning.SetLabel(u'正在扫描……'
    192.     def OnStop(self,event): 
    193.         self.stopBtn.Disable() 
    194.         self.startBtn.Enable() 
    195.         self.thread.stop() 
    196.         self.scaning.SetLabel(u'停止扫描……'
    197.     def Open(self,event): 
    198.         wx.Execute("notepad slave.log"
    199.         #os.system('notepad slave.log') 
    200.     def CurrentScan(self,msg): #当前扫描动作 
    201.         self.scaning.SetLabel(msg) 
    202.     def ErrorMessage(self,errlist):#错误信息 
    203.         index = self.list.InsertStringItem(sys.maxint, errlist[0]) 
    204.         self.list.SetStringItem(index, 1, errlist[1]) 
    205.         self.list.SetStringItem(index, 2, errlist[2]) 
    206.         self.list.SetStringItem(index, 3, errlist[3]) 
    207.         self.list.RefreshItem(index) 
    208.     def DeleteItems(self): 
    209.         self.list.DeleteAllItems() 
    210.  
    211. class AutoWidthListCtrl(wx.ListCtrl, ListCtrlAutoWidthMixin): 
    212.     def __init__(self, parent): 
    213.         wx.ListCtrl.__init__(self, parent, -1, style=wx.LC_REPORT|wx.LC_HRULES|wx.LC_VRULES) 
    214.         ListCtrlAutoWidthMixin.__init__(self
    215.  
    216. class MainPanel(wx.Panel): 
    217.     def __init__(self,parent): 
    218.         wx.Panel.__init__(self, parent) 
    219.         self.sizer = wx.GridSizer(rows=1,cols=1,hgap = 20,vgap = 15
    220.         self.aaa = ScanUnit(self,-1,u'<Mysql主从>','8001'
    221.         self.SetSizer(self.sizer) 
    222.  
    223. class CreateMenu():#创建菜单 
    224.     def __init__(self,parent): 
    225.         self.menuBar = wx.MenuBar() 
    226.         self.file = wx.Menu() 
    227.         self.close = self.file.Append(-1,u'退出(&X)'
    228.         self.menuBar.Append(self.file,u'文件(&F)'
    229.         self.help = wx.Menu() 
    230.         self.about = self.help.Append(-1,u'关于(&A)'
    231.         self.menuBar.Append(self.help,u'帮助(&H)'
    232.         parent.SetMenuBar(self.menuBar) 
    233.  
    234. class MyFrame(wx.App): 
    235.     u'''''Mysql主从监控\nE-mail:wangwei03@gyyx.cn\nQQ:83521260''' 
    236.     def OnInit(self): 
    237.         self.frame=wx.Frame(parent=None,id=-1,title=u'Mysql主从监控程序',size=(650,450)) 
    238.         self.frame.SetIcon(wx.Icon('kankan.ico', wx.BITMAP_TYPE_ICO)) 
    239.         self.panel = MainPanel(self.frame) 
    240.         self.frame.Center(direction=wx.BOTH) 
    241.         self.menu = CreateMenu(self.frame) 
    242.         self.frame.statusBar = self.frame.CreateStatusBar(3
    243.         #print dir(self.frame.statusBar) 
    244.         self.frame.statusBar.SetStatusWidths([-12,-12,-13])  
    245.         self.frame.statusBar.SetForegroundColour('purple'
    246.         self.frame.statusBar.SetBackgroundColour('pink'
    247.         self.frame.StatusBar.Font.Bold = True 
    248.         #self.frame.StatusBar.Font.Size = 13 
    249.         self.frame.StatusBar.SetStatusText(u"好好学习",0
    250.         self.frame.StatusBar.SetStatusText(u"天天向上",1
    251.         self.timer=wx.PyTimer(self.Notify) 
    252.         self.timer.Start(1000
    253.         self.Notify() 
    254.         self.Bind(wx.EVT_MENU,self.OnClose,self.menu.close) 
    255.         self.Bind(wx.EVT_MENU,self.OnAbout,self.menu.about) 
    256.         self.SetTopWindow(self.frame) 
    257.         self.frame.Show() 
    258.         return True 
    259.     def Notify(self): 
    260.         t = time.localtime(time.time()) 
    261.         st = time.strftime("%Y-%m-%d %H:%M:%S",t) 
    262.         self.frame.StatusBar.SetStatusText(u"当前系统时间  "+st,2
    263.     def OnClose(self,event): 
    264.         self.frame.Destroy() 
    265.     def OnAbout(self,event): 
    266.         wx.MessageBox(self.__doc__,'Mysql Replication Status',wx.OK) 
    267.  
    268. if __name__ == "__main__":  
    269.     app=MyFrame(None
    270.     app.MainLoop() 

    配置文件的名字为:repl.ini

    格式为:

    [global]
    user = cmVwbsdfsdfA==
    passwd = SGMxNzVBcEdEZ0ZRTGsfdfV6aA==
    time = 10
    iplist = 192.168.8.11,烟雨江南;192.168.8.12,开天辟地;
    #说明:用户名和密码#base64.encodestring(),base64.decodestring()加密和解密,time为设置的超时时间(单位为秒),iplist为IP和名字列表

    主要用于批量的mysql丛库服务器状态监控

关键字