From e496e6c4c59f912464ddc4dbedc06a7e433f4f0c Mon Sep 17 00:00:00 2001 From: Cole Deck Date: Tue, 15 Nov 2022 19:25:14 -0600 Subject: [PATCH] add macos initial support, ui changes --- config.yml | 2 +- ippigeon.py | 10 ++--- netstat.py | 44 ++++++++++++++++++++ panel.py | 118 ++++++++++++++++++++++++++++++++++++---------------- util.py | 4 +- 5 files changed, 134 insertions(+), 44 deletions(-) diff --git a/config.yml b/config.yml index 14ca7d3..e248712 100644 --- a/config.yml +++ b/config.yml @@ -1,7 +1,7 @@ core: autostart: true clockspeed: 20 - interval: 10 + interval: 5 level: 2 localadmin: true sftp: diff --git a/ippigeon.py b/ippigeon.py index 20f1f67..991c05d 100644 --- a/ippigeon.py +++ b/ippigeon.py @@ -48,7 +48,7 @@ if win32: _, username = res.strip().rsplit("\n", 1) userid, sysdom = username.rsplit("\\", 1) -if linux: +if linux or macos: sysid = hex(uuid.getnode()) #fprint(sysid) datafile += sysid @@ -154,11 +154,11 @@ def mainloop(pool): if settings["continueui"] == True: settings["continueui"] = False - if ppanel is not None: + #if ppanel is not None: # login panel is already open - ppanel.terminate() - ppanel = Process(target=panel.openwindow, args=(displaydata,settings,killme)) - ppanel.start() + # ppanel.terminate() + # ppanel = Process(target=panel.openwindow, args=(displaydata,settings,killme)) + # ppanel.start() if settings["showui"] == True: settings["showui"] = False diff --git a/netstat.py b/netstat.py index b13220e..828141e 100644 --- a/netstat.py +++ b/netstat.py @@ -4,6 +4,7 @@ from util import fprint from util import run_cmd from util import win32 from util import linux +from util import macos import util import time import csv @@ -107,6 +108,44 @@ def process(data): writer = csv.writer(f) writer.writerows(output2) fprint("done creating csv") + + if macos: + output = data.stdout.decode().split('\n') # split stdout into lines + #output = data.stdout.decode().split(',') + #fprint("output data: " + str(output)) + 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() + output2.append([util.sysid, util.userid, util.sysdom, util.time()]) # add metadata + 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[1].find("Multipath") >= 0: + break + if string_split[0].find("Active") >= 0 or string_split[0].find("Proto") >= 0: + continue + + if len(string_split) == 10: # no connection status + #fprint(string_split) + string_split.append(string_split[-1]) + string_split[-7] = "UNKNOWN" + string_split[-4] = string_split[-5] + #fprint(string_split) + + + + output2.append(["Unknown", string_split[0], string_split[3], string_split[4], string_split[5], string_split[8]]) + #fprint("FINAL CSV: " + str(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(): @@ -123,3 +162,8 @@ def start(): fprint("data acquired") return data + if macos: + data = run_cmd("netstat -anv") + fprint("data acquired") + return data + diff --git a/panel.py b/panel.py index cb5dfbc..ba40f35 100644 --- a/panel.py +++ b/panel.py @@ -40,7 +40,7 @@ class OtherFrame(wx.Frame): Class used for creating frames other than the main one """ def __init__(self): - wx.Frame.__init__(self, None, -1, 'Server Panel', size=(1000, 620)) + wx.Frame.__init__(self, None, -1, 'Server Panel', size=(1000, 675)) panel = ServerPanel(self) self.SetIcon(wx.Icon(find_data_file("icon.ico"), wx.BITMAP_TYPE_ICO)) @@ -101,6 +101,9 @@ class LoginPanel(wx.Panel): settings["username"] = basicText.GetValue() settings["password"] = pwdText.GetValue() settings["login"] = True + #self.Destroy() + self.Close() + self.Parent.Close() #OtherFrame() def on_help(self, event): @@ -142,7 +145,9 @@ class ServerPanel(wx.Panel): super().__init__(parent, size=(500, 500)) #self.SetBackgroundColour((44, 51, 51)) self.main_sizer = wx.BoxSizer(wx.VERTICAL) - secondary_sizer = wx.BoxSizer(wx.HORIZONTAL) + self.secondary_sizer = wx.BoxSizer(wx.HORIZONTAL) + self.sub_sizer_left = wx.BoxSizer(wx.VERTICAL) + self.sub_sizer_right = wx.BoxSizer(wx.VERTICAL) self.row_obj_dict = {} self.list_ctrl = wx.ListCtrl( self, size=(-1, 400), @@ -159,49 +164,81 @@ class ServerPanel(wx.Panel): else: txt = "Status: Not running" + if settings["loggedin"] == True: + logintxt = "Logged in" + else: + logintxt = "Not logged in" self.statustext = wx.StaticText(self, label=txt) # pos=(20,20)) + self.logintext = wx.StaticText(self, label=logintxt) # pos=(20,20)) #self.main_sizer.Add(tb) #main_sizer.SetBackgroundColour((44, 51, 51)) # self.pnl1.SetBackgroundColour(wx.BLACK) self.handle_columns() #self.updatedata() - wx.CallAfter(self.updatedata) - wx.GetApp().ProcessPendingEvents() self.main_sizer.Add(self.list_ctrl, 0, wx.ALL | wx.EXPAND, 20) - start_button = wx.Button(self, label='Start IPPigeon') - start_button.SetBackgroundColour((205, 215, 206)) - start_button.Bind(wx.EVT_BUTTON, self.on_start) + self.main_sizer.Add(self.secondary_sizer, 0, wx.ALL | wx.EXPAND, 20) + self.secondary_sizer.Add(self.sub_sizer_left, 0, wx.ALL | wx.CENTER, 20) + self.secondary_sizer.Add(self.sub_sizer_right, 0, wx.ALL | wx.CENTER, 20) + self.start_button = wx.Button(self, label='Start IPPigeon') + self.start_button.SetBackgroundColour((205, 215, 206)) + self.start_button.Bind(wx.EVT_BUTTON, self.on_start) #start_button.Bind(wx.EVT_ENTER_WINDOW, self.on_start) - stop_button = wx.Button(self, label='Stop IPPigeon') - stop_button.SetBackgroundColour('#F08080') - - secondary_frame_button = wx.Button(self, label='Settings') - secondary_frame_button.Bind(wx.EVT_BUTTON, self.on_window) + self.stop_button = wx.Button(self, label='Stop IPPigeon') + self.stop_button.SetBackgroundColour('#F08080') + self.secondary_frame_button = wx.Button(self, label='Settings') + self.secondary_frame_button.Bind(wx.EVT_BUTTON, self.on_window) # wx.BORDER(stop_button, wx.BORDER_NONE) - stop_button.Bind(wx.EVT_BUTTON, self.on_stop) - self.main_sizer.Add(self.statustext, 0, wx.CENTER | wx.ALL | 100, 5) - self.main_sizer.Add(start_button, 0, wx.CENTER | wx.ALL | 100, 5) - self.main_sizer.Add(stop_button, 0, wx.CENTER | wx.ALL | 100, 5) - self.main_sizer.Add(secondary_frame_button, 0, wx.CENTER | wx.ALL | 100, 5) + self.stop_button.Bind(wx.EVT_BUTTON, self.on_stop) + + self.login_button = wx.Button(self, label='Login') + #self.login_button.SetBackgroundColour((205, 215, 206)) + self.login_button.Bind(wx.EVT_BUTTON, self.on_login) + + self.sub_sizer_right.Add(self.statustext, 0, wx.CENTER | wx.ALL | 100, 5) + self.sub_sizer_right.Add(self.logintext, 0, wx.CENTER | wx.ALL | 100, 5) + self.sub_sizer_left.Add(self.start_button, 0, wx.CENTER | wx.ALL | 100, 5) + self.sub_sizer_left.Add(self.stop_button, 0, wx.CENTER | wx.ALL | 100, 5) + self.sub_sizer_left.Add(self.secondary_frame_button, 0, wx.CENTER | wx.ALL | 100, 5) + self.sub_sizer_right.Add(self.login_button, 0, wx.CENTER | wx.ALL | 100, 5) self.SetSizer(self.main_sizer) + self.start_button.Enable(enable=settings["loggedin"]) + self.stop_button.Enable(enable=settings["loggedin"]) + self.secondary_frame_button.Enable(enable=settings["loggedin"]) + + wx.CallAfter(self.updatedata) + + wx.GetApp().ProcessPendingEvents() def handle_columns(self): for col in range(len(COLUMN_NAMES)): self.list_ctrl.InsertColumn(0, COLUMN_NAMES[col], width=COLUMN_SIZES[col]) + def checklogin(self): + self.start_button.Enable(enable=settings["loggedin"]) + self.stop_button.Enable(enable=settings["loggedin"]) + self.secondary_frame_button.Enable(enable=settings["loggedin"]) def updatedata(self): global settings if settings["running"] == True: txt = "Status: Running (" + str(settings["config"]["core"]["level"]) + ")" else: txt = "Status: Not running" - - + + self.list_ctrl.SetSize(self.GetSize()[0] - 50, self.GetSize()[1] - 200) + self.checklogin() + if settings["loggedin"] == True: + logintxt = " Logged in" + self.login_button.SetLabelText("Logout") + else: + self.login_button.SetLabelText("Login") + logintxt = "Not logged in" + self.statustext.SetLabel(txt) + self.logintext.SetLabel(logintxt) if settings["newdata"] == True: settings["newdata"] = False else: - wx.CallLater(1000, self.updatedata) + wx.CallLater(100, self.updatedata) return fprint("updatedata called") loaddata() @@ -232,8 +269,8 @@ class ServerPanel(wx.Panel): #fprint(i, j, TEST_FILE.iloc[i, j]) #self.SetSizer(self.main_sizer) - self.statustext.SetLabel(txt) - wx.CallLater(1000, self.updatedata) + + wx.CallLater(100, self.updatedata) def on_start(self, event): fprint('in on_start') @@ -249,6 +286,15 @@ class ServerPanel(wx.Panel): dg = GetData(parent = None) dg.ShowModal() + def on_login(self, event): + fprint("open login") + if settings["loggedin"] == True: + settings["loggedin"] = False + return + dg2 = ServerFrame() + + #dg2.ShowModal() + def ShowImage(self, imageFile): if imageFile == "": self.bitmap = wx.StaticBitmap(self, -1, size=(0, 0)) @@ -276,20 +322,20 @@ def openwindow(data, sets, kill): killme = kill displaydata = data settings = sets - if settings["loggedin"]: - fprint("Creating server panel") - loaddata() - app = wx.App(False) - frame = OtherFrame() - frame.SetIcon(wx.Icon(find_data_file("icon.ico"), wx.BITMAP_TYPE_ICO)) - app.MainLoop() - else: - fprint("Creating login panel") - - app = wx.App(False) - frame = ServerFrame() - frame.SetIcon(wx.Icon(find_data_file("icon.ico"), wx.BITMAP_TYPE_ICO)) - app.MainLoop() + #if settings["loggedin"]: + fprint("Creating server panel") + loaddata() + app = wx.App(False) + frame = OtherFrame() + frame.SetIcon(wx.Icon(find_data_file("icon.ico"), wx.BITMAP_TYPE_ICO)) + app.MainLoop() + #else: + #fprint("Creating login panel") + + #app = wx.App(False) + #frame = ServerFrame() + #frame.SetIcon(wx.Icon(find_data_file("icon.ico"), wx.BITMAP_TYPE_ICO)) + #app.MainLoop() class GetData(wx.Dialog): def __init__(self, parent): diff --git a/util.py b/util.py index de4312c..c2840ab 100644 --- a/util.py +++ b/util.py @@ -26,7 +26,7 @@ if win32: _, username = res.strip().rsplit("\n", 1) userid, sysdom = username.rsplit("\\", 1) -if linux: +if linux or macos: sysid = hex(uuid.getnode()) #fprint(sysid) datafile += sysid @@ -91,7 +91,7 @@ def run_cmd(cmd): fprint("ran PS command successfully") #completed = subprocess.run(["powershell", "-WindowStyle", "hidden", "-Command", cmd], capture_output=True, startupinfo=startupinfo) return completed - if linux: + if linux or macos: fprint("running sh command: " + cmd) completed = subprocess.run(["sh", "-c", cmd], capture_output=True) fprint("ran sh command successfully")