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

猜你喜欢

转载自blog.csdn.net/sjfade/article/details/85157097