python wx模塊--編寫主機存活探測工具

  不說廢話,直接奔正題。

  python版本是python2.7,需要的模塊有argparse,easygui,wx。

 

  主界面如下圖(非常醜見諒!)

  代碼如下:

# !coding=gbk
#author:zichen

import wx, os
import easygui
import threading
import argparse 
from Queue import Queue
import pinger

class Host_is_alive_Frame(wx.Frame):
    def __init__(self):
        
        self.q = Queue()
        self.list_values = []
        self.count = 0
        self.gauge_value = 0
        self.sum = 1
        
        wx.Frame.__init__(self, None, -1, "主機存活探測工具".decode("gbk"), size=(600, 400), style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX)
        panel = wx.Panel(self, -1)
        wx.StaticText(panel, -1, "Ping:", pos=(4, 6))
        
        #########設置字體##########
        # font = wx.Font(12, wx.DECORATIVE, wx.NORMAL, wx.NORMAL)
        # ping_Label.SetFont(font)
        
        #################輸入文本框###################
        self.basicText = wx.TextCtrl(panel, -1, "127.0.0.1", pos=(35, 4), size=(160, -1))
        self.basicText.SetInsertionPoint(0)
        
        ############動態改變文本框的內容#################
        self.Bind(wx.EVT_TEXT_ENTER, self.bt_value, self.basicText) 
        
        ###########添加按鈕############
        self.button_add = wx.Button(panel, -1, "添加".decode("gbk"), pos=(200, 2), size=(40, -1))
        self.Bind(wx.EVT_BUTTON, self.On_add_Clik, self.button_add)
        self.button_add.SetDefault()
        
        ##########加載文件按鈕############
        self.button_load_file = wx.Button(panel, -1, "加載文件".decode("gbk"), pos=(245, 2), size=(80, -1))
        self.Bind(wx.EVT_BUTTON, self.On_load_file_Clik, self.button_load_file)
        self.button_load_file.SetDefault()
        
        ##############清除按鈕#############
        self.button_clear = wx.Button(panel, -1, "清除".decode("gbk"), pos=(330, 2), size=(80, -1))
        self.Bind(wx.EVT_BUTTON, self.On_clear_Clik, self.button_clear)
        self.button_clear.SetDefault()
        
        ##############下拉框###############
        wx.StaticText(panel, -1, "線程數:".decode("gbk"), pos=(415, 8))
        # thread_Label.SetFont(font)
        sampleList = ["10", "50", "100", "200", "500"]
        self.thread_num = wx.Choice(panel, -1, pos=(460, 4), choices=sampleList)
        
        ##############開始按鈕##############
        self.button_action = wx.Button(panel, -1, "開始探測".decode("gbk"), pos=(515, 2), size=(80, -1))
        self.Bind(wx.EVT_BUTTON, self.On_action_Clik, self.button_action)
        self.button_action.SetDefault()
        
        #################輸入文本框###################
        self.multiText1 = wx.TextCtrl(panel, -1, "", pos=(50, 50), size=(200, 270), style=wx.TE_MULTILINE)  # 創建一個文本控件
        self.multiText1.SetInsertionPoint(1)  # 設置插入點
        
        #################輸出文本框###################
        self.multiText2 = wx.TextCtrl(panel, -1, "", pos=(300, 50), size=(200, 270), style=wx.TE_MULTILINE)  # 創建一個文本控件
        self.multiText2.SetInsertionPoint(2)  # 設置插入點
        
        #################進度條##################
        self.gauge_text = wx.StaticText(panel, -1, "進度條:".decode("gbk"), pos=(0, 343))
        self.gauge = wx.Gauge(panel, -1, 100, pos=(45, 340), size=(500, 25))
        self.gauge.SetBezelFace(3)
        self.gauge.SetShadowWidth(3)
        self.Bind(wx.EVT_IDLE, self.OnIdle)
        self.info = wx.TextCtrl(panel, -1, "0%".decode("gbk"), pos=(550, 345), style=wx.TE_READONLY | wx.TE_MULTILINE | wx.BORDER_NONE | wx.BRUSHSTYLE_TRANSPARENT)
        self.info.SetBackgroundColour(panel.BackgroundColour)
        
    # 進度條函數    
    def OnIdle(self, event):
        self.gauge_value = self.count * 100 / self.sum
        print "self.gauge_value:" + str(self.gauge_value)
        self.gauge.SetValue(self.gauge_value)
        # self.gauge.Update()
        self.info.SetValue(str(self.gauge_value) + "%")
        # self.info.Update()
        
    # 添加按鈕函數
    def On_add_Clik(self, event):
        self.button_add.SetLabel("添加".decode("gbk"))
        #######隊列去重#######
        if self.bt_value() not in self.list_values:
            self.list_values.append(self.bt_value())
            if self.multiText1.GetValue() == "":
                self.multiText1.SetValue(self.bt_value())
            else:
                self.multiText1.AppendText("\n" + self.bt_value())
        else:
            # 消息對話框
            dlg = wx.MessageDialog(None, '輸入的內容有重複的值,已自動去重'.decode("gbk"), '警告'.decode("gbk"), wx.OK | wx.ICON_QUESTION)
            dlg.ShowModal()
            dlg.Destroy()

    # 加載文件按鈕函數
    def On_load_file_Clik(self, event):
        self.button_load_file.SetLabel("加載文件".decode("gbk"))
        file_path = easygui.fileopenbox(default='*.txt')
        with open(file_path) as old_file:
            os.path.basename(file_path)
            text = old_file.read()
            if "\r" in text:
                temp_lists = (text.split("\r"))
            elif "\n" in text:
                temp_lists = (text.split("\n"))
            else:
                pass
            for temp_list in temp_lists:
                if temp_list not in self.list_values:
                    self.list_values.append(temp_list)
                    if self.multiText1.GetValue() == "":
                        self.multiText1.SetValue(temp_list)
                    else:
                        self.multiText1.AppendText("\n" + temp_list)
                else:
                    # 消息對話框
                    dlg = wx.MessageDialog(None, '輸入的內容有重複的值,已自動去重'.decode("gbk"), '警告'.decode("gbk"), wx.OK | wx.ICON_QUESTION)
                    dlg.ShowModal()
                    dlg.Destroy()
    
    # 清除文本框1的函數
    def On_clear_Clik(self, event):
        self.multiText1.Clear()
        self.list_values = []
        self.count = 0
    
    # 執行探測函數
    def On_action_Clik(self, event):
        self.button_action.SetLabel("開始探測".decode("gbk"))
        # 清除文本框2
        self.multiText2.Clear()
        
        thread_nums = self.thread_num.GetStringSelection()
        for list_value in self.list_values:
            self.q.put(str(list_value))
        # 開始多線程
        if thread_nums == "":
            thread_nums = "10"
            dlg = wx.MessageDialog(None, '已將線程數默認設置成10'.decode("gbk"), '警告'.decode("gbk"), wx.OK | wx.ICON_QUESTION)
            dlg.ShowModal()
            dlg.Destroy()
        threads = []
        for thread_num in range(0, int(thread_nums)):
            threads.append(threading.Thread(target=self.thread_ping, args=(thread_num,)))
            
        for thread in threads:
            thread.start()

    # 多線程函數           
    def thread_ping(self, num):
        while True:
            if not self.q.empty():
                str_value = self.q.get()
                self.sum = len(self.list_values)
                self.count = self.count + 1
                """執行ping命令
                ping_echo = os.popen("ping " + str_value + " -n 1")
                content = ping_echo.read()
                if "TTL" in content:
                    print str_value
                    if self.multiText2.GetValue()=="":
                        self.multiText2.SetValue(str_value)
                    else:    
                        self.multiText2.AppendText("\r" + str_value)"""
                # stock編程 使用了s0nnet編寫的程序
                parser = argparse.ArgumentParser(description='Python ping')
                parser.add_argument('--target-host', action="store", dest="target_host", required=True)
                given_args = '--target-host'  
                target_host = str_value
                pinger_value = pinger.Pinger(target_host=target_host)
                flag = pinger_value.ping()
                if True == flag:
                    if self.multiText2.GetValue() == "":
                        self.multiText2.SetValue(str_value)
                        self.multiText2.Update()
                    else:    
                        self.multiText2.AppendText("\r" + str_value)
                        self.multiText2.Update()
                continue
            # panel.Update()
            break
    
    # 返回輸入框的值            
    def bt_value(self):
        return self.basicText.GetValue()


if __name__ == '__main__':
    app = wx.App(False)
    frame = Host_is_alive_Frame()
    frame.Show()
    app.MainLoop()

pinger的程序是採用的GitHub 的s0nnet寫icmp  stock編程鏈接如下(這裏感謝一下s0nnet):

https://github.com/Lingerhk/hacking_script/blob/master/net_attacking/icmp_ping_tool.py

有部分地方改動了一下:

ICMP_ECHO_REQUEST = 8  # Platform specific
DEFAULT_TIMEOUT = 0.3
DEFAULT_COUNT = 1

 

    def ping(self):
        """
        Run the ping process
        """
        for i in xrange(self.count):
            # print "Ping to %s..." % self.target_host,
            try:
                delay = self.ping_once()
            except socket.gaierror, e:
                # print "Ping failed. (socket error: '%s')" % e[1]
                return False
                break
     
            if delay == None:
                # print "Ping failed. (timeout within %ssec.)" % self.timeout
                return False
            else:
                # 輸出主機存活的信息
                # delay = delay * 1000
                # print "Get pong in %0.4fms" % delay
                return True

 

  wx,光是界面的調整就浪費了我很多時間,我接下來就不會深入的學習wx,如果有人對wx感興趣的話,可以查看wx的中文文檔,下載鏈接如下:

https://pan.baidu.com/s/1jX6W2au_aAZdSjqS4jy2rA

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章