Add initial linux support
This commit is contained in:
		
							
								
								
									
										12
									
								
								ippigeon.py
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								ippigeon.py
									
									
									
									
									
								
							@@ -41,6 +41,16 @@ if win32:
 | 
			
		||||
    _, username = res.strip().rsplit("\n", 1)
 | 
			
		||||
    userid, sysdom = username.rsplit("\\", 1)
 | 
			
		||||
 | 
			
		||||
if linux:
 | 
			
		||||
    sysid = hex(uuid.getnode())
 | 
			
		||||
    #fprint(sysid)
 | 
			
		||||
    datafile += sysid
 | 
			
		||||
    datafile += "gendata.csv"
 | 
			
		||||
    res = subprocess.check_output(["who",], universal_newlines=True)
 | 
			
		||||
    userid = res.strip().split(" ")[0]
 | 
			
		||||
    sysdom = subprocess.check_output(["hostname",], universal_newlines=True)
 | 
			
		||||
    #fprint(hostname)
 | 
			
		||||
 | 
			
		||||
def netstat_done(res):
 | 
			
		||||
    fprint("netstat done, processing")
 | 
			
		||||
    procdata_res = pool.apply_async(netstat.process, (res,), callback=process_done)
 | 
			
		||||
@@ -114,7 +124,7 @@ class Logger(object):
 | 
			
		||||
            sleep(0)
 | 
			
		||||
        
 | 
			
		||||
    def flush(self):
 | 
			
		||||
        print("")
 | 
			
		||||
        print("",end="")
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    freeze_support() # required if packaged into single EXE
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										0
									
								
								keyfile-admin.pem
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										0
									
								
								keyfile-admin.pem
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
								
								
									
										50
									
								
								netstat.py
									
									
									
									
									
								
							
							
						
						
									
										50
									
								
								netstat.py
									
									
									
									
									
								
							@@ -1,8 +1,9 @@
 | 
			
		||||
from util import find_data_file
 | 
			
		||||
from util import setup_child
 | 
			
		||||
from util import fprint
 | 
			
		||||
from util import run_ps
 | 
			
		||||
from util import run_cmd
 | 
			
		||||
from util import win32
 | 
			
		||||
from util import linux
 | 
			
		||||
import util
 | 
			
		||||
import time
 | 
			
		||||
import csv
 | 
			
		||||
@@ -69,12 +70,55 @@ def process(data):
 | 
			
		||||
            writer.writerows(output2)
 | 
			
		||||
        fprint("done creating csv")
 | 
			
		||||
    
 | 
			
		||||
    if linux:
 | 
			
		||||
        output = data.stdout.decode().split('\n') # split stdout into lines
 | 
			
		||||
        output = [i for i in output if i]
 | 
			
		||||
        if output[0].find("Not all processes could be identified") >= 0:
 | 
			
		||||
            fprint("Not enough permissions")
 | 
			
		||||
            raise PermissionError("Unable to acquire netstat data without admin!")
 | 
			
		||||
        output2 = list()
 | 
			
		||||
        for line in output:
 | 
			
		||||
            string_split = line.split(" ")
 | 
			
		||||
            string_split = [i for i in string_split if i]
 | 
			
		||||
            #fprint("Input: " + str(string_split))
 | 
			
		||||
 | 
			
		||||
            if string_split[0].find("Active") >= 0 or string_split[0].find("Proto") >= 0:
 | 
			
		||||
                continue
 | 
			
		||||
            
 | 
			
		||||
            if len(string_split) == 6: # no connection status
 | 
			
		||||
                #fprint(string_split)
 | 
			
		||||
                string_split.append(string_split[-1])
 | 
			
		||||
                string_split[-2] = "UNKNOWN"
 | 
			
		||||
                #fprint(string_split)
 | 
			
		||||
            
 | 
			
		||||
            procname = string_split[6]
 | 
			
		||||
            if procname != "-":
 | 
			
		||||
                string_split2 = procname.split("/")
 | 
			
		||||
                procname = string_split2[1]
 | 
			
		||||
                pid = string_split2[0]
 | 
			
		||||
            else:
 | 
			
		||||
                pid = "Unknown"
 | 
			
		||||
            
 | 
			
		||||
            output2.append([procname, string_split[0], string_split[3], string_split[4], string_split[5], pid]) 
 | 
			
		||||
        #fprint(output2)
 | 
			
		||||
        
 | 
			
		||||
        with open(find_data_file(util.datafile), "w", newline="") as f:
 | 
			
		||||
            writer = csv.writer(f)
 | 
			
		||||
            writer.writerows(output2)
 | 
			
		||||
        fprint("done creating csv")
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
def start():
 | 
			
		||||
    fprint("netstat started")
 | 
			
		||||
    setup_child()
 | 
			
		||||
    fprint("netstat started")
 | 
			
		||||
    
 | 
			
		||||
    if win32:
 | 
			
		||||
        data = run_ps("netstat -n -o -b")
 | 
			
		||||
        data = run_cmd("netstat -n -o -b")
 | 
			
		||||
        fprint("data acquired")
 | 
			
		||||
        return data
 | 
			
		||||
 | 
			
		||||
    if linux:
 | 
			
		||||
        data = run_cmd("netstat -atunpw")
 | 
			
		||||
        fprint("data acquired")
 | 
			
		||||
        return data
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										28230
									
								
								output.log
									
									
									
									
									
								
							
							
						
						
									
										28230
									
								
								output.log
									
									
									
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										4
									
								
								requirements.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								requirements.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
			
		||||
fabric
 | 
			
		||||
paramiko
 | 
			
		||||
wxpython
 | 
			
		||||
cx_Freeze
 | 
			
		||||
							
								
								
									
										7
									
								
								setup.py
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								setup.py
									
									
									
									
									
								
							@@ -12,10 +12,15 @@ base = None
 | 
			
		||||
if sys.platform == "win32" and not debug:
 | 
			
		||||
    base = "Win32GUI"
 | 
			
		||||
 | 
			
		||||
if sys.platform == "linux" or sys.platform == "linux2" or sys.platform == "darwin":
 | 
			
		||||
    name = "IPPigeon"
 | 
			
		||||
else:
 | 
			
		||||
    name = "IPPigeon.exe"
 | 
			
		||||
 | 
			
		||||
setup(
 | 
			
		||||
    name="IP Pigeon",
 | 
			
		||||
    version="0.2.4",
 | 
			
		||||
    description="IP Pigeon client application",
 | 
			
		||||
    options={"build_exe": build_exe_options},
 | 
			
		||||
    executables=[Executable("ippigeon.py", base=base, icon="icon.ico", uac_admin=True, target_name="IPPigeon.exe")],
 | 
			
		||||
    executables=[Executable("ippigeon.py", base=base, icon="icon.ico", uac_admin=True, target_name=name)],
 | 
			
		||||
)
 | 
			
		||||
@@ -7,6 +7,7 @@ from sys import platform
 | 
			
		||||
import sys
 | 
			
		||||
from util import find_data_file
 | 
			
		||||
from util import fprint
 | 
			
		||||
from util import setup_child
 | 
			
		||||
 | 
			
		||||
TRAY_TOOLTIP = 'IP Pigeon' 
 | 
			
		||||
 | 
			
		||||
@@ -67,9 +68,11 @@ class TaskbarApp(wx.App):
 | 
			
		||||
        frame=wx.Frame(None)
 | 
			
		||||
        self.SetTopWindow(frame)
 | 
			
		||||
        TaskBarIcon(frame)
 | 
			
		||||
        
 | 
			
		||||
        return True
 | 
			
		||||
 | 
			
		||||
def background(data, sets, kill):
 | 
			
		||||
    setup_child()
 | 
			
		||||
    global killme
 | 
			
		||||
    global settings
 | 
			
		||||
    global displaydata
 | 
			
		||||
@@ -77,6 +80,10 @@ def background(data, sets, kill):
 | 
			
		||||
    app = TaskbarApp(False)
 | 
			
		||||
    displaydata = data
 | 
			
		||||
    settings = sets
 | 
			
		||||
    fprint("Creating taskbar icon")
 | 
			
		||||
    app.MainLoop()
 | 
			
		||||
        
 | 
			
		||||
TRAY_ICON = find_data_file('icon.png')
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
    background(list(), dict(), int())
 | 
			
		||||
							
								
								
									
										94
									
								
								taskbartool2.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								taskbartool2.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,94 @@
 | 
			
		||||
#!/usr/bin/env pythonw
 | 
			
		||||
 | 
			
		||||
import wx
 | 
			
		||||
import wx.adv
 | 
			
		||||
import wx.lib.embeddedimage
 | 
			
		||||
 | 
			
		||||
WXPdemo = wx.lib.embeddedimage.PyEmbeddedImage(
 | 
			
		||||
    "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAWlJ"
 | 
			
		||||
    "REFUWIW1V1sSwjAIBMebeBU9db2KZ8EPmxbCI4TUnXGskWaXDQktwhjErjERP4XRhER08iPi"
 | 
			
		||||
    "5SKiyQR5JyI7xxB3j7wn5GI6V2hFxM0gJtjYANFBiIjQu7L/1lYlwR0QxLDZhE0II1+CtwRC"
 | 
			
		||||
    "RI8riBva7DL7CC9VAwDbbxwKtdDXwBi7K+1zCP99T1vDFedd8FBwYd6BCAUXuACEF7QsbET/"
 | 
			
		||||
    "FaHs+gDQw4vOLNHkMojAnTw8nlNipIiwmR0DCXJbjCXkFCAL23BnpQgRWt1EMbyujCK9AZzZ"
 | 
			
		||||
    "f+b3sX0oSqJQ6EorFeT4NiL6Wtj0+LXnQAzThYoAAsN6ehqR3sHExmcEqGeFApQLcTvm5Kt9"
 | 
			
		||||
    "wkHGgb+RZwSkyc1dwOcpCtCoNKSz6FRCUQ3o7Nn+5Y+Lg+y5CIXlcyAk99ziiQS32+svz/UY"
 | 
			
		||||
    "vClJoLpIC8gi+VwwfDecEiEtT/WZTJDf94uk1Ru8vbz0cvoF7S2DnpeVL9UAAAAASUVORK5C"
 | 
			
		||||
    "YII=")
 | 
			
		||||
 | 
			
		||||
class DemoTaskBarIcon(wx.adv.TaskBarIcon):
 | 
			
		||||
    TBMENU_RESTORE = wx.NewId()
 | 
			
		||||
    TBMENU_CLOSE   = wx.NewId()
 | 
			
		||||
    TBMENU_CHANGE  = wx.NewId()
 | 
			
		||||
    TBMENU_REMOVE  = wx.NewId()
 | 
			
		||||
    
 | 
			
		||||
    def __init__(self, frame):
 | 
			
		||||
        wx.adv.TaskBarIcon.__init__(self)
 | 
			
		||||
        self.frame = frame
 | 
			
		||||
 | 
			
		||||
        # Set the image
 | 
			
		||||
        icon = self.MakeIcon(WXPdemo.GetImage())
 | 
			
		||||
        self.SetIcon(icon, "wxPython Demo")
 | 
			
		||||
        self.imgidx = 1
 | 
			
		||||
        
 | 
			
		||||
        # bind some events
 | 
			
		||||
        self.Bind(wx.adv.EVT_TASKBAR_LEFT_DCLICK, self.OnTaskBarActivate)
 | 
			
		||||
        self.Bind(wx.EVT_MENU, self.OnTaskBarActivate, id=self.TBMENU_RESTORE)
 | 
			
		||||
        self.Bind(wx.EVT_MENU, self.OnTaskBarClose, id=self.TBMENU_CLOSE)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def CreatePopupMenu(self):
 | 
			
		||||
        """
 | 
			
		||||
        This method is called by the base class when it needs to popup
 | 
			
		||||
        the menu for the default EVT_RIGHT_DOWN event.  Just create
 | 
			
		||||
        the menu how you want it and return it from this function,
 | 
			
		||||
        the base class takes care of the rest.
 | 
			
		||||
        """
 | 
			
		||||
        menu = wx.Menu()
 | 
			
		||||
        menu.Append(self.TBMENU_RESTORE, "Restore wxPython Demo")
 | 
			
		||||
        menu.Append(self.TBMENU_CLOSE,   "Close wxPython Demo")
 | 
			
		||||
        return menu
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def MakeIcon(self, img):
 | 
			
		||||
        """
 | 
			
		||||
        The various platforms have different requirements for the
 | 
			
		||||
        icon size...
 | 
			
		||||
        """
 | 
			
		||||
        if "wxMSW" in wx.PlatformInfo:
 | 
			
		||||
            img = img.Scale(16, 16)
 | 
			
		||||
        elif "wxGTK" in wx.PlatformInfo:
 | 
			
		||||
            img = img.Scale(22, 22)
 | 
			
		||||
        # wxMac can be any size upto 128x128, so leave the source img alone....
 | 
			
		||||
        icon = wx.Icon("icon.png")
 | 
			
		||||
        #self.SetIcon(icon, TRAY_TOOLTIP)
 | 
			
		||||
        return icon
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    def OnTaskBarActivate(self, evt):
 | 
			
		||||
        if self.frame.IsIconized():
 | 
			
		||||
            self.frame.Iconize(False)
 | 
			
		||||
        if not self.frame.IsShown():
 | 
			
		||||
            self.frame.Show(True)
 | 
			
		||||
        self.frame.Raise()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def OnTaskBarClose(self, evt):
 | 
			
		||||
        wx.CallAfter(self.frame.Close)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class MainFrame(wx.Frame):
 | 
			
		||||
    def __init__(self, parent):
 | 
			
		||||
        wx.Frame.__init__(self, parent, title="Hello World")
 | 
			
		||||
        self.tbicon = DemoTaskBarIcon(self)
 | 
			
		||||
        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
 | 
			
		||||
 | 
			
		||||
    def OnCloseWindow(self, evt):
 | 
			
		||||
        self.tbicon.Destroy()
 | 
			
		||||
        evt.Skip()
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
app = wx.App(redirect=False)
 | 
			
		||||
frame = MainFrame(None)
 | 
			
		||||
frame.Show(True)
 | 
			
		||||
app.MainLoop()
 | 
			
		||||
							
								
								
									
										27
									
								
								util.py
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								util.py
									
									
									
									
									
								
							@@ -25,6 +25,16 @@ if win32:
 | 
			
		||||
    _, username = res.strip().rsplit("\n", 1)
 | 
			
		||||
    userid, sysdom = username.rsplit("\\", 1)
 | 
			
		||||
 | 
			
		||||
if linux:
 | 
			
		||||
    sysid = hex(uuid.getnode())
 | 
			
		||||
    #fprint(sysid)
 | 
			
		||||
    datafile += sysid
 | 
			
		||||
    datafile += "gendata.csv"
 | 
			
		||||
    res = subprocess.check_output(["who",], universal_newlines=True)
 | 
			
		||||
    userid = res.strip().split(" ")[0]
 | 
			
		||||
    sysdom = subprocess.check_output(["hostname",], universal_newlines=True)
 | 
			
		||||
    #fprint(hostname)
 | 
			
		||||
 | 
			
		||||
def time():
 | 
			
		||||
    return int(t.time())
 | 
			
		||||
 | 
			
		||||
@@ -35,12 +45,12 @@ def fprint(msg):
 | 
			
		||||
        frm = inspect.stack()[1]
 | 
			
		||||
        
 | 
			
		||||
        mod = inspect.getmodule(frm[0])
 | 
			
		||||
        print('[' + mod.__name__ + ":" + frm.function + ']:', msg)
 | 
			
		||||
        print('[' + mod.__name__ + ":" + frm.function + ']:', str(msg))
 | 
			
		||||
    except Exception as e:
 | 
			
		||||
        try:
 | 
			
		||||
            print('[????:' + frm.function + ']:', msg)
 | 
			
		||||
            print('[????:' + frm.function + ']:', str(msg))
 | 
			
		||||
        except:
 | 
			
		||||
            print('[????]:', msg)
 | 
			
		||||
            print('[????]:', str(msg))
 | 
			
		||||
        
 | 
			
		||||
        
 | 
			
		||||
   # else:
 | 
			
		||||
@@ -56,8 +66,7 @@ def find_data_file(filename):
 | 
			
		||||
        datadir = os.path.dirname(__file__)
 | 
			
		||||
    return os.path.join(datadir, filename)
 | 
			
		||||
 | 
			
		||||
def run_ps(cmd):
 | 
			
		||||
    fprint("init PS")
 | 
			
		||||
def run_cmd(cmd):
 | 
			
		||||
    if win32:
 | 
			
		||||
        startupinfo = subprocess.STARTUPINFO()
 | 
			
		||||
        #print("DICKS")
 | 
			
		||||
@@ -72,7 +81,11 @@ def run_ps(cmd):
 | 
			
		||||
        completed = subprocess.run(["powershell", "-Command", cmd], capture_output=True, startupinfo=startupinfo)
 | 
			
		||||
        fprint("ran PS command successfully")
 | 
			
		||||
        #completed = subprocess.run(["powershell", "-WindowStyle", "hidden", "-Command", cmd], capture_output=True, startupinfo=startupinfo)
 | 
			
		||||
    
 | 
			
		||||
        return completed
 | 
			
		||||
    if linux:
 | 
			
		||||
        fprint("running sh command: " + cmd)
 | 
			
		||||
        completed = subprocess.run(["sh", "-c", cmd], capture_output=True)
 | 
			
		||||
        fprint("ran sh command successfully")
 | 
			
		||||
        return completed
 | 
			
		||||
 | 
			
		||||
def setup_child():
 | 
			
		||||
@@ -95,4 +108,4 @@ class Logger(object):
 | 
			
		||||
            sleep(0)
 | 
			
		||||
        
 | 
			
		||||
    def flush(self):
 | 
			
		||||
        print("")
 | 
			
		||||
        print("", end="")
 | 
			
		||||
		Reference in New Issue
	
	Block a user