diff --git a/ippigeon.py b/ippigeon.py index 1314a56..13b655a 100644 --- a/ippigeon.py +++ b/ippigeon.py @@ -59,13 +59,13 @@ if linux: #fprint(hostname) def netstat_done(res): - fprint("netstat done, processing") + fprint("netstat done, processing", settings) procdata_res = pool.apply_async(netstat.process, (res,), callback=process_done) #netstat.process(res) def process_done(res): if settings["running"] == True: - fprint("uploading to sftp...") + fprint("uploading to sftp...", settings) #ssh.sftp_send_data(res, config, datafile) procdata_res = pool.apply_async(ssh.sftp_send_data, (config, datafile, 'send'), callback=upload_done) @@ -74,16 +74,16 @@ def upload_done(res): def login_done(res): if not res: - fprint("Login failure") + fprint("Login failure", settings) settings["message"] = "Login failure" else: - fprint("Login result in main: " + str(res)) + fprint("Login result in main: " + str(res), settings) settings["loggedin"] = res settings["continueui"] = True def blockdata_done(res): global settings - fprint("FINISHED downloading block data") + fprint("FINISHED downloading block data", settings) tmpkill = settings["kill"] settings["kill"] = False #block_res = pool.apply_async(block.block_conn, (config, datafile, res, settings)) @@ -91,29 +91,29 @@ def blockdata_done(res): tmplist = settings["badapps"] for x in block_pids: - fprint(x) + fprint(x, settings) if not x in tmplist: tmplist.append(x) settings["badapps"] = tmplist - fprint(settings["badapps"]) + fprint(settings["badapps"], settings) tmplist = settings["badips"] for x in block_ips: - fprint(x) + fprint(x, settings) if not x in tmplist: tmplist.append(x) settings["badips"] = tmplist - fprint(settings["badips"]) + fprint(settings["badips"], settings) settings["kill"] = tmpkill tmplist = settings["badlines"] for x in block_data: - fprint(x) + fprint(x, settings) if not x in tmplist: tmplist.append(x) settings["badlines"] = tmplist - fprint(settings["badlines"]) + fprint(settings["badlines"], settings) settings["newdata"] = True @@ -121,7 +121,7 @@ def killall(): kids = active_children() for kid in kids: kid.kill() - fprint("Every child has been killed") + fprint("Every child has been killed", settings) os.kill(os.getpid(), 9) # dirty kill of self @@ -145,7 +145,7 @@ def mainloop(pool): if netdata_res is None or netdata_res.ready(): #rawdata = netdata_res.get() #procdata_res = pool.apply_async(process_netstat, (rawdata)) - fprint("netstat starting") + fprint("netstat starting", settings) netdata_res = pool.apply_async(netstat.start, callback=netstat_done) #fprint(netdata_res.successful()) @@ -204,7 +204,7 @@ def mainloop(pool): badproto = line[1] badip = line[4] badport = line[5] - fprint("Firewalling " + badip + ":" + str(badport)) + fprint("Firewalling " + badip + ":" + str(badport), settings) cmd = 'New-NetFirewallRule -DisplayName "IPPigeon Security Rule ' + badip + ':' + str(badport) + '" -Group "IPPigeon" -Direction Outbound -LocalPort Any -Protocol ' + badproto + ' -Action Block -RemoteAddress ' + badip + ' -RemotePort ' + str(badport) run_cmd(cmd) @@ -216,8 +216,9 @@ def mainloop(pool): with open(find_data_file('config.yml'), 'w') as filewrite: #global config yaml.dump(config, filewrite) - fprint("Config saved!") - + fprint("Config saved!", settings) + + sleep(interval / (interval * config["core"]["clockspeed"])) counter += 1 if counter == interval * config["core"]["clockspeed"]: @@ -273,6 +274,7 @@ if __name__ == '__main__': settings["fwll"] = 0 settings["running"] = config["core"]["autostart"] settings["newdata"] = False + settings["logMsg"] = list() killme = manager.Value('d', 0) #killme = False # launch background UI app as process diff --git a/netstat.py b/netstat.py index b13220e..35d6ffa 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 ippigeon import settings import util import time import csv @@ -12,12 +13,12 @@ import csv def process(data): setup_child() - fprint("netstat processing") + fprint("netstat processing", settings) if win32: #output = data.stdout #print(output) output = data.stdout.decode().split('\r\n') # split stdout into lines - #print(output) + print("data", data) if output[0].find("The requested operation requires elevation.") >= 0: #print("test3") raise PermissionError("Unable to acquire netstat data without admin!") @@ -68,13 +69,13 @@ def process(data): with open(find_data_file(util.datafile), "w", newline="") as f: writer = csv.writer(f) writer.writerows(output2) - fprint("done creating csv") + fprint("done creating csv", settings) 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") + fprint("Not enough permissions", settings) raise PermissionError("Unable to acquire netstat data without admin!") output2 = list() output2.append([util.sysid, util.userid, util.sysdom, util.time()]) # add metadata @@ -106,20 +107,20 @@ def process(data): with open(find_data_file(util.datafile), "w", newline="") as f: writer = csv.writer(f) writer.writerows(output2) - fprint("done creating csv") + fprint("done creating csv", settings) def start(): setup_child() - fprint("netstat started") + fprint("netstat started", settings) if win32: data = run_cmd("netstat -n -o -b") - fprint("data acquired") + fprint("data acquired", settings) return data if linux: data = run_cmd("netstat -atunpw") - fprint("data acquired") + fprint("data acquired", settings) return data diff --git a/panel.py b/panel.py index cb5dfbc..d2157dd 100644 --- a/panel.py +++ b/panel.py @@ -1,4 +1,6 @@ import glob +import logging +import sys import wx import wx.lib.buttons as buttons import numpy as np @@ -47,7 +49,7 @@ class OtherFrame(wx.Frame): self.Show() def on_edit(self, event): - fprint('in on_edit') + fprint('in on_edit', settings) def on_window(self, event): return @@ -173,11 +175,20 @@ class ServerPanel(wx.Panel): start_button.SetBackgroundColour((205, 215, 206)) 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) + + log_button = wx.Button(self, label='Logs') + log_button.Bind(wx.EVT_BUTTON, self.on_log) + + #self.log_window = wx.LogWindow(self, 'Log Window', True) + + #show_log_button = wx.Button(self, wx.NewId(), 'Show Log') + #show_log_button.Bind(wx.EVT_BUTTON, self._show_log) # 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) @@ -186,6 +197,7 @@ class ServerPanel(wx.Panel): self.main_sizer.Add(secondary_frame_button, 0, wx.CENTER | wx.ALL | 100, 5) self.SetSizer(self.main_sizer) + def handle_columns(self): for col in range(len(COLUMN_NAMES)): self.list_ctrl.InsertColumn(0, COLUMN_NAMES[col], width=COLUMN_SIZES[col]) @@ -203,12 +215,13 @@ class ServerPanel(wx.Panel): else: wx.CallLater(1000, self.updatedata) return - fprint("updatedata called") + fprint("updatedata called", settings) loaddata() + #logData.doLogging(logData) if self.list_ctrl.DeleteAllItems(): - fprint("Items deleted") + fprint("Items deleted", settings) else: - fprint("Unable to delete") + fprint("Unable to delete", settings) for i in range(len(TEST_FILE)): if str(TEST_FILE.iloc[i, 4]).find("TIME_WAIT") >= 0 or str(TEST_FILE.iloc[i, 4]).find("FIN_WAIT_2") >= 0: continue @@ -236,19 +249,29 @@ class ServerPanel(wx.Panel): wx.CallLater(1000, self.updatedata) def on_start(self, event): - fprint('in on_start') + fprint('in on_start', settings) settings["running"] = True def on_stop(self, event): - fprint('in on_stop') + fprint('in on_stop', settings) settings["running"] = False util.clear_fwll() def on_window(self, event): - fprint("open settings") + fprint("open settings", settings) dg = GetData(parent = None) dg.ShowModal() + def on_log(self, event): + fprint("open log", settings) + dg = logData(parent = None) + #fprint("attempting logLoop", settings) + logData.logLoop(dg) + #fprint("did logLoop work?", settings) + dg.ShowModal() + + + def ShowImage(self, imageFile): if imageFile == "": self.bitmap = wx.StaticBitmap(self, -1, size=(0, 0)) @@ -277,19 +300,64 @@ def openwindow(data, sets, kill): displaydata = data settings = sets if settings["loggedin"]: - fprint("Creating server panel") + fprint("Creating server panel", settings) 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") + fprint("Creating login panel", settings) app = wx.App(False) frame = ServerFrame() frame.SetIcon(wx.Icon(find_data_file("icon.ico"), wx.BITMAP_TYPE_ICO)) app.MainLoop() +class RedirectText(object): + def __init__(self,aWxTextCtrl): + self.out = aWxTextCtrl + + def write(self,string): + self.out.WriteText(string) + +class logData(wx.Dialog): + def __init__(self, parent): + wx.Dialog.__init__(self, parent, wx.ID_ANY, "Logs: ", size = (800,500)) + self.p = wx.Panel(self, wx.ID_ANY) + #self.logBox = wx.BoxSizer(wx.VERTICAL) + self.logsTitle = wx.StaticText(self.p, label="Logs", pos=(20,20)) + self.logs = wx.TextCtrl(self.p, pos=(20,40), size= (700, 400), style=wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL) + self.logs.WriteText("init\n") + #keepLoop = False + + def logLoop(self): + self.logs.WriteText("before while loop\n") + i=0 + if (settings["logMsg"] is not None): + while(i < len(settings["logMsg"])): + #for i in range(len(settings["logMsg"])): + #self.logs.WriteText("in while loop\n") + self.logs.WriteText(settings["logMsg"][i]) + self.logs.WriteText("\n") + i+=1 + else: + self.logs.WriteText("settings is none :(") + settings["logMsg"].add("init string for list") + logData.logLoop(self) + self.logs.WriteText("after while loop\n") + + + + #redir = RedirectText(self.logs) + #sys.stdout = redir + #self.logs.WriteText(redir) + + #self.logs.LoadFile('output.log') + + #def doLogging(self): + #self.logs.WriteText("hi from doLogging\n") + #self.logs.WriteText(settings["logMsg"]) + class GetData(wx.Dialog): def __init__(self, parent): @@ -338,7 +406,7 @@ class GetData(wx.Dialog): def OnQuit(self, event): # save changes - fprint("saving changes...") + fprint("saving changes...", settings) config = settings["config"] config["sftp"]["host"] = self.hostnametext.GetValue() config["sftp"]["user"] = self.usertext.GetValue() diff --git a/ssh.py b/ssh.py index 09a78e3..2f7afda 100644 --- a/ssh.py +++ b/ssh.py @@ -5,25 +5,25 @@ from util import setup_child from util import fprint from invoke import exceptions import sys - +settings = None def sftp_send_data(config, filename, filetype): setup_child() - fprint("Connecting over SSH to " + config['sftp']['host']) + fprint("Connecting over SSH to " + config['sftp']['host'], settings) c = Connection(host=config['sftp']['host'], user=config['sftp']['user'], port=config['sftp']['port'], connect_kwargs={"key_filename": find_data_file(config['sftp']['keyfile']),}) - fprint("Sending data over SFTP: " + filename) - fprint(c.put(find_data_file(filename), remote=config['sftp']['filepath'][filetype])) - fprint("Data sent over SFTP successfully") + fprint("Sending data over SFTP: " + filename, settings) + fprint(c.put(find_data_file(filename), remote=config['sftp']['filepath'][filetype]), settings) + fprint("Data sent over SFTP successfully", settings) #command = 'ls ' + config['sftp']['filepath'][filetype] #fprint(c.run(command)) def check_for_file(config, filename, location): setup_child() - fprint("Connecting over SSH to " + config['sftp']['host']) + fprint("Connecting over SSH to " + config['sftp']['host'], settings) c = Connection(host=config['sftp']['host'], user=config['sftp']['user'], port=config['sftp']['port'], connect_kwargs={"key_filename": find_data_file(config['sftp']['keyfile']),}) - fprint("Checking for existence of file " + config['sftp']['filepath'][location] + "/" + filename) + fprint("Checking for existence of file " + config['sftp']['filepath'][location] + "/" + filename, settings) try: res = c.run("ls -l " + config['sftp']['filepath'][location] + "/" + filename, hide=True) - fprint("File " + filename + " exists!") + fprint("File " + filename + " exists!", settings) return c.run("cat " + config['sftp']['filepath'][location] + "/" + filename, hide=True) except exceptions.UnexpectedExit: return False @@ -32,9 +32,9 @@ def run_ssh(config, command, location): setup_child() fprint("Connecting over SSH to " + config['sftp']['host']) c = Connection(host=config['sftp']['host'], user=config['sftp']['user'], port=config['sftp']['port'], connect_kwargs={"key_filename": find_data_file(config['sftp']['keyfile']),}) - fprint("cd to " + config['sftp']['filepath'][location]) + fprint("cd to " + config['sftp']['filepath'][location], settings) with c.cd(config['sftp']['filepath'][location]): - fprint("Running ssh command: " + command) + fprint("Running ssh command: " + command, settings) res = c.run(command, hide=True, asynchronous=True) return res diff --git a/taskbartool.py b/taskbartool.py index 54b7278..2bd5923 100644 --- a/taskbartool.py +++ b/taskbartool.py @@ -32,7 +32,7 @@ class TaskBarIcon(wx.adv.TaskBarIcon): def CreatePopupMenu(self): menu = wx.Menu() create_menu_item(menu, 'Control Panel', self.on_open) - #create_menu_item(menu, 'Login test', self.on_login) + create_menu_item(menu, 'Login test', self.on_login) menu.AppendSeparator() create_menu_item(menu, 'Exit', self.on_exit) return menu @@ -42,7 +42,7 @@ class TaskBarIcon(wx.adv.TaskBarIcon): self.SetIcon(icon, TRAY_TOOLTIP) def on_left_down(self, event): - fprint ('Tray icon was left-clicked.') + fprint ('Tray icon was left-clicked.', settings) def on_open(self, event): settings["showui"] = True @@ -81,7 +81,7 @@ def background(data, sets, kill): app = TaskbarApp(False) displaydata = data settings = sets - fprint("Creating taskbar icon") + fprint("Creating taskbar icon", settings) app.MainLoop() TRAY_ICON = find_data_file('icon.png') diff --git a/util.py b/util.py index d5a992b..a54e4bd 100644 --- a/util.py +++ b/util.py @@ -7,11 +7,13 @@ import time as t from time import sleep import uuid +logMsg = "" +logCont = "" win32 = platform == "win32" linux = platform == "linux" or platform == "linux2" macos = platform == "darwin" datafile = "" - +settings=None if win32: sysid = hex(uuid.getnode()) datafile += sysid @@ -43,21 +45,28 @@ def time(): def kill(pid): setup_child() if pid > 0: - fprint("Killing PID " + str(pid)) + fprint("Killing PID " + str(pid), settings) os.kill(int(pid), 9) - fprint("Signal 9 sent to PID " + str(pid)) + fprint("Signal 9 sent to PID " + str(pid), settings) -def fprint(msg): +def fprint(msg, settings = None): #if not getattr(sys, "frozen", False): - setup_child() + setup_child(settings) try: frm = inspect.stack()[1] mod = inspect.getmodule(frm[0]) - print('[' + mod.__name__ + ":" + frm.function + ']:', str(msg)) + logMsg = '[' + mod.__name__ + ":" + frm.function + ']:' + str(msg) + + print(logMsg) + if (settings is not None): + tmpList = settings["logMsg"] + tmpList.append(logMsg) + settings["logMsg"] = tmpList except Exception as e: try: print('[????:' + frm.function + ']:', str(msg)) + print(e) except: print('[????]:', str(msg)) @@ -86,28 +95,38 @@ def run_cmd(cmd): #else: # print("alt") startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW # , "-WindowStyle", "hidden" - fprint("running PS command: " + cmd) + fprint("running PS command: " + cmd, settings) completed = subprocess.run(["powershell", "-Command", cmd], capture_output=True, startupinfo=startupinfo) - fprint("ran PS command successfully") + fprint("ran PS command successfully", settings) #completed = subprocess.run(["powershell", "-WindowStyle", "hidden", "-Command", cmd], capture_output=True, startupinfo=startupinfo) return completed if linux: - fprint("running sh command: " + cmd) + fprint("running sh command: " + cmd, settings) completed = subprocess.run(["sh", "-c", cmd], capture_output=True) - fprint("ran sh command successfully") + fprint("ran sh command successfully", settings) return completed -def setup_child(): +def setup_child(sets=None): if not getattr(sys, "frozen", False): sys.stdout = Logger(filename=find_data_file("output.log")) sys.stderr = Logger(filename=find_data_file("output.log")) + if sets is not None: + settings = sets + + + + class Logger(object): def __init__(self, filename="output.log"): + self.string = "" self.log = open(filename, "a") self.terminal = sys.stdout def write(self, message): + self.string += message + self.string += "\n" + self.log.write(message) #close(filename) #self.log = open(filename, "a")