wxpython窗体小程序,按公司要求修改IP

#!/usr/bin/env python
# encoding: utf-8
'''
Created on 2017年5月22日

@author: pengdj
'''
import wx
import os
import socket 
import fcntl
import struct 
import re
import sys
import libvirt
import subprocess

class ZopleNoteBook(wx.Notebook):
    def __init__(self, parent):
        wx.Notebook.__init__(self, parent, -1,
                    size = (21,21), style = wx.BK_DEFAULT)
        
        networkPanel = NetworkPanel(self)
        aboutPanel = ablouPanel(self)
        TaemPanel=TAEMPanel(self)
        self.AddPage(aboutPanel, u'资源信息检测')
        self.AddPage(networkPanel, u'修改IP地址')
        #print TaemPanel._vm
        if (TaemPanel._vm.flags != 1):
            self.AddPage(TaemPanel, u'管理节点控制台')      
class SettingDialog(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, -1, u"太易管理工具", size = (600,900))
        panel = wx.Panel(self)
        #panel.SetBackgroundColour('#B3B2B3')
        
        sizer = wx.BoxSizer(wx.HORIZONTAL)

        
        nb = ZopleNoteBook(self)
        self.noteBook = nb
        
        mainSizer = wx.BoxSizer(wx.VERTICAL)
        mainSizer.Add(sizer, 0, flag = wx.EXPAND)
        mainSizer.AddSpacer(10)
        mainSizer.Add(nb, 1, flag = wx.EXPAND)

        sizer = wx.FlexGridSizer(cols = 2, hgap = 15, vgap = 20)
        mainSizer.AddSpacer(10)
        mainSizer.Add(sizer, 0, flag = wx.ALIGN_BOTTOM | wx.ALIGN_RIGHT)
        
        self.SetSizer(CreateCenterSizer(mainSizer, 10))

def CreateCenterSizer(win, gap):
    marginSizer = wx.FlexGridSizer(rows = 3, cols = 3)
    marginSizer.AddGrowableCol(1)
    marginSizer.AddGrowableRow(1)
    
    for i in range(0,4):
        marginSizer.AddSpacer(gap)

    marginSizer.Add(win, 0, wx.EXPAND)
    
    for i in range(0,4):
        marginSizer.AddSpacer(gap)
        
    return marginSizer

class NetworkPanel(wx.Panel):
    def __init__(self, parent):
        self._iface="br0"     
        self._gateway=os.popen("route -n|awk '/%s/{print $2}'|head -n 1" % self._iface).read().strip('\n')
        self._localip=os.popen("ifconfig %s |grep -w inet|awk '{print $2}'"% self._iface).read().strip('\n')
        #get_ip_address(self._iface)
        self._dns=os.popen("awk '/nameserver/ {print $2}' /etc/resolv.conf |head -n 1").read().strip('\n')
        wx.Panel.__init__(self, parent)
        
        mainSizer = wx.BoxSizer(wx.VERTICAL)
        
        midSizer = wx.BoxSizer(wx.HORIZONTAL)
        self.local_info=u'''系统信息列表 \n\t\n\t管理节点:192.168.1.253\n\t本机IP:%s\n\t网关:%s\n\tDNS:%s\n\t子网掩码:255.255.255.0''' %(self._localip,self._gateway,self._dns)
        self.infomation_label=wx.StaticText(self,-1,self.local_info)
      
        staticbox = wx.StaticBox(self, -1, u"静态地址设置")
        midSizer = wx.StaticBoxSizer(staticbox, wx.VERTICAL)
        sizer = wx.FlexGridSizer(cols = 2, hgap = 10, vgap = 15)
        sizer.AddGrowableCol(1)
        
        sizer.Add(wx.StaticText(self, -1, u"管理节点IP:"), 0, 
                  wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
        self.TAEM_IP_INPUT = wx.TextCtrl(self)
        sizer.Add(self.TAEM_IP_INPUT, 0, wx.EXPAND)
        
        sizer.Add(wx.StaticText(self, -1, u"IP地址:"), 0, 
                  wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
        self.local_ip_input = wx.TextCtrl(self)
        sizer.Add(self.local_ip_input, 0, wx.EXPAND)
        
        sizer.Add(wx.StaticText(self, -1, u"网络掩码:"), 0, 
                  wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
        self.MASK_INPUT = wx.TextCtrl(self)
        sizer.Add(self.MASK_INPUT, 0, wx.EXPAND)
        
        sizer.Add(wx.StaticText(self, -1, u"网关:"), 0, 
                  wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
        self.GATEWAY_IP_INPUT = wx.TextCtrl(self)
        sizer.Add(self.GATEWAY_IP_INPUT, 0, wx.EXPAND)
        
        sizer.Add(wx.StaticText(self, -1, u"DNS:"), 0, 
                  wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
        self.DNS_INPUT = wx.TextCtrl(self)
        sizer.Add(self.DNS_INPUT, 0, wx.EXPAND)

        self.button_box=wx.BoxSizer(wx.HORIZONTAL)
        self.btn_ok = wx.Button(self, wx.ID_OK, u'确定')
        self.btn_cancel = wx.Button(self, wx.ID_CANCEL, u'取消')
        self.button_box.Add(self.btn_ok, 0)
        self.button_box.Add(self.btn_cancel,0)
        
        self.Message_label=wx.StaticText(self,-1,'')  
        
        midSizer.Add(CreateCenterSizer(sizer, 10), 1, wx.EXPAND)        
        
        mainSizer.Add(self.infomation_label)
        mainSizer.AddSpacer(5)
        mainSizer.Add(midSizer, 0, wx.EXPAND)
        mainSizer.Add(self.button_box,0)
        mainSizer.Add(self.Message_label,0)
        
               
        self.Bind(wx.EVT_BUTTON, self.OnClick_Modify, self.btn_ok)
        self.Bind(wx.EVT_BUTTON, self.OnClicK_Quit, self.btn_cancel)       
        self.SetSizer(CreateCenterSizer(mainSizer, 10))
        
    def OnSave(self):
        pass
    def OnClick_Modify(self,event):
        if (not self.DNS_INPUT.GetValue()):
            self._DNS=self.GATEWAY_IP_INPUT.GetValue()
        else:
            self._DNS=self.DNS_INPUT.GetValue()
        if (not self.MASK_INPUT.GetValue()):
            self._MASK="255.255.255.0"
        else:
            self._MASK=self.MASK_INPUT.GetValue()
        self._LOCAL_IP=self.local_ip_input.GetValue()
        self._GATEWAY=self.GATEWAY_IP_INPUT.GetValue()
        self._TAEM_IP=self.TAEM_IP_INPUT.GetValue()
        if ( self.local_ip_input.GetValue() and  self.GATEWAY_IP_INPUT.GetValue() and  self.TAEM_IP_INPUT.GetValue()):
            while 1:                
                if (not ipFormatChk(self._TAEM_IP)):
                    self.Message_label.SetLabel(u"请输入正确的管理节点IP")
                    break
                if (not ipFormatChk(self._LOCAL_IP)):
                    self.Message_label.SetLabel(u"请输入正确的本机IP")
                    break
                if (not ipFormatChk(self._GATEWAY)):
                    self.Message_label.SetLabel(u"请输入正确的网关")
                    break                
                if (not ipFormatChk(self._DNS)):
                    self.Message_label.SetLabel(u"请输入正确的DNS地址或者不输入默认使用网关")
                    break
                if (not ipFormatChk(self._MASK)):
                    self.Message_label.SetLabel(u"请输入正确的掩码地址或者不输入使用默认的255.255.255.0")
                    break
                self.Message_label.SetLabel(u"参数正确")
                Modify_Do(self._LOCAL_IP,self._TAEM_IP,self._GATEWAY,self._DNS,self._MASK)
                sys.exit()
        else:
            self.Message_label.SetLabel(u"请讲必须添加的参数不全,管理节点IP,网关,本机IP")
    def OnClicK_Quit(self,event):
        sys.exit()

class ablouPanel(wx.Panel):
    def __init__(self,parent):
        wx.Panel.__init__(self, parent)
        about_mainSizer = wx.BoxSizer(wx.VERTICAL)
        sizer = wx.BoxSizer(wx.VERTICAL)
        
        self.cpu_staticbox = wx.StaticBox(self, -1, u"cpu信息")
        self.cpu_midSizer = wx.StaticBoxSizer(self.cpu_staticbox, wx.VERTICAL)
        self.cpu_sizer = wx.FlexGridSizer(cols = 2, hgap = 5, vgap = 10)
        self.cpu_sizer.AddGrowableCol(1)
        
        self.cpu_sizer.Add(wx.StaticText(self, -1, u"CPU厂商:"), 0, 
                  wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL)
        self.cpu_chip = wx.StaticText(self,-1,os.popen("awk -F: '/model name/{print $NF}' /proc/cpuinfo |head -n 1").read().strip("\n"))
        self.cpu_sizer.Add(self.cpu_chip, 0, wx.EXPAND)
        
        self.cpu_sizer.Add(wx.StaticText(self, -1, u"cpu核数:"), 0, 
                  wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL)
        self.cpu_core= wx.StaticText(self,-1,os.popen("awk -F: '/cpu cores/{print $NF}' /proc/cpuinfo|head -n 1").read().strip("\n"))
        self.cpu_sizer.Add(self.cpu_core, 0, wx.EXPAND)
        
        self.cpu_sizer.Add(wx.StaticText(self, -1, u"CPU总线程数:"), 0, 
                  wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL)
        self.cpu_process= wx.StaticText(self,-1,os.popen("grep process /proc/cpuinfo |wc -l").read().strip("\n"))
        self.cpu_sizer.Add(self.cpu_process, 0, wx.EXPAND)       
        
        self.cpu_sizer.Add(wx.StaticText(self, -1, u"当前主频:"), 0, 
                  wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL)
        self.cpu_curt_GHZ = wx.StaticText(self,-1,u'')
        self.cpu_sizer.Add(self.cpu_curt_GHZ, 0, wx.EXPAND)
        self.cpu_midSizer.Add(CreateCenterSizer(self.cpu_sizer, 10), 1, wx.EXPAND)
        
        self.timer=wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
        self._cpu_label=wx.StaticText(self,1,u"CPU使用率:",size=(200,20))
	self._cpu_label_stat=wx.StaticText(self,1,u"%usr %sys %iowait %idle",size=(200,20))
        self._cpu_stat=wx.StaticText(self,1,"",size=(200,20))
        self._cpu_air=wx.StaticText(self,1, u"CPU温度:",size=(200,20))
        self._cpu_air_stat=wx.StaticText(self,1, u"",size=(200,20))
        self._mem_label=wx.StaticText(self,1,u"内存使用率:",size=(200,20))
        self._mem_stat=wx.StaticText(self,1,"",size=(200,20))

        self._part_label=wx.StaticText(self,1,u"磁盘分使用情况:")
        self._part_stat=wx.StaticText(self,1,u"",size=(200,200),style=wx.TE_MULTILINE|wx.TE_RICH2)  
        
        self._disk_label=wx.StaticText(self,1,u"磁盘读写情况:")
        self._disk_stat=wx.StaticText(self,1,u"",size=(200,150),style=wx.TE_MULTILINE|wx.TE_RICH2)  
        sizer.Add(self._cpu_label, 1, wx.EXPAND)
	sizer.Add(self._cpu_label_stat, 1, wx.EXPAND)
        sizer.Add(self._cpu_stat, 1, wx.EXPAND)
        sizer.Add(self._cpu_air, 1, wx.EXPAND)
        sizer.Add(self._cpu_air_stat, 1, wx.EXPAND)
        sizer.Add(self._mem_label, 1, wx.EXPAND)
        sizer.Add(self._mem_stat, 1, wx.EXPAND)   
        about_staticbox = wx.StaticBox(self, -1, u"网络测试")
        about_midSizer = wx.StaticBoxSizer(about_staticbox, wx.VERTICAL)
        
        ping_sizer = wx.FlexGridSizer(cols = 2, hgap = 10, vgap = 15)
        ping_sizer.AddGrowableCol(1)
        self.Ping_IP = wx.TextCtrl(self,size=(300,20))
        ping_sizer.Add(self.Ping_IP,0,wx.EXPAND)
        
        self.Ping_Button=wx.Button(self,-1,u"PING测试")
        self.Bind(wx.EVT_BUTTON,self.OnClicK_PING,self.Ping_Button) 
        ping_sizer.Add(self.Ping_Button,0,wx.ALIGN_BOTTOM|wx.ALIGN_RIGHT)
        

        self._message_info=wx.StaticText(self,-1,u'',(20,20))
        
        about_midSizer.Add(CreateCenterSizer(ping_sizer, 10), 1, wx.EXPAND) 
        
        about_mainSizer.Add(self.cpu_midSizer,0,wx.EXPAND)
        about_mainSizer.Add(sizer,0,wx.EXPAND)
        about_mainSizer.Add(self._part_label,0,wx.EXPAND)
        about_mainSizer.Add(self._part_stat,0,wx.EXPAND)
        about_mainSizer.Add(self._disk_label,0,wx.EXPAND)
        about_mainSizer.Add(self._disk_stat,0,wx.EXPAND)
        about_mainSizer.Add(about_midSizer,0,wx.EXPAND)
        about_mainSizer.Add(self._message_info,0,wx.EXPAND)

        self.SetSizer(CreateCenterSizer(about_mainSizer, 10))
        
        self.OnStart(None)
    def OnStart(self, event ):  
        self.timer.Start(1000)

    def OnTimer(self, evt):#显示时间事件处理函数      
        cpu_stat=os.popen("mpstat |tail -n 1|awk '{print $4,$6,$7,$NF}'").read()	
        mem_stat=os.popen("top -bi -n 1|grep -w Mem|head -n 1").read()
        part_stat=os.popen("df -h |grep -v tmpfs|awk '{print $1,$2,$3,$4,$5,$6}'").read()
        cpu_air=os.popen("sensors|awk '/Physical id 0/{print $4}'|sed 's/+//'").read()
        disk_stat=os.popen("iostat -x |grep -A20 Device |awk '{print $1,$2,$3,$10,$NF}'").read()   
        currt_cpu_ghz=os.popen("""cpupower  frequency-info|grep "current CPU"|awk '{print $5$6}'|head -n 1""").read().strip("\n")
	self._cpu_stat.SetLabel(cpu_stat)
        self.cpu_curt_GHZ.SetLabel(currt_cpu_ghz)
        self._cpu_air_stat.SetLabel(cpu_air)
        self._mem_stat.SetLabel(mem_stat)
        self._part_stat.SetLabel(part_stat)
        self._disk_stat.SetLabel(disk_stat)
    def OnClicK_PING(self,event):
        PING_IP=self.Ping_IP.GetValue()
        if (ipFormatChk(PING_IP)):
            p_cmd="ping -c 4 -w 10 %s " % PING_IP
            p=subprocess.Popen(p_cmd,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
            p_result=p.stdout.read()
            p_regex=re.findall("100% packet loss",p_result)
            if (len(p_regex)==0):
                self._message_info.SetLabel(u"本机到达%s质量良好" % PING_IP)
            else:
                self._message_info.SetLabel(u"本机到达%s网络不可达" % PING_IP)
        else:
            self._message_info.SetLabel(u"请输入正确的IP地址")
    def OnChar(self, event):
        pass
    def OnSave(self):
        pass
class TAEMPanel(wx.Panel):
    def __init__(self,parent):
       
        wx.Panel.__init__(self, parent)
        self._vm=MGRVM()
        self._vm_hbox=wx.BoxSizer(wx.VERTICAL)
        self._vm_sizer=wx.BoxSizer(wx.HORIZONTAL)
                
        self._vm_button2=wx.Button(self,10,u'关机')
        self._vm_button=wx.Button(self,20,u'开机')
        self.Bind(wx.EVT_BUTTON,self.vmDestroy,self._vm_button2)
        self.Bind(wx.EVT_BUTTON,self.vmStart,self._vm_button)
        
        self._vm_sizer.Add(self._vm_button,0)
        self._vm_sizer.Add(self._vm_button2,0)
        self._vm_hbox.Add(self._vm_sizer,0,wx.EXPAND)
        self.SetSizer(CreateCenterSizer(self._vm_hbox,10))

    def vmStart(self,event):
        self._vm.dom0.create()
        
    def vmDestroy(self,event):
        self._vm.dom0.destroy()
    
    def vmReboot(self,event):
        self._vm.dom0.reboot()
        
class MGRVM():
    def __init__(self):
        try:
            #conn=libvirt.open('qemu+ssh://192.168.1.249/system')     
            conn=libvirt.open('qemu:///system')  
            self.dom0=conn.lookupByName('TAE-Manager')
            self.flags=0
        except:
            self.flags=1
        
def ipFormatChk(ips):
   pattern = r"\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"
   if re.match(pattern, ips):
      return True
   else:
      return False

def get_ip_address(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(
        s.fileno(),
        0x8915,  # SIOCGIFADDR
        struct.pack('256s', ifname[:15]))[20:24])
def Modify_Do(Ip,Taem,Gateway,Dns,Mask):
    CMD1='''sed -i "s/^IPADDR.*$/IPADDR=%s/g" /etc/sysconfig/network-scripts/ifcfg-br0''' % Ip
    CMD2='''sed -i "s/^GATEWAY.*$/GATEWAY=%s/g" /etc/sysconfig/network-scripts/ifcfg-br0''' % Gateway
    CMD3='''sed -i "s/^NETMASK.*$/NETMASK=%s/g" /etc/sysconfig/network-scripts/ifcfg-br0''' % Mask
    CMD4='''sed -i "s/^Server=.*$/Server=127.0.0.1,%s/g" /etc/zabbix/zabbix_agentd.conf''' % Taem
    CMD5='''sed -i "s/^ServerActive=.*$/ServerActive=127.0.0.1,%s/g" /etc/zabbix/zabbix_agentd.conf''' % Taem
    CMD6='''sed -i "s/^SERVER_IP=.*$/SERVER_IP=%s/g" /home/teraee/.bash_profile'''% Taem
    CMD7='''echo nameserver %s > /etc/resolv.conf''' % Dns
    CMD8="systemctl stop NetworkManager;ifdown br0; ifup br0"
    print CMD1
    print CMD2
    print CMD3
    print CMD4
    print CMD5
    print CMD6
    print CMD7
    '''
    os.system(CMD1)
    os.system(CMD2)
    os.system(CMD3)
    os.system(CMD4)
    os.system(CMD5)
    os.system(CMD6)
    os.system(CMD7)
    os.system(CMD8)
'''            
class MYAPP(wx.App):
    def OnInit(self):
        frame=SettingDialog(None)
        frame.Show(True)
        return True
def main():
    app=MYAPP()
    app.MainLoop()
    #app.MainLoop()
if __name__=="__main__":
    main()

  其中用到了 定时器: 动态显示内存cpu信息 

posted @ 2017-06-09 15:15  不会游泳的鱼pdj  阅读(313)  评论(1编辑  收藏  举报