Compare commits
	
		
			50 Commits
		
	
	
		
			494afed4ae
			...
			1669866948
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 5ba82bcd3b | |||
| f759f8ed86 | |||
| a5cb840a61 | |||
| d5f85fb62a | |||
| 788487d181 | |||
| 2680f78cd6 | |||
| d62fa3b79f | |||
| 86eeb716ac | |||
| f6cc6b6fef | |||
| b4a46ad253 | |||
| 9ac35912dd | |||
| 599a84a143 | |||
| e496e6c4c5 | |||
| 57de86f410 | |||
| 12f93c04d2 | |||
| 37231e8b57 | |||
| 7e67920719 | |||
| b3d26107f9 | |||
| a31cd877f2 | |||
| ba0e84ee95 | |||
| 8a803b9d02 | |||
| def22643f6 | |||
| f64ff86d83 | |||
| ae230af4fc | |||
| 6f2f8fc535 | |||
| 258918eecc | |||
| f781056b69 | |||
| 2ee04b59d1 | |||
| 88b38d1492 | |||
| bbb92d1fdb | |||
| 0b97b2287a | |||
| 578eea1c1f | |||
| 5c7cd9b0a5 | |||
| a374ec73b4 | |||
| b0457865d6 | |||
| 832cd45239 | |||
| eb3d5c8910 | |||
| 4fb575ba62 | |||
| 44166a2507 | |||
| 09836efcc4 | |||
| 1254b543e9 | |||
| 3838c37b1b | |||
| 02175cc67e | |||
| c9de444432 | |||
| a83e4016ab | |||
| d069196887 | |||
| ffefad5db5 | |||
| f0121274a6 | |||
| 302dcd5529 | |||
| 0a55b3ae8c | 
							
								
								
									
										5
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,8 +1,9 @@ | |||||||
| __pycache__/ | __pycache__/ | ||||||
| build/ | build/ | ||||||
| config.yaml | config.yaml | ||||||
| 0xf44ee3942e7dgendata.csv | *.csv | ||||||
| 0xf44ee3942e7agendata.csv |  | ||||||
| admin-key.ppk | admin-key.ppk | ||||||
| token.txt | token.txt | ||||||
| *.zip | *.zip | ||||||
|  | output.log | ||||||
|  | output.log | ||||||
|   | |||||||
							
								
								
									
										
											BIN
										
									
								
								IPPigeon.lnk
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								IPPigeon.lnk
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								WXPython.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								WXPython.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 28 KiB | 
							
								
								
									
										
											BIN
										
									
								
								WXPython_30x30.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								WXPython_30x30.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 1.9 KiB | 
							
								
								
									
										43
									
								
								auth.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								auth.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | |||||||
|  | import ssh | ||||||
|  | import csv | ||||||
|  | from util import fprint | ||||||
|  | from util import find_data_file | ||||||
|  | from time import sleep | ||||||
|  | import bcrypt | ||||||
|  |  | ||||||
|  | def login(config, user, password, sysid): | ||||||
|  |     fprint("Attempting to login as " + user) | ||||||
|  |     filename = sysid + "login.csv" | ||||||
|  |     #return True | ||||||
|  |     #hashpasswd = bcrypt.hashpw(password.encode('utf-8'), user).decode() | ||||||
|  |     with open(find_data_file(filename), "w", newline="") as f: | ||||||
|  |         writer = csv.writer(f) | ||||||
|  |         writer.writerows([[user,password,sysid],]) | ||||||
|  |     fprint("done creating csv") | ||||||
|  |     #return True | ||||||
|  |     ssh.sftp_send_data(config, filename, 'sendlogin') | ||||||
|  |     command = "python3 login_service.py " + sysid | ||||||
|  |     ssh.run_ssh(config, command, 'scripts') | ||||||
|  |     filename = sysid + "success.txt" | ||||||
|  |     count = 0 | ||||||
|  |     while count < 20: | ||||||
|  |         output = ssh.check_for_file(config, filename, 'receivelogin') | ||||||
|  |         if output == False: | ||||||
|  |             filename = sysid + "fail.txt" | ||||||
|  |             if ssh.check_for_file(config, filename, 'receivelogin') == False: | ||||||
|  |                 # try again | ||||||
|  |                 count += 1 | ||||||
|  |                 sleep(0.1) | ||||||
|  |                 filename = sysid + "success.txt" | ||||||
|  |                 #raise ValueError("Unable to determine login status") | ||||||
|  |             else: | ||||||
|  |                 return False | ||||||
|  |         else: | ||||||
|  |             fprint(type(output)) | ||||||
|  |             if str(output).find("admin") >= 0 or str(output).find("Admin") >= 0: | ||||||
|  |                 fprint("Authorized as admin!") | ||||||
|  |                 return True | ||||||
|  |             else: | ||||||
|  |                 fprint("Not admin") | ||||||
|  |                 return False | ||||||
|  |     return False | ||||||
							
								
								
									
										114
									
								
								block.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								block.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,114 @@ | |||||||
|  | from util import find_data_file | ||||||
|  | from util import setup_child | ||||||
|  | from util import fprint | ||||||
|  | from util import run_cmd | ||||||
|  | from util import win32 | ||||||
|  | from util import linux | ||||||
|  | from util import kill | ||||||
|  | import util | ||||||
|  | import time | ||||||
|  | import csv | ||||||
|  | import ssh | ||||||
|  |  | ||||||
|  | def get_blocklist(config, settings): | ||||||
|  |     setup_child() | ||||||
|  |     appendbad = settings["appendbad"] | ||||||
|  |     whitelist = settings["whitelist"] | ||||||
|  |     fprint("Downloading deny list from server") | ||||||
|  |     try: | ||||||
|  |         data = ssh.check_for_file(config, "BadIPs.csv", "receive") | ||||||
|  |     except: | ||||||
|  |         data = list() | ||||||
|  |     #fprint(data.stdout) | ||||||
|  |     csvreader = csv.reader(data.stdout.split("\n"), delimiter=',', quotechar='|') | ||||||
|  |     data2 = list() | ||||||
|  |     for row in csvreader: | ||||||
|  |         data2.append(row) | ||||||
|  |     data2 = [i for i in data2 if i] | ||||||
|  |     #fprint(data2) | ||||||
|  |     for line in appendbad: | ||||||
|  |         data2.append(line) | ||||||
|  |      | ||||||
|  |     for line in whitelist: | ||||||
|  |         for line2 in data2: | ||||||
|  |             if line[0] in line2 and line[1] in line2: | ||||||
|  |                 fprint("Whitelisting P1 " + line[0] + ":" + str(line[1])) | ||||||
|  |                 data2.remove(line2) | ||||||
|  |                  | ||||||
|  |                 if line[2] in settings["badapps"]: | ||||||
|  |                     tmp = settings["badapps"] | ||||||
|  |                     tmp.remove(line[2]) | ||||||
|  |                     settings["badapps"] = tmp | ||||||
|  |                 if line[0] in settings["badips"]: | ||||||
|  |                     tmp = settings["badips"] | ||||||
|  |                     tmp.remove(line[0]) | ||||||
|  |                     settings["badips"] = tmp | ||||||
|  |                 for line3 in settings["badlines"]: | ||||||
|  |                     if line[0] in line3 and line[1] in line3: | ||||||
|  |                         fprint("Whitelisting P2" + line[0] + ":" + str(line[1])) | ||||||
|  |                         tmp = settings["badlines"] | ||||||
|  |                         tmp.remove(line3) | ||||||
|  |                         settings["badlines"] = tmp | ||||||
|  |      | ||||||
|  |     fprint(data2) | ||||||
|  |     with open(find_data_file("blocklist.csv"), "w", newline="") as f: | ||||||
|  |         writer = csv.writer(f) | ||||||
|  |         writer.writerows(data2) | ||||||
|  |     fprint("done creating csv") | ||||||
|  |     return data2 | ||||||
|  |  | ||||||
|  | def block_conn(config, datafile, res): | ||||||
|  |     setup_child() | ||||||
|  |     fprint("Searching block data") | ||||||
|  |     mydata = list() | ||||||
|  |     badapps = list() | ||||||
|  |     badips = list() | ||||||
|  |     badlines = list() | ||||||
|  |     with open(find_data_file(datafile), newline='') as csvfile: | ||||||
|  |         csvreader = csv.reader(csvfile, delimiter=',', quotechar='|') | ||||||
|  |          | ||||||
|  |         for row in csvreader: | ||||||
|  |             mydata.append(row) | ||||||
|  |      | ||||||
|  |     baddata = res | ||||||
|  |     fprint("Local loaded successfully") | ||||||
|  |     goodct = 0 | ||||||
|  |     #fprint(mydata) | ||||||
|  |     for line in mydata: | ||||||
|  |         #fprint(line) | ||||||
|  |         #fprint(line) | ||||||
|  |         if line[0].find("0x") >= 0: | ||||||
|  |             continue | ||||||
|  |  | ||||||
|  |         srcip = line[2].split(":")[0] | ||||||
|  |         srcport = line[2].split(":")[1] | ||||||
|  |         destip = line[3].split(":")[0] | ||||||
|  |         destport = line[3].split(":")[1] | ||||||
|  |         pid = line[5] | ||||||
|  |         try:  | ||||||
|  |             pid = int(pid) | ||||||
|  |         except ValueError: | ||||||
|  |             continue | ||||||
|  |         found = False | ||||||
|  |         for line in baddata: | ||||||
|  |             #fprint(destip + " " + line[4]) | ||||||
|  |             badsrcip = line[2] | ||||||
|  |             badsrcport = line[3] | ||||||
|  |             baddestip = line[4] | ||||||
|  |             baddestport = line[5] | ||||||
|  |             badpid = line[11] | ||||||
|  |              | ||||||
|  |             if ((srcip == badsrcip and srcport == badsrcport) or (destip == baddestip and destport == baddestport)) and not pid in badapps: | ||||||
|  |                 found = True | ||||||
|  |                 fprint("FLAG " + srcip + " " + destip + " " + str(pid)) | ||||||
|  |                 badapps.append(pid) | ||||||
|  |                 badips.append(baddestip) | ||||||
|  |                 badlines.append(line) | ||||||
|  |                 #fprint(badapps) | ||||||
|  |                 #fprint("FLAG " + srcip + " " + destip + " " + str(pid)) | ||||||
|  |                 #kill(pid) | ||||||
|  |              | ||||||
|  |         if not found: | ||||||
|  |             goodct = goodct + 1 | ||||||
|  |      | ||||||
|  |     return badapps, badips, badlines, goodct | ||||||
							
								
								
									
										26
									
								
								config.yml
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								config.yml
									
									
									
									
									
								
							| @@ -1,17 +1,19 @@ | |||||||
|  | core: | ||||||
|  |   autostart: true | ||||||
|  |   clockspeed: 20 | ||||||
|  |   interval: 10 | ||||||
|  |   level: 2 | ||||||
|  |   localadmin: true | ||||||
| sftp: | sftp: | ||||||
|   host: ec2-34-232-29-46.compute-1.amazonaws.com |  | ||||||
|   user: ec2-user |  | ||||||
|   port: 22 |  | ||||||
|   keyfile: keyfile-admin.pem |  | ||||||
|   filepath: |   filepath: | ||||||
|  |     receive: /home/ec2-user/Outgoing/Outgoing_Data | ||||||
|  |     receivelogin: /home/ec2-user/Outgoing/Login | ||||||
|  |     scripts: /home/ec2-user/scripts | ||||||
|     send: /home/ec2-user/Incoming/Incoming_Data |     send: /home/ec2-user/Incoming/Incoming_Data | ||||||
|     login: /home/ec2-user/Incoming/Login |     sendlogin: /home/ec2-user/Incoming/Login | ||||||
|     recieve: /home/ec2-user/Outgoing |   host: ec2-34-232-29-46.compute-1.amazonaws.com | ||||||
|  |   keyfile: keyfile-admin.pem | ||||||
|  |   port: 22 | ||||||
|  |   user: ec2-user | ||||||
| ui: | ui: | ||||||
|   darkmode: true |   darkmode: true | ||||||
|  |  | ||||||
| core: |  | ||||||
|   autokill: false |  | ||||||
|   localadmin: true |  | ||||||
|   interval: 10 |  | ||||||
							
								
								
									
										138
									
								
								helloWorld.py
									
									
									
									
									
								
							
							
						
						
									
										138
									
								
								helloWorld.py
									
									
									
									
									
								
							| @@ -1,138 +0,0 @@ | |||||||
| import glob |  | ||||||
| import wx |  | ||||||
| import wx.adv |  | ||||||
| import os |  | ||||||
| from time import sleep |  | ||||||
| from multiprocessing import Process, Pipe |  | ||||||
| from sys import platform |  | ||||||
|  |  | ||||||
|  |  | ||||||
| TRAY_TOOLTIP = 'IP Pigeon'  |  | ||||||
| TRAY_ICON = 'icon.png'  |  | ||||||
|  |  | ||||||
| """if platform == "linux" or platform == "linux2": |  | ||||||
|     # linux |  | ||||||
| elif platform == "darwin": |  | ||||||
|     # OS X |  | ||||||
| elif platform == "win32": |  | ||||||
|     # Windows... |  | ||||||
| """ |  | ||||||
| displaydata = None |  | ||||||
| settings = None |  | ||||||
|  |  | ||||||
| class ServerPanel(wx.Panel):     |  | ||||||
|     def __init__(self, parent): |  | ||||||
|         super().__init__(parent) |  | ||||||
|         main_sizer = wx.BoxSizer(wx.VERTICAL) |  | ||||||
|         self.row_obj_dict = {} |  | ||||||
|  |  | ||||||
|         self.list_ctrl = wx.ListCtrl( |  | ||||||
|             self, size=(-1, 100),  |  | ||||||
|             style=wx.LC_REPORT | wx.BORDER_SUNKEN |  | ||||||
|         ) |  | ||||||
|         self.list_ctrl.InsertColumn(0, 'Server name', width=140) |  | ||||||
|         self.list_ctrl.InsertColumn(1, 'Port number', width=140) |  | ||||||
|         self.list_ctrl.InsertColumn(2, 'Status', width=200) |  | ||||||
|         main_sizer.Add(self.list_ctrl, 0, wx.ALL | wx.EXPAND, 5)         |  | ||||||
|         start_button = wx.Button(self, label='Start') |  | ||||||
|         start_button.Bind(wx.EVT_BUTTON, self.on_edit) |  | ||||||
|         stop_button = wx.Button(self, label='Stop') |  | ||||||
|         stop_button.Bind(wx.EVT_BUTTON, self.on_edit) |  | ||||||
|         main_sizer.Add(start_button, 0, wx.ALL | 100, 5)         |  | ||||||
|         main_sizer.Add(stop_button, 0, wx.ALL | 100, 5) |  | ||||||
|         self.SetSizer(main_sizer) |  | ||||||
|  |  | ||||||
|     def on_edit(self, event): |  | ||||||
|         print('in on_edit') |  | ||||||
|  |  | ||||||
|     def update_mp3_listing(self, folder_path): |  | ||||||
|         print(folder_path) |  | ||||||
|  |  | ||||||
| class ServerFrame(wx.Frame):     |  | ||||||
|     def __init__(self): |  | ||||||
|         super().__init__(parent=None, |  | ||||||
|                          title='Server Dashboard') |  | ||||||
|         self.panel = ServerPanel(self) |  | ||||||
|         self.Show() |  | ||||||
|  |  | ||||||
| ### Taskbar Icon |  | ||||||
|  |  | ||||||
| def create_menu_item(menu, label, func): |  | ||||||
|     item = wx.MenuItem(menu, -1, label) |  | ||||||
|     menu.Bind(wx.EVT_MENU, func, id=item.GetId()) |  | ||||||
|     menu.Append(item) |  | ||||||
|     return item |  | ||||||
|  |  | ||||||
| class TaskBarIcon(wx.adv.TaskBarIcon): |  | ||||||
|     def __init__(self, frame): |  | ||||||
|         self.frame = frame |  | ||||||
|         super(TaskBarIcon, self).__init__() |  | ||||||
|         self.set_icon(TRAY_ICON) |  | ||||||
|         self.Bind(wx.adv.EVT_TASKBAR_LEFT_DOWN, self.on_left_down) |  | ||||||
|  |  | ||||||
|     def CreatePopupMenu(self): |  | ||||||
|         menu = wx.Menu() |  | ||||||
|         create_menu_item(menu, 'Control Panel', self.on_open) |  | ||||||
|         menu.AppendSeparator() |  | ||||||
|         create_menu_item(menu, 'Exit', self.on_exit) |  | ||||||
|         return menu |  | ||||||
|  |  | ||||||
|     def set_icon(self, path): |  | ||||||
|         icon = wx.Icon(path) |  | ||||||
|         self.SetIcon(icon, TRAY_TOOLTIP) |  | ||||||
|  |  | ||||||
|     def on_left_down(self, event):       |  | ||||||
|         print ('Tray icon was left-clicked.') |  | ||||||
|  |  | ||||||
|     def on_open(self, event): |  | ||||||
|         foreground() |  | ||||||
|         #self.close_popup() |  | ||||||
|  |  | ||||||
|     def on_exit(self, event): |  | ||||||
|         wx.CallAfter(self.Destroy) |  | ||||||
|         self.close_popup() |  | ||||||
|  |  | ||||||
|     def close_popup(self): |  | ||||||
|         self.frame.Close() |  | ||||||
|  |  | ||||||
| class TaskbarApp(wx.App): |  | ||||||
|     def OnInit(self): |  | ||||||
|         frame=wx.Frame(None) |  | ||||||
|         self.SetTopWindow(frame) |  | ||||||
|         TaskBarIcon(frame) |  | ||||||
|         return True |  | ||||||
|  |  | ||||||
| class FullApp(wx.App): |  | ||||||
|     def OnInit(self): |  | ||||||
|         fullframe=ServerFrame() |  | ||||||
|         return True |  | ||||||
|  |  | ||||||
| def background(): |  | ||||||
|     app = TaskbarApp(False) |  | ||||||
|     #with Manager() as manager: |  | ||||||
|     app.MainLoop() |  | ||||||
|         #displaydata = manager.list() |  | ||||||
|         #settings = manager.list() |  | ||||||
|  |  | ||||||
|  |  | ||||||
|         #rawdata = manager.list() |  | ||||||
|         #logdata = manager.list() |  | ||||||
|         #uploaddata = manager.list() |  | ||||||
|         #downloaddata = manager.list() |  | ||||||
|          |  | ||||||
|  |  | ||||||
| def open_fg(outputdata, uisettings): |  | ||||||
|     app = FullApp(False) |  | ||||||
|     app.MainLoop() |  | ||||||
|  |  | ||||||
| def foreground(): |  | ||||||
|     # Open the foreground in a separate process so that UI acts independently of the taskbar icon |  | ||||||
|     p = Process(target=open_fg, args=(displaydata, settings)) |  | ||||||
|     p.start() |  | ||||||
|     #p.join() |  | ||||||
|     print("Launched foreground") |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| if __name__ == '__main__': |  | ||||||
|     background() |  | ||||||
							
								
								
									
										263
									
								
								ippigeon.py
									
									
									
									
									
								
							
							
						
						
									
										263
									
								
								ippigeon.py
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | |||||||
|  | import os | ||||||
| import sys | import sys | ||||||
| import subprocess | import subprocess | ||||||
| from multiprocessing import Process, Manager, Pool, TimeoutError, freeze_support, active_children | from multiprocessing import Process, Manager, Pool, TimeoutError, freeze_support, active_children | ||||||
| @@ -8,16 +8,25 @@ import uuid | |||||||
| import yaml | import yaml | ||||||
| from util import find_data_file | from util import find_data_file | ||||||
| from util import fprint | from util import fprint | ||||||
|  | from util import kill | ||||||
|  | from util import run_cmd | ||||||
|  | from notification import send_notification | ||||||
| import taskbartool | import taskbartool | ||||||
| import util | import util | ||||||
| import netstat | import netstat | ||||||
| import ssh | import ssh | ||||||
|  | import auth | ||||||
|  | import panel | ||||||
|  | import block | ||||||
|  |  | ||||||
|  |  | ||||||
|  | history = list() | ||||||
| displaydata = None | displaydata = None | ||||||
| settings = None | settings = None | ||||||
| netdata_res = None | netdata_res = None | ||||||
| procdata_res = None | procdata_res = None | ||||||
| killme = None | killme = None | ||||||
|  | ppanel = None | ||||||
| datafile = "" | datafile = "" | ||||||
| #print(datafile) | #print(datafile) | ||||||
| config = None | config = None | ||||||
| @@ -40,46 +49,219 @@ if win32: | |||||||
|     _, username = res.strip().rsplit("\n", 1) |     _, username = res.strip().rsplit("\n", 1) | ||||||
|     userid, sysdom = username.rsplit("\\", 1) |     userid, sysdom = username.rsplit("\\", 1) | ||||||
|  |  | ||||||
|  | if linux or macos: | ||||||
|  |     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).strip() | ||||||
|  |     #fprint(hostname) | ||||||
|  |  | ||||||
| def netstat_done(res): | def netstat_done(res): | ||||||
|     fprint("netstat done, processing") |     fprint("netstat done, processing", settings) | ||||||
|     procdata_res = pool.apply_async(netstat.process, (res,), callback=process_done) |     procdata_res = pool.apply_async(netstat.process, (res,), callback=process_done) | ||||||
|     #netstat.process(res) |     #netstat.process(res) | ||||||
|  |  | ||||||
| def process_done(res): | def process_done(res): | ||||||
|     fprint("uploading to sftp...") |     if settings["running"] == True: | ||||||
|     ssh.sftp_send_data(res, config, datafile) |         fprint("uploading to sftp...", settings) | ||||||
|     #procdata_res = pool.apply_async(ssh.sftp_send_data, (res, config, datafile)) |         #ssh.sftp_send_data(config, datafile, 'send') | ||||||
|          |          | ||||||
|  |         procdata_res = pool.apply_async(ssh.sftp_send_data, (config, datafile, 'send'), callback=upload_done) | ||||||
|      |      | ||||||
|  | def upload_done(res): | ||||||
|  |     settings["block"] = True | ||||||
|  |     tmpstat = settings["stats"] | ||||||
|  |     tmpstat[2] += 1 | ||||||
|  |     settings["stats"] = tmpstat | ||||||
|  |  | ||||||
|  | def login_done(res): | ||||||
|  |     if not res: | ||||||
|  |         fprint("Login failure", settings) | ||||||
|  |         settings["message"] = "Login failure" | ||||||
|  |     else: | ||||||
|  |         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", settings) | ||||||
|  |     tmpkill = settings["kill"] | ||||||
|  |     settings["kill"] = False | ||||||
|  |     #block_res = pool.apply_async(block.block_conn, (config, datafile, res, settings)) | ||||||
|  |     block_pids, block_ips, block_data, goodct = block.block_conn(config, datafile, res) | ||||||
|  |     tmpstat = settings["stats"] | ||||||
|  |     tmpstat[1] += goodct | ||||||
|  |     if tmpstat[0] > 0 and goodct > 0: | ||||||
|  |         tmpstat[4] = 1.0 / (goodct * 100.0 / tmpstat[0]) | ||||||
|  |     else:  | ||||||
|  |         tmpstat[4] = 0.0 | ||||||
|  |     tmpstat[3] += 1 | ||||||
|  |     settings["stats"] = tmpstat | ||||||
|  |  | ||||||
|  |     tmplist = settings["badapps"] | ||||||
|  |      | ||||||
|  |     for x in block_pids: | ||||||
|  |         fprint(x, settings) | ||||||
|  |         if not x in tmplist: | ||||||
|  |             tmplist.append(x) | ||||||
|  |     settings["badapps"] = tmplist | ||||||
|  |     fprint(settings["badapps"], settings) | ||||||
|  |      | ||||||
|  |     tmplist = settings["badips"] | ||||||
|  |     for x in block_ips: | ||||||
|  |         fprint(x, settings) | ||||||
|  |         if not x in tmplist: | ||||||
|  |             tmplist.append(x) | ||||||
|  |     settings["badips"] = tmplist | ||||||
|  |     fprint(settings["badips"], settings) | ||||||
|  |  | ||||||
|  |     settings["kill"] = tmpkill | ||||||
|  |  | ||||||
|  |     tmplist = settings["badlines"] | ||||||
|  |     for x in block_data: | ||||||
|  |         fprint(x, settings) | ||||||
|  |         if not x in tmplist: | ||||||
|  |             tmplist.append(x) | ||||||
|  |     settings["badlines"] = tmplist | ||||||
|  |     fprint(settings["badlines"], settings) | ||||||
|  |  | ||||||
|  |     settings["newdata"] = True | ||||||
|  |          | ||||||
|  | def readstat_done(res): | ||||||
|  |     settings["stats"] = res | ||||||
|  |     fprint("Read stats!" + str(settings["stats"]), settings) | ||||||
|  |  | ||||||
|  |  | ||||||
| def killall(): | def killall(): | ||||||
|     kids = active_children() |     kids = active_children() | ||||||
|     for kid in kids: |     for kid in kids: | ||||||
|         kid.kill() |         kid.kill() | ||||||
|     fprint("Every child has been killed") |     fprint("Every child has been killed", settings) | ||||||
|     os.kill(os.getpid(), 9) # dirty kill of self |     os.kill(os.getpid(), 9) # dirty kill of self | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def mainloop(pool): | def mainloop(pool): | ||||||
|     # worker pool: netstat, netstat cleanup, upload, download, ui tasks |     # worker pool: netstat, netstat cleanup, upload, download, ui tasks | ||||||
|     fprint("start loop") |     global config | ||||||
|      |     global counter | ||||||
|     global netdata_res |     global netdata_res | ||||||
|     global procdata_res |     global procdata_res | ||||||
|     global rawdata |     global rawdata | ||||||
|     global killme |     global killme | ||||||
|  |     global ppanel | ||||||
|     #print(killme) |     #print(killme) | ||||||
|     if killme.value > 0: |     if killme.value > 0: | ||||||
|         #print("killing") |         #print("killing") | ||||||
|  |         util.clear_fwll() # clear the firewall rules before shutdown | ||||||
|         killall() |         killall() | ||||||
|     #print(res.get(timeout=1)) |     #print(res.get(timeout=1)) | ||||||
|  |     if counter == 0: # runs every INTERVAL | ||||||
|  |         #fprint("start loop") | ||||||
|  |         if settings["stats"][1] > 0: | ||||||
|  |             util.write_stats(settings["stats"]) | ||||||
|         if netdata_res is None or netdata_res.ready(): |         if netdata_res is None or netdata_res.ready(): | ||||||
|             #rawdata = netdata_res.get() |             #rawdata = netdata_res.get() | ||||||
|             #procdata_res = pool.apply_async(process_netstat, (rawdata)) |             #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) |             netdata_res = pool.apply_async(netstat.start, callback=netstat_done) | ||||||
|             #fprint(netdata_res.successful()) |             #fprint(netdata_res.successful()) | ||||||
|     sleep(interval) |      | ||||||
|  |     # runs every 50ms | ||||||
|  |      | ||||||
|  |     if settings["continueui"] == True: | ||||||
|  |         settings["continueui"] = False | ||||||
|  |         #if ppanel is not None: | ||||||
|  |             # login panel is already open | ||||||
|  |         #    ppanel.terminate() | ||||||
|  |         #    ppanel = Process(target=panel.openwindow, args=(displaydata,settings,killme)) | ||||||
|  |         #    ppanel.start()   | ||||||
|  |  | ||||||
|  |     if settings["showui"] == True: | ||||||
|  |         settings["showui"] = False | ||||||
|  |         ppanel = Process(target=panel.openwindow, args=(displaydata,settings,killme)) | ||||||
|  |         ppanel.start()    | ||||||
|  |  | ||||||
|  |     if settings["login"] == True: | ||||||
|  |         login_res = pool.apply_async(auth.login, (config, settings["username"], settings["password"], sysid), callback=login_done) | ||||||
|  |         #fprint(auth.login(config, settings["username"], settings["password"], sysid)) | ||||||
|  |         settings["login"] = False | ||||||
|  |          | ||||||
|  |      | ||||||
|  |     if settings["block"] == True and settings["running"] == True: | ||||||
|  |         #blockdata_res = pool.apply_async(block.get_blocklist, (config, settings), callback=blockdata_done) | ||||||
|  |         res = block.get_blocklist(config, settings) | ||||||
|  |         blockdata_done(res) | ||||||
|  |         settings["block"] = False | ||||||
|  |  | ||||||
|  |     if config["core"]["level"] == 0: | ||||||
|  |         settings["kill"] = False | ||||||
|  |         settings["fwll"] = False | ||||||
|  |  | ||||||
|  |     if config["core"]["level"] == 1: | ||||||
|  |         settings["kill"] = True | ||||||
|  |         settings["fwll"] = False | ||||||
|  |  | ||||||
|  |     if config["core"]["level"] == 2: | ||||||
|  |         settings["kill"] = False | ||||||
|  |         settings["fwll"] = True | ||||||
|  |  | ||||||
|  |     if config["core"]["level"] == 3: | ||||||
|  |         settings["kill"] = True | ||||||
|  |         settings["fwll"] = True | ||||||
|  |  | ||||||
|  |     if settings["kill"] == True: | ||||||
|  |         tmplist = settings["badapps"] | ||||||
|  |         settings["badapps"] = list() | ||||||
|  |         for x in tmplist: | ||||||
|  |             if x > 4: | ||||||
|  |                 send_notification("Killing PID " + str(x)) | ||||||
|  |                 kill(x) | ||||||
|  |  | ||||||
|  |     if settings["fwll"] == True: | ||||||
|  |         global history | ||||||
|  |         tmplist = settings["badlines"] | ||||||
|  |         tmpstat = settings["stats"] | ||||||
|  |         tmpstat[0] += len(tmplist)  | ||||||
|  |         settings["stats"] = tmpstat | ||||||
|  |         settings["badlines"] = list() | ||||||
|  |         for line in tmplist: | ||||||
|  |             badproto = line[1] | ||||||
|  |             badip = line[4] | ||||||
|  |             badport = line[5] | ||||||
|  |              | ||||||
|  |             if (badip, badport) not in history: | ||||||
|  |                 fprint("Firewalling " + badip + ":" + str(badport), settings) | ||||||
|  |                 send_notification("Firewalling " + badip + ":" + str(badport)) | ||||||
|  |                 history.append((badip, badport)) | ||||||
|  |                 if win32: | ||||||
|  |                     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) | ||||||
|  |                 if linux: | ||||||
|  |                     cmd = "nft add rule ip ippigeon output ip daddr " + badip + " " + badproto.lower() + " dport " + str(badport) + " drop" | ||||||
|  |                     run_cmd(cmd) | ||||||
|  |                  | ||||||
|  |         settings["badapps"] = list() | ||||||
|  |          | ||||||
|  |      | ||||||
|  |     if settings["applyconfig"] == True: | ||||||
|  |         settings["applyconfig"] = False | ||||||
|  |         config = settings["config"] | ||||||
|  |         #fprint(settings["config"]) | ||||||
|  |         with open(find_data_file('config.yml'), 'w') as filewrite: | ||||||
|  |             #global config | ||||||
|  |             yaml.dump(config, filewrite) | ||||||
|  |         fprint("Config saved!", settings) | ||||||
|  |  | ||||||
|  |     sleep(interval / (interval * config["core"]["clockspeed"])) | ||||||
|  |     counter += 1 | ||||||
|  |     if counter == interval * config["core"]["clockspeed"]: | ||||||
|  |         counter = 0 | ||||||
|  |  | ||||||
|  |  | ||||||
| class Logger(object): | class Logger(object): | ||||||
|     def __init__(self, filename="output.log"): |     def __init__(self, filename="output.log"): | ||||||
| @@ -96,7 +278,7 @@ class Logger(object): | |||||||
|             sleep(0) |             sleep(0) | ||||||
|          |          | ||||||
|     def flush(self): |     def flush(self): | ||||||
|         print("") |         print("",end="") | ||||||
|  |  | ||||||
| if __name__ == '__main__': | if __name__ == '__main__': | ||||||
|     freeze_support() # required if packaged into single EXE |     freeze_support() # required if packaged into single EXE | ||||||
| @@ -105,35 +287,68 @@ if __name__ == '__main__': | |||||||
|      |      | ||||||
|     sys.stdout = Logger(filename=find_data_file("output.log")) |     sys.stdout = Logger(filename=find_data_file("output.log")) | ||||||
|     sys.stderr = Logger(filename=find_data_file("output.log")) |     sys.stderr = Logger(filename=find_data_file("output.log")) | ||||||
|      |  | ||||||
|     with Pool(processes=5) as pool: |  | ||||||
|     with Manager() as manager: |     with Manager() as manager: | ||||||
|             with open(find_data_file('config.yml'), 'r') as file: |         with Pool(processes=5) as pool: | ||||||
|  |              | ||||||
|  |             with open(find_data_file('config.yml'), 'r') as fileread: | ||||||
|                 #global config |                 #global config | ||||||
|                 config = yaml.safe_load(file) |                 config = yaml.safe_load(fileread) | ||||||
|                 #print(config['sftp']['host']) |                 #print(config['sftp']['host']) | ||||||
|             interval = config['core']['interval'] |             interval = config['core']['interval'] | ||||||
|             displaydata = manager.list(range(2)) # data to be printed |             displaydata = manager.list(range(2)) # data to be printed | ||||||
|             settings = manager.list(range(20)) # configuration  |             settings = manager.dict() # configuration  | ||||||
|  |             # setup shared data variables | ||||||
|  |             settings["login"] = False | ||||||
|  |             settings["loggedin"] = False | ||||||
|  |             settings["showui"] = False | ||||||
|  |             settings["continueui"] = False | ||||||
|  |             settings["killbox"] = list() | ||||||
|  |             settings["badapps"] = list() | ||||||
|  |             settings["badips"] = list() | ||||||
|  |             settings["badlines"] = list() | ||||||
|  |             settings["block"] = False | ||||||
|  |             settings["kill"] = False | ||||||
|  |             settings["config"] = config  | ||||||
|  |             settings["applyconfig"] = False | ||||||
|  |             settings["fwll"] = 0 | ||||||
|  |             settings["running"] = config["core"]["autostart"] | ||||||
|  |             settings["newdata"] = False | ||||||
|  |             settings["appendbad"] = list() | ||||||
|  |             settings["logMsg"] = list() | ||||||
|  |             settings["whitelist"] = list() | ||||||
|  |             tmp = list() | ||||||
|  |             tmp.append(["N/A", "TCP", "N/A", "N/A", "20.112.52.29", "5000", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A"]) | ||||||
|  |             tmp.append(["N/A", "TCP", "N/A", "N/A", "20.81.111.85", "80", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A"]) | ||||||
|  |             tmp.append(["N/A", "TCP", "N/A", "N/A", "100.115.71.78", "5000", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A"]) | ||||||
|  |             tmp.append(["N/A", "TCP", "N/A", "N/A", "100.115.71.78", "5000", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A"]) | ||||||
|  |             tmp.append(["N/A", "TCP", "N/A", "N/A", "174.143.130.167", "443", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A"]) | ||||||
|  |             tmp.append(["N/A", "TCP", "N/A", "N/A", "216.47.134.203", "443", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A"]) | ||||||
|  |             tmp.append(["N/A", "TCP", "N/A", "N/A", "34.111.83.189", "443", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A"]) | ||||||
|  |             settings["appendbad"] = tmp | ||||||
|  |             # connections blocked, total connections allowed, count of data sent, data recieved, ratio blocked-unblocked | ||||||
|  |             settings["stats"] = [0, 0, 0, 0, 0.0] | ||||||
|  |  | ||||||
|             killme = manager.Value('d', 0) |             killme = manager.Value('d', 0) | ||||||
|             #killme = False |             #killme = False | ||||||
|             # launch background UI app as process |             # launch background UI app as process | ||||||
|  |             util.clear_fwll() | ||||||
|             p = Process(target=taskbartool.background, args=(displaydata,settings,killme)) |             p = Process(target=taskbartool.background, args=(displaydata,settings,killme)) | ||||||
|  |              | ||||||
|             p.start()    |             p.start()    | ||||||
|             #p.join() # not a foreground job, so let's not join it |             #p.join() # not a foreground job, so let's not join it | ||||||
|             keeprunning = True |             keeprunning = True | ||||||
|  |  | ||||||
|             # initial setup |             # initial setup | ||||||
|             #netdata_res = pool.apply_async(netstat, callback=netstat_done) |             #netdata_res = pool.apply_async(netstat, callback=netstat_done) | ||||||
|  |             if linux: | ||||||
|  |                 # clear existing nftables entries, create new table | ||||||
|  |                 run_cmd("nft delete table ip ippigeon") | ||||||
|  |                 run_cmd("nft create table ip ippigeon") | ||||||
|  |                 run_cmd("nft add chain ip ippigeon output { type filter hook output priority 0 \; policy accept\; }") | ||||||
|  |                 #run_cmd("nft add chain ippigeon filter") | ||||||
|                  |                  | ||||||
|  |             pool.apply_async(util.read_stats, callback=readstat_done) | ||||||
|             # launch loop - non-blocking! |             # launch loop - non-blocking! | ||||||
|  |             counter = 0 | ||||||
|             while(keeprunning): |             while(keeprunning): | ||||||
|                 mainloop(pool) |                 mainloop(pool) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										0
									
								
								keyfile-admin.pem
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										0
									
								
								keyfile-admin.pem
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
								
								
									
										101
									
								
								netstat.py
									
									
									
									
									
								
							
							
						
						
									
										101
									
								
								netstat.py
									
									
									
									
									
								
							| @@ -1,8 +1,11 @@ | |||||||
| from util import find_data_file | from util import find_data_file | ||||||
| from util import setup_child | from util import setup_child | ||||||
| from util import fprint | from util import fprint | ||||||
| from util import run_ps | from util import run_cmd | ||||||
| from util import win32 | from util import win32 | ||||||
|  | from util import linux | ||||||
|  | from util import macos | ||||||
|  | from ippigeon import settings | ||||||
| import util | import util | ||||||
| import time | import time | ||||||
| import csv | import csv | ||||||
| @@ -11,7 +14,7 @@ import csv | |||||||
|  |  | ||||||
| def process(data): | def process(data): | ||||||
|     setup_child() |     setup_child() | ||||||
|     fprint("netstat processing") |     fprint("netstat processing", settings) | ||||||
|     if win32: |     if win32: | ||||||
|         #output = data.stdout |         #output = data.stdout | ||||||
|         #print(output) |         #print(output) | ||||||
| @@ -67,14 +70,100 @@ def process(data): | |||||||
|         with open(find_data_file(util.datafile), "w", newline="") as f: |         with open(find_data_file(util.datafile), "w", newline="") as f: | ||||||
|             writer = csv.writer(f) |             writer = csv.writer(f) | ||||||
|             writer.writerows(output2) |             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", settings) | ||||||
|  |             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[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", settings) | ||||||
|  |  | ||||||
|  |     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", settings) | ||||||
|  |             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", settings) | ||||||
|  |  | ||||||
|  |  | ||||||
| def start(): | def start(): | ||||||
|     fprint("netstat started") |  | ||||||
|     setup_child() |     setup_child() | ||||||
|  |     fprint("netstat started", settings) | ||||||
|      |      | ||||||
|     if win32: |     if win32: | ||||||
|         data = run_ps("netstat -n -o -b") |         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", settings) | ||||||
|  |         return data | ||||||
|  |  | ||||||
|  |     if macos: | ||||||
|  |         data = run_cmd("netstat -anv") | ||||||
|  |         fprint("data acquired", settings) | ||||||
|         return data |         return data | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										19
									
								
								notification.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								notification.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | |||||||
|  | from plyer import notification #for getting notification on your PC | ||||||
|  | import sys | ||||||
|  | from playsound import playsound #pip install playsound==1.2.2 | ||||||
|  | from util import find_data_file | ||||||
|  | relative_path = (sys.path[0]) | ||||||
|  | sound = find_data_file('music.mp3') | ||||||
|  |  | ||||||
|  | def send_notification(msg="Test notification"): | ||||||
|  |     notification.notify( | ||||||
|  |         title = "IP Pigeon", | ||||||
|  |         message = msg, | ||||||
|  |         app_name = "IPPigeon", | ||||||
|  |         app_icon = find_data_file("icon.ico"), | ||||||
|  |         timeout = 5 #number of seconds message is displayed | ||||||
|  |     ) | ||||||
|  |     playsound(sound) | ||||||
|  |  | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     send_notification()  | ||||||
							
								
								
									
										81
									
								
								out.csv
									
									
									
									
									
								
							
							
						
						
									
										81
									
								
								out.csv
									
									
									
									
									
								
							| @@ -1,81 +0,0 @@ | |||||||
| 0xf44ee3942e7d,FRAMEWORKWIN,Cole,1664323651 |  | ||||||
| firefox.exe,TCP,[2620:f3:8000:5050:2c24:f8cf:930c:11ae]:54350,[2600:9000:2026:d600:a:da5e:7900:93a1]:443,ESTABLISHED,16812 |  | ||||||
| firefox.exe,TCP,[2620:f3:8000:5050:2c24:f8cf:930c:11ae]:54323,[2606:4700::6812:c039]:443,TIME_WAIT,0 |  | ||||||
| firefox.exe,TCP,[2620:f3:8000:5050:2c24:f8cf:930c:11ae]:54295,[2606:4700::6812:8b2f]:443,TIME_WAIT,0 |  | ||||||
| tailscale-ipn.exe,TCP,127.0.0.1:63227,127.0.0.1:41112,ESTABLISHED,13244 |  | ||||||
| nxnode.bin,TCP,127.0.0.1:63192,127.0.0.1:22753,ESTABLISHED,11476 |  | ||||||
| nxnode.bin,TCP,127.0.0.1:63191,127.0.0.1:1550,ESTABLISHED,11476 |  | ||||||
| nxnode.bin,TCP,127.0.0.1:63190,127.0.0.1:21667,ESTABLISHED,11476 |  | ||||||
| nxclient.bin,TCP,127.0.0.1:62772,127.0.0.1:15334,ESTABLISHED,12168 |  | ||||||
| nxclient.bin,TCP,127.0.0.1:62771,127.0.0.1:14346,ESTABLISHED,12168 |  | ||||||
| nxclient.bin,TCP,127.0.0.1:62770,127.0.0.1:32580,ESTABLISHED,12168 |  | ||||||
| nxnode.bin,TCP,127.0.0.1:62769,127.0.0.1:25001,ESTABLISHED,11476 |  | ||||||
| nxnode.bin,TCP,127.0.0.1:62767,127.0.0.1:24790,ESTABLISHED,11476 |  | ||||||
| nxnode.bin,TCP,127.0.0.1:62764,127.0.0.1:4831,ESTABLISHED,11476 |  | ||||||
| firefox.exe,TCP,127.0.0.1:54101,127.0.0.1:54100,ESTABLISHED,2220 |  | ||||||
| firefox.exe,TCP,127.0.0.1:54100,127.0.0.1:54101,ESTABLISHED,2220 |  | ||||||
| firefox.exe,TCP,127.0.0.1:54099,127.0.0.1:54098,ESTABLISHED,16812 |  | ||||||
| firefox.exe,TCP,127.0.0.1:54098,127.0.0.1:54099,ESTABLISHED,16812 |  | ||||||
| python.exe,TCP,127.0.0.1:53388,127.0.0.1:53387,ESTABLISHED,6380 |  | ||||||
| python.exe,TCP,127.0.0.1:53387,127.0.0.1:53388,ESTABLISHED,6380 |  | ||||||
| VSCodium.exe,TCP,127.0.0.1:53380,127.0.0.1:53379,ESTABLISHED,9272 |  | ||||||
| VSCodium.exe,TCP,127.0.0.1:53379,127.0.0.1:53380,ESTABLISHED,9272 |  | ||||||
| nxserver.bin,TCP,127.0.0.1:53359,127.0.0.1:17141,ESTABLISHED,7620 |  | ||||||
| nxserver.bin,TCP,127.0.0.1:53352,127.0.0.1:25137,ESTABLISHED,7620 |  | ||||||
| nxservice64.exe,TCP,127.0.0.1:49777,127.0.0.1:19492,ESTABLISHED,5244 |  | ||||||
| nxserver.bin,TCP,127.0.0.1:49772,127.0.0.1:7426,ESTABLISHED,7620 |  | ||||||
| nxserver.bin,TCP,127.0.0.1:49768,127.0.0.1:15484,ESTABLISHED,7620 |  | ||||||
| nxserver.bin,TCP,127.0.0.1:49767,127.0.0.1:7973,ESTABLISHED,7620 |  | ||||||
| nxserver.bin,TCP,127.0.0.1:49766,127.0.0.1:4362,ESTABLISHED,7620 |  | ||||||
| nxserver.bin,TCP,127.0.0.1:49765,127.0.0.1:5244,ESTABLISHED,7620 |  | ||||||
| nxserver.bin,TCP,127.0.0.1:49764,127.0.0.1:2739,ESTABLISHED,7620 |  | ||||||
| nxserver.bin,TCP,127.0.0.1:49704,127.0.0.1:32876,ESTABLISHED,7620 |  | ||||||
| AppleMobileDeviceService.exe,TCP,127.0.0.1:49674,127.0.0.1:5354,ESTABLISHED,4888 |  | ||||||
| AppleMobileDeviceService.exe,TCP,127.0.0.1:49670,127.0.0.1:5354,ESTABLISHED,4888 |  | ||||||
| tailscaled.exe,TCP,127.0.0.1:41112,127.0.0.1:63227,ESTABLISHED,7688 |  | ||||||
| nxserver.bin,TCP,127.0.0.1:32876,127.0.0.1:49704,ESTABLISHED,7620 |  | ||||||
| nxclient.bin,TCP,127.0.0.1:32580,127.0.0.1:62770,ESTABLISHED,12168 |  | ||||||
| nxserver.bin,TCP,127.0.0.1:25137,127.0.0.1:53352,ESTABLISHED,7620 |  | ||||||
| nxclient.bin,TCP,127.0.0.1:25001,127.0.0.1:62769,ESTABLISHED,12168 |  | ||||||
| nxserver.bin,TCP,127.0.0.1:24790,127.0.0.1:62767,ESTABLISHED,7620 |  | ||||||
| nxnode.bin,TCP,127.0.0.1:22753,127.0.0.1:63192,ESTABLISHED,11476 |  | ||||||
| nxnode.bin,TCP,127.0.0.1:21667,127.0.0.1:63190,ESTABLISHED,11476 |  | ||||||
| nxservice64.exe,TCP,127.0.0.1:19492,127.0.0.1:49777,ESTABLISHED,5244 |  | ||||||
| nxserver.bin,TCP,127.0.0.1:17141,127.0.0.1:53359,ESTABLISHED,7620 |  | ||||||
| nxserver.bin,TCP,127.0.0.1:15484,127.0.0.1:49768,ESTABLISHED,7620 |  | ||||||
| nxclient.bin,TCP,127.0.0.1:15334,127.0.0.1:62772,ESTABLISHED,12168 |  | ||||||
| nxclient.bin,TCP,127.0.0.1:14346,127.0.0.1:62771,ESTABLISHED,12168 |  | ||||||
| nxserver.bin,TCP,127.0.0.1:7973,127.0.0.1:49767,ESTABLISHED,7620 |  | ||||||
| nxserver.bin,TCP,127.0.0.1:7426,127.0.0.1:49772,ESTABLISHED,7620 |  | ||||||
| mDNSResponder.exe,TCP,127.0.0.1:5354,127.0.0.1:49674,ESTABLISHED,4948 |  | ||||||
| mDNSResponder.exe,TCP,127.0.0.1:5354,127.0.0.1:49670,ESTABLISHED,4948 |  | ||||||
| nxserver.bin,TCP,127.0.0.1:5244,127.0.0.1:49765,ESTABLISHED,7620 |  | ||||||
| nxnode.bin,TCP,127.0.0.1:4831,127.0.0.1:62764,ESTABLISHED,11476 |  | ||||||
| nxserver.bin,TCP,127.0.0.1:4362,127.0.0.1:49766,ESTABLISHED,7620 |  | ||||||
| nxserver.bin,TCP,127.0.0.1:2739,127.0.0.1:49764,ESTABLISHED,7620 |  | ||||||
| nxnode.bin,TCP,127.0.0.1:1550,127.0.0.1:63191,ESTABLISHED,11476 |  | ||||||
| nxnode.bin,TCP,104.194.96.68:54361,208.59.79.12:443,TIME_WAIT,0 |  | ||||||
| firefox.exe,TCP,104.194.96.68:54352,52.84.125.26:443,ESTABLISHED,16812 |  | ||||||
| firefox.exe,TCP,104.194.96.68:54348,35.244.181.201:443,ESTABLISHED,16812 |  | ||||||
| firefox.exe,TCP,104.194.96.68:54347,52.84.52.31:443,ESTABLISHED,16812 |  | ||||||
| firefox.exe,TCP,104.194.96.68:54346,52.84.52.31:443,ESTABLISHED,16812 |  | ||||||
| firefox.exe,TCP,104.194.96.68:54345,52.84.52.31:443,ESTABLISHED,16812 |  | ||||||
| firefox.exe,TCP,104.194.96.68:54344,52.84.52.31:443,ESTABLISHED,16812 |  | ||||||
| firefox.exe,TCP,104.194.96.68:54343,52.84.52.31:443,ESTABLISHED,16812 |  | ||||||
| firefox.exe,TCP,104.194.96.68:54342,52.84.52.31:443,ESTABLISHED,16812 |  | ||||||
| firefox.exe,TCP,104.194.96.68:54341,52.84.52.87:443,ESTABLISHED,16812 |  | ||||||
| firefox.exe,TCP,104.194.96.68:54340,54.185.157.183:443,TIME_WAIT,0 |  | ||||||
| firefox.exe,TCP,104.194.96.68:54339,35.186.227.140:443,ESTABLISHED,16812 |  | ||||||
| firefox.exe,TCP,104.194.96.68:54338,54.201.164.58:443,TIME_WAIT,0 |  | ||||||
| firefox.exe,TCP,104.194.96.68:54330,52.84.125.36:443,TIME_WAIT,0 |  | ||||||
| firefox.exe,TCP,104.194.96.68:54293,141.193.213.11:443,TIME_WAIT,0 |  | ||||||
| firefox.exe,TCP,104.194.96.68:54276,104.21.42.46:443,TIME_WAIT,0 |  | ||||||
| firefox.exe,TCP,104.194.96.68:54271,104.21.42.46:443,TIME_WAIT,0 |  | ||||||
| firefox.exe,TCP,104.194.96.68:54110,52.41.253.170:443,ESTABLISHED,16812 |  | ||||||
| syncthing.exe,TCP,104.194.96.68:53909,128.173.88.78:22067,ESTABLISHED,6668 |  | ||||||
| tailscaled.exe,TCP,104.194.96.68:53392,18.156.90.224:80,ESTABLISHED,7688 |  | ||||||
| tailscaled.exe,TCP,104.194.96.68:53214,199.38.182.118:443,ESTABLISHED,7688 |  | ||||||
| svchost.exe,TCP,104.194.96.68:49420,13.64.180.106:443,ESTABLISHED,5456 |  | ||||||
| VcomSvc.exe,TCP,100.106.209.107:63898,192.168.1.173:5000,ESTABLISHED,5424 |  | ||||||
| Windows System,TCP,100.106.209.107:53857,192.168.1.11:445,ESTABLISHED,4 |  | ||||||
| Windows System,TCP,100.106.209.107:53856,192.168.1.216:445,ESTABLISHED,4 |  | ||||||
| 
 | 
							
								
								
									
										11831
									
								
								output.log
									
									
									
									
									
								
							
							
						
						
									
										11831
									
								
								output.log
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										552
									
								
								panel.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										552
									
								
								panel.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,552 @@ | |||||||
|  | import glob | ||||||
|  | import wx | ||||||
|  | import logging | ||||||
|  | import sys | ||||||
|  | import wx.lib.buttons as buttons | ||||||
|  | import numpy as np | ||||||
|  | import pandas as pd | ||||||
|  | from util import sysid | ||||||
|  | from util import setup_child | ||||||
|  | from util import fprint | ||||||
|  | from util import find_data_file | ||||||
|  | import util | ||||||
|  |  | ||||||
|  | BG_IMG = 'icon.png' | ||||||
|  | filename = sysid + "gendata.csv" | ||||||
|  | COLUMN_NAMES = np.flip(['Executable', 'Proto', 'Source IP', 'Destination IP',  'Status', 'PID']) | ||||||
|  | COLUMN_SIZES = np.flip([200, 50, 200, 200, 140, 100]) | ||||||
|  | TEST_FILE = None | ||||||
|  | SEC_LEVELS = ["0: Backend analysis only.", "1: Kill offending processes.", "2: Block offending connections using firewall.", "3: Kill and block connections and processes."] | ||||||
|  |  | ||||||
|  | displaydata = None | ||||||
|  | settings = None | ||||||
|  |  | ||||||
|  | killme = False | ||||||
|  |  | ||||||
|  | def loaddata(): | ||||||
|  |     global TEST_FILE | ||||||
|  |     try: | ||||||
|  |         TEST_FILE = pd.read_csv(find_data_file(filename), skiprows=1) | ||||||
|  |         TEST_FILE = TEST_FILE.iloc[1:, :] | ||||||
|  |         TEST_FILE.columns = ['Executable', 'Protocol', 'Source IP', 'Destination IP',  'Status', 'PID'] | ||||||
|  |         #fprint(TEST_FILE) | ||||||
|  |         #fprint(len(TEST_FILE)) | ||||||
|  |         #fprint(TEST_FILE.iloc[1, 1]) | ||||||
|  |     except FileNotFoundError: | ||||||
|  |         pass | ||||||
|  |  | ||||||
|  |  | ||||||
|  |      | ||||||
|  | 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, 675)) | ||||||
|  |         panel = ServerPanel(self) | ||||||
|  |         self.SetIcon(wx.Icon(find_data_file("icon.ico"), wx.BITMAP_TYPE_ICO)) | ||||||
|  |  | ||||||
|  |         self.Show() | ||||||
|  |  | ||||||
|  |     def on_edit(self, event): | ||||||
|  |         fprint('in on_edit', settings) | ||||||
|  |  | ||||||
|  |     def on_window(self, event): | ||||||
|  |        return | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class HelpFrame(wx.Frame): | ||||||
|  |     """ | ||||||
|  |     Class used for creating frames other than the main one | ||||||
|  |     """ | ||||||
|  |     def __init__(self): | ||||||
|  |         wx.Frame.__init__(self, None, -1, 'Help', size=(600, 250)) | ||||||
|  |         panel = HelpPanel(self) | ||||||
|  |         self.SetIcon(wx.Icon(find_data_file("icon.ico"), wx.BITMAP_TYPE_ICO)) | ||||||
|  |         self.Show() | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # Panel with all the login widgets | ||||||
|  | class LoginPanel(wx.Panel): | ||||||
|  |     def __init__(self, parent): | ||||||
|  |         super(LoginPanel, self).__init__(parent) | ||||||
|  |         self.SetBackgroundColour((44, 51, 51)) | ||||||
|  |         basicLabel = wx.StaticText(self, -1, "Username") | ||||||
|  |         basicLabel.SetForegroundColour((255,255,255)) | ||||||
|  |         global basicText | ||||||
|  |         global pwdText | ||||||
|  |         basicText = wx.TextCtrl(self, -1, "", size=(175, -1)) | ||||||
|  |         # basicText.SetInsertionPoint(0) | ||||||
|  |         pwdLabel = wx.StaticText(self, -1, "Password") | ||||||
|  |         pwdText = wx.TextCtrl(self, -1, "", size=(175, -1), style=wx.TE_PASSWORD) | ||||||
|  |         #pwdText.Bind(wx.EVT_TEXT_ENTER, self.on_login) # press enter in password field to login | ||||||
|  |         pwdLabel.SetForegroundColour((255, 255, 255)) | ||||||
|  |         vbox = wx.BoxSizer(wx.VERTICAL) | ||||||
|  |         hbox = wx.BoxSizer(wx.HORIZONTAL) | ||||||
|  |         vbox.Add(basicLabel, 0, wx.ALIGN_CENTER | 100, 5) | ||||||
|  |         vbox.Add(basicText, 0, wx.ALIGN_CENTER | 100, 5) | ||||||
|  |         vbox.Add(pwdLabel, 0, wx.ALIGN_CENTER | 100, 5) | ||||||
|  |         vbox.Add(pwdText, 0, wx.ALIGN_CENTER | 100, 5) | ||||||
|  |         login_button = wx.Button(self, label='Login') | ||||||
|  |         login_button.Bind(wx.EVT_BUTTON, self.on_login) | ||||||
|  |         #help_button = wx.Button(self, label='Help') | ||||||
|  |         #help_button.Bind(wx.EVT_BUTTON, self.on_help) | ||||||
|  |         # signup_button = wx.Button(self, label='Sign Up') | ||||||
|  |         hbox.Add(login_button, 0, wx.ALL | 200, 20) | ||||||
|  |         # hbox.Add(signup_button, 0, wx.ALL | 200, 20) | ||||||
|  |         #hbox.Add(help_button, 0, wx.ALL | 200, 20) | ||||||
|  |         vbox.Add(hbox, 0, wx.ALIGN_CENTER | 100, 5) | ||||||
|  |         self.SetSizer(vbox) | ||||||
|  |  | ||||||
|  |     def on_login(self, event): | ||||||
|  |         # check for login verification | ||||||
|  |         settings["username"] = basicText.GetValue() | ||||||
|  |         settings["password"] = pwdText.GetValue() | ||||||
|  |         settings["login"] = True | ||||||
|  |         #self.Destroy() | ||||||
|  |         self.Close() | ||||||
|  |         self.Parent.Close() | ||||||
|  |         #OtherFrame() | ||||||
|  |  | ||||||
|  |     def on_help(self, event): | ||||||
|  |         HelpFrame() | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # Panel with all the login widgets | ||||||
|  | class HelpPanel(wx.Panel): | ||||||
|  |     def __init__(self, parent): | ||||||
|  |         super(HelpPanel, self).__init__(parent) | ||||||
|  |         self.SetBackgroundColour((44, 51, 51)) | ||||||
|  |         # basicLabel = wx.StaticText(self, -1, "Username") | ||||||
|  |         # basicLabel.SetForegroundColour((255,255,255)) | ||||||
|  |         # basicText = wx.TextCtrl(self, -1, "", size=(175, -1)) | ||||||
|  |         # | ||||||
|  |         # # basicText.SetInsertionPoint(0) | ||||||
|  |         # pwdLabel = wx.StaticText(self, -1, "Password") | ||||||
|  |         # pwdText = wx.TextCtrl(self, -1, "", size=(175, -1), style=wx.TE_PASSWORD) | ||||||
|  |         # pwdLabel.SetForegroundColour((255, 255, 255)) | ||||||
|  |         # vbox = wx.BoxSizer(wx.VERTICAL) | ||||||
|  |         # hbox = wx.BoxSizer(wx.HORIZONTAL) | ||||||
|  |         # vbox.Add(basicLabel, 0, wx.ALIGN_CENTER | 100, 5) | ||||||
|  |         # vbox.Add(basicText, 0, wx.ALIGN_CENTER | 100, 5) | ||||||
|  |         # vbox.Add(pwdLabel, 0, wx.ALIGN_CENTER | 100, 5) | ||||||
|  |         # vbox.Add(pwdText, 0, wx.ALIGN_CENTER | 100, 5) | ||||||
|  |         # login_button = wx.Button(self, label='Login') | ||||||
|  |         # login_button.Bind(wx.EVT_BUTTON, self.on_login) | ||||||
|  |         # help_button = wx.Button(self, label='Help') | ||||||
|  |         # # signup_button = wx.Button(self, label='Sign Up') | ||||||
|  |         # hbox.Add(login_button, 0, wx.ALL | 200, 20) | ||||||
|  |         # # hbox.Add(signup_button, 0, wx.ALL | 200, 20) | ||||||
|  |         # hbox.Add(help_button, 0, wx.ALL | 200, 20) | ||||||
|  |         # vbox.Add(hbox, 0, wx.ALIGN_CENTER | 100, 5) | ||||||
|  |         # self.SetSizer(vbox) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class ServerPanel(wx.Panel): | ||||||
|  |     def __init__(self, parent): | ||||||
|  |         super().__init__(parent, size=(500, 500)) | ||||||
|  |         #self.SetBackgroundColour((44, 51, 51)) | ||||||
|  |         self.main_sizer = wx.BoxSizer(wx.VERTICAL) | ||||||
|  |         self.secondary_sizer = wx.BoxSizer(wx.HORIZONTAL) | ||||||
|  |         self.sub_sizer_left = wx.BoxSizer(wx.VERTICAL) | ||||||
|  |         self.sub_sizer_right = wx.BoxSizer(wx.VERTICAL) | ||||||
|  |         self.sub_sizer_stats = wx.BoxSizer(wx.VERTICAL) | ||||||
|  |         self.sub_sizer_filter = wx.BoxSizer(wx.VERTICAL) | ||||||
|  |         self.row_obj_dict = {} | ||||||
|  |         self.list_ctrl = wx.ListCtrl( | ||||||
|  |             self, size=(-1, 400), | ||||||
|  |             style=wx.LC_REPORT | wx.BORDER_SUNKEN | ||||||
|  |         ) | ||||||
|  |         #tb = wx.ToolBar( self, -1) | ||||||
|  |         #self.ToolBar = tb | ||||||
|  |         #tb.SetToolBitmapSize(wx.Size(30, 3)) | ||||||
|  |         #tb.AddTool(wx.ID_ANY, '',wx.Bitmap(find_data_file("WXPython_30x30.png")),)  | ||||||
|  |         #tb.AddTool(wx.ID_ANY, '',wx.Bitmap(find_data_file("settings_30x30.png")))  | ||||||
|  |         #tb.Realize()  | ||||||
|  |         if settings["running"] == True: | ||||||
|  |             txt = "Status: Running (" + str(settings["config"]["core"]["level"]) + ")" | ||||||
|  |         else: | ||||||
|  |             txt = "Status: Not running" | ||||||
|  |  | ||||||
|  |         if settings["loggedin"] == True: | ||||||
|  |             logintxt = "Logged in" | ||||||
|  |         else: | ||||||
|  |             logintxt = "Not logged in" | ||||||
|  |          | ||||||
|  |         stattxt = "Statistics:\nBlocked Connections: " + str(settings["stats"][0]) + " \nAllowed Connections: " + str(settings["stats"][1]) + " \nUpload count: " + str(settings["stats"][2]) + " \nDownload count: " + str(settings["stats"][3]) + " \nBlock ratio: " + str("{:.4f}".format(settings["stats"][4])) | ||||||
|  |         self.statustext = wx.StaticText(self, label=txt) # pos=(20,20)) | ||||||
|  |         self.logintext = wx.StaticText(self, label=logintxt) # pos=(20,20)) | ||||||
|  |         self.stattext = wx.StaticText(self, label=stattxt) | ||||||
|  |         #self.main_sizer.Add(tb) | ||||||
|  |         #main_sizer.SetBackgroundColour((44, 51, 51)) | ||||||
|  |         # self.pnl1.SetBackgroundColour(wx.BLACK) | ||||||
|  |         self.handle_columns() | ||||||
|  |         #self.updatedata() | ||||||
|  |          | ||||||
|  |         self.main_sizer.Add(self.list_ctrl, 1, wx.ALL | wx.EXPAND, 20) | ||||||
|  |         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.secondary_sizer.Add(self.sub_sizer_filter, 0, wx.ALL | wx.CENTER, 20) | ||||||
|  |         self.secondary_sizer.Add(self.sub_sizer_stats, 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) | ||||||
|  |         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) | ||||||
|  |         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.quit_button = wx.Button(self, label='Quit IPPigeon') | ||||||
|  |         #self.login_button.SetBackgroundColour((205, 215, 206)) | ||||||
|  |         self.quit_button.Bind(wx.EVT_BUTTON, self.on_quit) | ||||||
|  |  | ||||||
|  |         self.blacklist_button = wx.Button(self, label='Add to blacklist') | ||||||
|  |         #self.login_button.SetBackgroundColour((205, 215, 206)) | ||||||
|  |         self.blacklist_button.Bind(wx.EVT_BUTTON, self.on_blacklist) | ||||||
|  |  | ||||||
|  |         self.whitelist_button = wx.Button(self, label='Add to whitelist') | ||||||
|  |         #self.login_button.SetBackgroundColour((205, 215, 206)) | ||||||
|  |         self.whitelist_button.Bind(wx.EVT_BUTTON, self.on_whitelist) | ||||||
|  |          | ||||||
|  |         self.log_button = wx.Button(self, label='Logs') | ||||||
|  |         self.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)     | ||||||
|  |  | ||||||
|  |         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_left.Add(self.log_button, 0, wx.CENTER | wx.ALL | 100, 5) | ||||||
|  |         self.sub_sizer_right.Add(self.login_button, 0, wx.CENTER | wx.ALL | 100, 5) | ||||||
|  |         self.sub_sizer_right.Add(self.quit_button, 0, wx.CENTER | wx.ALL | 100, 5) | ||||||
|  |         self.sub_sizer_stats.Add(self.stattext, 0, wx.CENTER | wx.ALL | 100, 5) | ||||||
|  |         self.sub_sizer_filter.Add(self.blacklist_button, 0, wx.CENTER | wx.ALL | 100, 5) | ||||||
|  |         self.sub_sizer_filter.Add(self.whitelist_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"]) | ||||||
|  |         self.quit_button.Enable(enable=settings["loggedin"]) | ||||||
|  |         if self.list_ctrl.GetFirstSelected() < 0: | ||||||
|  |             self.blacklist_button.Enable(enable=False) | ||||||
|  |             self.whitelist_button.Enable(enable=False) | ||||||
|  |         else: | ||||||
|  |             self.blacklist_button.Enable(enable=settings["loggedin"]) | ||||||
|  |             self.whitelist_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" | ||||||
|  |  | ||||||
|  |         stattxt = "Statistics:\nBlocked Connections: " + str(settings["stats"][0]) + " \nAllowed Connections: " + str(settings["stats"][1]) + " \nUpload count: " + str(settings["stats"][2]) + " \nDownload count: " + str(settings["stats"][3]) + " \nBlock ratio: " + str("{:.4f}".format(settings["stats"][4])) | ||||||
|  |          | ||||||
|  |         self.statustext.SetLabel(txt) | ||||||
|  |         self.logintext.SetLabel(logintxt) | ||||||
|  |         self.stattext.SetLabel(stattxt) | ||||||
|  |         if settings["newdata"] == True: | ||||||
|  |             settings["newdata"] = False | ||||||
|  |         else: | ||||||
|  |             wx.CallLater(100, self.updatedata) | ||||||
|  |             return | ||||||
|  |         fprint("updatedata called", settings) | ||||||
|  |         loaddata() | ||||||
|  |         list_total  = self.list_ctrl.GetItemCount() | ||||||
|  |         list_top    = self.list_ctrl.GetTopItem() | ||||||
|  |         list_pp     = self.list_ctrl.GetCountPerPage() | ||||||
|  |         list_bottom = min(list_top + list_pp, list_total - 1) | ||||||
|  |         if self.list_ctrl.DeleteAllItems(): | ||||||
|  |             fprint("Items deleted", settings) | ||||||
|  |         else: | ||||||
|  |             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 | ||||||
|  |             idx = 0 | ||||||
|  |             for app in settings["badapps"]: | ||||||
|  |                 #fprint(pid) | ||||||
|  |                 idx = i | ||||||
|  |                 if TEST_FILE.iloc[i, 5] == app: # "bad" pid, highlight in red at the top | ||||||
|  |                     fprint("BAD APP UI: " + str(app), settings) | ||||||
|  |                     idx = self.list_ctrl.InsertItem(0, TEST_FILE.iloc[i, 0]) | ||||||
|  |                     self.list_ctrl.SetItemBackgroundColour(idx, wx.Colour(200, 51, 51)) | ||||||
|  |                     break | ||||||
|  |             else: | ||||||
|  |                 idx = self.list_ctrl.InsertItem(i, TEST_FILE.iloc[i, 0]) | ||||||
|  |             #fprint(TEST_FILE.iloc[i, 5] + " in " + str(settings["badapps"])) | ||||||
|  |             #if TEST_FILE.iloc[i, 5] in settings["badapps"]: | ||||||
|  |              | ||||||
|  |                     #fprint("Got " + TEST_FILE.iloc[i, 5]) | ||||||
|  |             for j in range(1, 6): | ||||||
|  |                 #fprint(str(idx) + " " + str(TEST_FILE.iloc[i, 0])) | ||||||
|  |                 self.list_ctrl.SetItem(idx, j, str(TEST_FILE.iloc[i, j])) | ||||||
|  |                  | ||||||
|  |  | ||||||
|  |                 #fprint(i, j, TEST_FILE.iloc[i, j]) | ||||||
|  |         #self.SetSizer(self.main_sizer) | ||||||
|  |          | ||||||
|  |         self.list_ctrl.EnsureVisible((list_bottom - 1)) | ||||||
|  |         wx.CallLater(100, self.updatedata) | ||||||
|  |  | ||||||
|  |     def on_start(self, event): | ||||||
|  |         fprint('in on_start', settings) | ||||||
|  |         settings["running"] = True | ||||||
|  |  | ||||||
|  |     def on_stop(self, event): | ||||||
|  |         fprint('in on_stop', settings) | ||||||
|  |         settings["running"] = False | ||||||
|  |         util.clear_fwll() | ||||||
|  |  | ||||||
|  |     def on_window(self, event): | ||||||
|  |         fprint("open settings", settings) | ||||||
|  |         dg = GetData(parent = None) | ||||||
|  |         dg.ShowModal() | ||||||
|  |  | ||||||
|  |     def on_login(self, event): | ||||||
|  |         fprint("open login", settings) | ||||||
|  |         if settings["loggedin"] == True: | ||||||
|  |             settings["loggedin"] = False | ||||||
|  |             return | ||||||
|  |         dg2 = ServerFrame() | ||||||
|  |          | ||||||
|  |         #dg2.ShowModal() | ||||||
|  |     def on_quit(self, event): | ||||||
|  |         global killme | ||||||
|  |         killme.value += 1 | ||||||
|  |         self.Close() | ||||||
|  |         self.Parent.Close() | ||||||
|  |  | ||||||
|  |     def on_blacklist(self, event):  | ||||||
|  |         global settings | ||||||
|  |         tmp = settings["appendbad"] | ||||||
|  |         idx = self.list_ctrl.GetFirstSelected() | ||||||
|  |         if idx < 0: | ||||||
|  |             return | ||||||
|  |         proto = self.list_ctrl.GetItem(idx, 1).GetText() | ||||||
|  |         dest = self.list_ctrl.GetItem(idx, 3).GetText() | ||||||
|  |         destip, destport = dest.split(":") | ||||||
|  |         fprint([proto, destip, destport], settings) | ||||||
|  |         tmp.append(["N/A", proto, "N/A", "N/A", destip, destport, "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A"]) | ||||||
|  |         settings["appendbad"] = tmp | ||||||
|  |          | ||||||
|  |     def on_whitelist(self, event):  | ||||||
|  |         global settings | ||||||
|  |         tmp = settings["whitelist"] | ||||||
|  |         idx = self.list_ctrl.GetFirstSelected() | ||||||
|  |         if idx < 0: | ||||||
|  |             return | ||||||
|  |         proto = self.list_ctrl.GetItem(idx, 1).GetText() | ||||||
|  |         dest = self.list_ctrl.GetItem(idx, 3).GetText() | ||||||
|  |         pid = self.list_ctrl.GetItem(idx, 5).GetText() | ||||||
|  |         destip, destport = dest.split(":") | ||||||
|  |         fprint([proto, destip, destport], settings) | ||||||
|  |         tmp.append([destip, destport, int(pid)]) | ||||||
|  |         settings["whitelist"] = tmp | ||||||
|  |  | ||||||
|  |     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)) | ||||||
|  |         else: | ||||||
|  |             bmp = wx.Image(imageFile, wx.BITMAP_TYPE_ANY).ConvertToBitmap() | ||||||
|  |             self.bitmap = wx.StaticBitmap(self, -1, bmp, (0, 0)) | ||||||
|  |      | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class ServerFrame(wx.Frame): | ||||||
|  |     def __init__(self): | ||||||
|  |         super().__init__(parent=None, | ||||||
|  |                          title='Server Dashboard') | ||||||
|  |  | ||||||
|  |         self.panel = LoginPanel(self) | ||||||
|  |         # image = wx.StaticBitmap(self, wx.ID_ANY) | ||||||
|  |         # image.SetBitmap(wx.Bitmap('WXPython.png')) | ||||||
|  |         self.Show() | ||||||
|  |  | ||||||
|  | def openwindow(data, sets, kill): | ||||||
|  |     setup_child() | ||||||
|  |     global killme | ||||||
|  |     global settings | ||||||
|  |     global displaydata | ||||||
|  |     killme = kill | ||||||
|  |     displaydata = data | ||||||
|  |     settings = sets | ||||||
|  |     #if settings["loggedin"]: | ||||||
|  |     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") | ||||||
|  |      | ||||||
|  |     #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 | ||||||
|  |         #self.logs.Clear() | ||||||
|  |         tmp = settings["logMsg"] | ||||||
|  |         if (tmp 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") | ||||||
|  |                 tmp.remove(settings["logMsg"][i]) | ||||||
|  |                 i+=1 | ||||||
|  |         else: | ||||||
|  |             #self.logs.WriteText("settings is none :(") | ||||||
|  |             tmp.add("init string for list") | ||||||
|  |             logData.logLoop(self) | ||||||
|  |         settings["logMsg"] = tmp | ||||||
|  |         wx.CallLater(100, self.logLoop) | ||||||
|  |         #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): | ||||||
|  |         wx.Dialog.__init__(self, parent, wx.ID_ANY, "User Settings: ", size = (800,500)) | ||||||
|  |         self.p = wx.Panel(self, wx.ID_ANY) | ||||||
|  |          | ||||||
|  |         self.hostname = wx.StaticText(self.p, label="Host:", pos=(20,20)) | ||||||
|  |         self.hostnametext = wx.TextCtrl(self.p, value=settings["config"]["sftp"]["host"], pos=(180,20), size=(500,-1)) | ||||||
|  |  | ||||||
|  |         self.user = wx.StaticText(self.p, label="User: ", pos=(20,60)) | ||||||
|  |         self.usertext = wx.TextCtrl(self.p, value=settings["config"]["sftp"]["user"], pos=(180,60), size=(500,-1)) | ||||||
|  |  | ||||||
|  |         self.port = wx.StaticText(self.p, label="Port: ", pos=(20,100)) | ||||||
|  |         self.porttext = wx.TextCtrl(self.p, value=str(settings["config"]["sftp"]["port"]), pos=(180,100), size=(500,-1)) | ||||||
|  |  | ||||||
|  |         self.keyfile = wx.StaticText(self.p, label="Keyfile: ", pos=(20,140)) | ||||||
|  |         self.keyfiletext = wx.TextCtrl(self.p, value=settings["config"]["sftp"]["keyfile"], pos=(180,140), size=(500,-1)) | ||||||
|  |  | ||||||
|  |         self.filepathsend = wx.StaticText(self.p, label="Sending File Path: ", pos=(20,180)) | ||||||
|  |         self.filepathsendtext = wx.TextCtrl(self.p, value=settings["config"]["sftp"]["filepath"]["send"], pos=(180,180), size=(500,-1)) | ||||||
|  |  | ||||||
|  |         self.filepathsendlogin = wx.StaticText(self.p, label="Sending Login Path: ", pos=(20,220)) | ||||||
|  |         self.filepathsendlogintext = wx.TextCtrl(self.p, value=settings["config"]["sftp"]["filepath"]["sendlogin"], pos=(180,220), size=(500,-1)) | ||||||
|  |  | ||||||
|  |         self.filepathreceive = wx.StaticText(self.p, label="Receiving File Path: ", pos=(20,260)) | ||||||
|  |         self.filepathreceivetext = wx.TextCtrl(self.p, value=settings["config"]["sftp"]["filepath"]["receive"], pos=(180,260), size=(500,-1)) | ||||||
|  |  | ||||||
|  |         self.filepathreceivelogin = wx.StaticText(self.p, label="Receiving Login Path: ", pos=(20,300)) | ||||||
|  |         self.filepathreceivelogintext = wx.TextCtrl(self.p, value=settings["config"]["sftp"]["filepath"]["receivelogin"], pos=(180,300), size=(500,-1)) | ||||||
|  |  | ||||||
|  |         self.darkmode = wx.StaticText(self.p, label="Dark mode (On/Off): ", pos=(20,340)) | ||||||
|  |         self.darkmodetext = wx.TextCtrl(self.p, value=str(settings["config"]["ui"]["darkmode"]), pos=(180,340), size=(500,-1)) | ||||||
|  |  | ||||||
|  |         self.interval = wx.StaticText(self.p, label="Interval (sec): ", pos=(20,380)) | ||||||
|  |         self.intervaltext = wx.TextCtrl(self.p, value=str(settings["config"]["core"]["interval"]), pos=(180,380), size=(500,-1)) | ||||||
|  |  | ||||||
|  |         self.seclevel = wx.StaticText(self.p, label="Security Strength Level: ", pos=(20,420)) | ||||||
|  |         self.seclevelslider = wx.Slider(self.p, pos=(180,410), minValue=0, maxValue=3, style=wx.SL_HORIZONTAL | wx.SL_AUTOTICKS, value=settings["config"]["core"]["level"]) | ||||||
|  |         self.seclevel2 = wx.StaticText(self.p, label=SEC_LEVELS[settings["config"]["core"]["level"]], pos=(300,420)) | ||||||
|  |         self.seclevelslider.Bind(wx.EVT_SCROLL, self.level_upd) | ||||||
|  |         self.Bind(wx.EVT_CLOSE, self.OnQuit) | ||||||
|  |  | ||||||
|  |     def level_upd(self, event): | ||||||
|  |         self.seclevel2.SetLabel(SEC_LEVELS[self.seclevelslider.GetValue()]) | ||||||
|  |          | ||||||
|  |  | ||||||
|  |     def OnQuit(self, event): | ||||||
|  |         # save changes | ||||||
|  |         fprint("saving changes...", settings) | ||||||
|  |         config = settings["config"] | ||||||
|  |         config["sftp"]["host"] = self.hostnametext.GetValue() | ||||||
|  |         config["sftp"]["user"] = self.usertext.GetValue() | ||||||
|  |         config["sftp"]["port"] = int(self.porttext.GetValue()) | ||||||
|  |         config["sftp"]["keyfile"] = self.keyfiletext.GetValue() | ||||||
|  |         config["sftp"]["filepath"]["send"] = self.filepathsendtext.GetValue() | ||||||
|  |         config["sftp"]["filepath"]["sendlogin"] = self.filepathsendlogintext.GetValue() | ||||||
|  |         config["sftp"]["filepath"]["receive"] = self.filepathreceivetext.GetValue() | ||||||
|  |         config["sftp"]["filepath"]["receivelogin"] = self.filepathreceivelogintext.GetValue() | ||||||
|  |         config["ui"]["darkmode"] = bool(self.darkmodetext.GetValue()) | ||||||
|  |         config["core"]["interval"] = int(self.intervaltext.GetValue()) | ||||||
|  |         config["core"]["level"] = int(self.seclevelslider.GetValue()) | ||||||
|  |         settings["config"] = config | ||||||
|  |         settings["applyconfig"] = True | ||||||
|  |  | ||||||
|  |         self.result_name = None | ||||||
|  |         self.Destroy() | ||||||
|  |  | ||||||
|  |     def on_edit(self, event): | ||||||
|  |         print('in on_edit') | ||||||
|  |  | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     openwindow(list(), dict(), int()) | ||||||
							
								
								
									
										33
									
								
								release.sh
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								release.sh
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | |||||||
| #!/bin/bash | #!/bin/bash | ||||||
| set -x | #set -x | ||||||
|  |  | ||||||
| TOKEN=$(< token.txt) | TOKEN=$(< token.txt) | ||||||
| EDITOR=nano git commit -a | EDITOR=nano git commit -a | ||||||
| @@ -8,15 +8,20 @@ git push | |||||||
| COMMIT=$(git log | head -n 1 | cut -d' ' -f2) | COMMIT=$(git log | head -n 1 | cut -d' ' -f2) | ||||||
| echo $COMMIT | echo $COMMIT | ||||||
| export PATH=$PATH:"C:\Program Files\7-Zip" | export PATH=$PATH:"C:\Program Files\7-Zip" | ||||||
| DATE=$(date +%s) | TAG=$(date +%s) | ||||||
| 7z a -r release-$COMMIT.zip ./build/exe.win-amd64-3.10/* | "C:/Program Files/Python310/python.exe" setup.py build | ||||||
|  | sleep 2 | ||||||
|  | mv ./build/exe.win-amd64-3.10/ ./build/ippigeon-win | ||||||
|  | 7z a -r release-$COMMIT.zip ./build/ippigeon-win | ||||||
|  | 7z a -sfx7z.sfx IPPigeon-install.exe ./build/ippigeon-win | ||||||
|  | mv ./build/ippigeon-win/ ./build/exe.win-amd64-3.10 | ||||||
|  | #sleep 30 | ||||||
| DATA='{ | DATA='{ | ||||||
|   "body": "Autogenerated release", |   "body": "Autogenerated release", | ||||||
|   "draft": false, |   "draft": false, | ||||||
|   "name": "Development release", |   "name": "Development release", | ||||||
|   "prerelease": true, |   "prerelease": true, | ||||||
|   "tag_name": "'$DATE'", |   "tag_name": "'$TAG'", | ||||||
|   "target_commitish": "'$COMMIT'" |   "target_commitish": "'$COMMIT'" | ||||||
| }' | }' | ||||||
| OUT=$(curl -X 'POST' \ | OUT=$(curl -X 'POST' \ | ||||||
| @@ -27,12 +32,26 @@ OUT=$(curl -X 'POST' \ | |||||||
|  |  | ||||||
| ID=$(echo $OUT | cut -d',' -f 1 | cut -d':' -f 2) | ID=$(echo $OUT | cut -d',' -f 1 | cut -d':' -f 2) | ||||||
|  |  | ||||||
|  | OUT=$(curl -X 'POST' \ | ||||||
|  |   'https://git.deck.sh/api/v1/repos/Interfaz/ff/releases/'$ID'/assets?token='$TOKEN'' \ | ||||||
|  |   -H 'accept: application/json' \ | ||||||
|  |   -H 'Content-Type: multipart/form-data' \ | ||||||
|  |   -F 'attachment=@IPPigeon-install.exe;type=application/octet-stream') | ||||||
|  |  | ||||||
|  | URL=$(echo $OUT | cut -d',' -f 7 | cut -d\" -f4) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| OUT=$(curl -X 'POST' \ | OUT=$(curl -X 'POST' \ | ||||||
|   'https://git.deck.sh/api/v1/repos/Interfaz/ff/releases/'$ID'/assets?token='$TOKEN'' \ |   'https://git.deck.sh/api/v1/repos/Interfaz/ff/releases/'$ID'/assets?token='$TOKEN'' \ | ||||||
|   -H 'accept: application/json' \ |   -H 'accept: application/json' \ | ||||||
|   -H 'Content-Type: multipart/form-data' \ |   -H 'Content-Type: multipart/form-data' \ | ||||||
|   -F 'attachment=@'release-$COMMIT.zip';type=application/x-zip-compressed') |   -F 'attachment=@'release-$COMMIT.zip';type=application/x-zip-compressed') | ||||||
|  |  | ||||||
| URL=$(echo $OUT | cut -d',' -f 6 | cut -d\" -f4) | URLZIP=$(echo $OUT | cut -d',' -f 7 | cut -d\" -f4) | ||||||
| echo $URL | curl -d "Self extracting installer: $URL | ||||||
|  |  | ||||||
|  | Portable Zip: $URLZIP" https://notify.deck.sh/ipro-release | ||||||
|  |  | ||||||
| rm release-$COMMIT.zip | rm release-$COMMIT.zip | ||||||
|  | rm IPPigeon-install.exe | ||||||
							
								
								
									
										10
									
								
								requirements.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								requirements.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | fabric | ||||||
|  | paramiko | ||||||
|  | wxpython | ||||||
|  | cx_Freeze | ||||||
|  | pandas | ||||||
|  | pyyaml | ||||||
|  | numpy | ||||||
|  | bcrypt | ||||||
|  | plyer | ||||||
|  | playsound==1.2.2 | ||||||
							
								
								
									
										2
									
								
								run.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								run.sh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | |||||||
|  | "C:/Program Files/Python310/python.exe" setup.py build | ||||||
|  |  | ||||||
							
								
								
									
										
											BIN
										
									
								
								settings.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								settings.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 49 KiB | 
							
								
								
									
										
											BIN
										
									
								
								settings_30x30.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								settings_30x30.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 5.3 KiB | 
							
								
								
									
										9
									
								
								setup.py
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								setup.py
									
									
									
									
									
								
							| @@ -5,17 +5,22 @@ debug = True | |||||||
| debug = not debug | debug = not debug | ||||||
| # Dependencies are automatically detected, but it might need fine tuning. | # Dependencies are automatically detected, but it might need fine tuning. | ||||||
| # "packages": ["os"] is used as example only | # "packages": ["os"] is used as example only | ||||||
| build_exe_options = {"packages": ["os"], "excludes": ["tkinter"], "include_msvcr": True, "include_files": ["icon.png", "IPPigeon.lnk", "config.yml", "keyfile-admin.pem"], "optimize": 2} | build_exe_options = {"packages": ["os", "plyer.platforms.win.notification"], "excludes": ["tkinter"], "include_msvcr": True, "include_files": ["icon.png", "config.yml", "keyfile-admin.pem", "WXPython.png", "WXPython_30x30.png", "settings.png", "settings_30x30.png", "icon.ico", "music.mp3"], "optimize": 1} | ||||||
|  |  | ||||||
| # base="Win32GUI" should be used only for Windows GUI app | # base="Win32GUI" should be used only for Windows GUI app | ||||||
| base = None | base = None | ||||||
| if sys.platform == "win32" and not debug: | if sys.platform == "win32" and not debug: | ||||||
|     base = "Win32GUI" |     base = "Win32GUI" | ||||||
|  |  | ||||||
|  | if sys.platform == "linux" or sys.platform == "linux2" or sys.platform == "darwin": | ||||||
|  |     name = "IPPigeon" | ||||||
|  | else: | ||||||
|  |     name = "IPPigeon.exe" | ||||||
|  |  | ||||||
| setup( | setup( | ||||||
|     name="IP Pigeon", |     name="IP Pigeon", | ||||||
|     version="0.2.4", |     version="0.2.4", | ||||||
|     description="IP Pigeon client application", |     description="IP Pigeon client application", | ||||||
|     options={"build_exe": build_exe_options}, |     options={"build_exe": build_exe_options}, | ||||||
|     executables=[Executable("ippigeon.py", base=base)], |     executables=[Executable("ippigeon.py", base=base, icon="icon.ico", uac_admin=True, target_name=name)], | ||||||
| ) | ) | ||||||
							
								
								
									
										50
									
								
								ssh.py
									
									
									
									
									
								
							
							
						
						
									
										50
									
								
								ssh.py
									
									
									
									
									
								
							| @@ -1,14 +1,52 @@ | |||||||
|  | #from __future__ import with_statement | ||||||
| from fabric import Connection | from fabric import Connection | ||||||
| from util import find_data_file | from util import find_data_file | ||||||
| from util import setup_child | from util import setup_child | ||||||
| from util import fprint | from util import fprint | ||||||
|  | from util import macos | ||||||
|  | from invoke import exceptions | ||||||
|  | import sys | ||||||
|  |  | ||||||
| def sftp_send_data(res, config, filename): | c = None | ||||||
|  | settings = None | ||||||
|  |  | ||||||
|  | def sftp_send_data(config, filename, filetype): | ||||||
|     setup_child() |     setup_child() | ||||||
|     fprint("Connecting over SSH to " + config['sftp']['host']) |     if not macos: | ||||||
|  |         fprint("Connecting over SSH to " + config['sftp']['host'], settings) | ||||||
|  |         global c | ||||||
|  |         if c is None: | ||||||
|             c = Connection(host=config['sftp']['host'], user=config['sftp']['user'], port=config['sftp']['port'], connect_kwargs={"key_filename": find_data_file(config['sftp']['keyfile']),}) |             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']['send'])) |         fprint("Sending data over SFTP: " + filename, settings) | ||||||
|     fprint("Data sent over SFTP sucessfully") |         fprint(c.put(find_data_file(filename), remote=config['sftp']['filepath'][filetype]), settings) | ||||||
|     #command = 'ls ' + config['sftp']['filepath']['send'] |         fprint("Data sent over SFTP successfully", settings) | ||||||
|  |     #command = 'ls ' + config['sftp']['filepath'][filetype] | ||||||
|     #fprint(c.run(command)) |     #fprint(c.run(command)) | ||||||
|  |  | ||||||
|  | def check_for_file(config, filename, location): | ||||||
|  |     setup_child() | ||||||
|  |     fprint("Connecting over SSH to " + config['sftp']['host'], settings) | ||||||
|  |     global c | ||||||
|  |     if c is None: | ||||||
|  |         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, settings) | ||||||
|  |     try: | ||||||
|  |         res = c.run("ls -l " + config['sftp']['filepath'][location] + "/" + filename, hide=True) | ||||||
|  |         fprint("File " + filename + " exists!", settings) | ||||||
|  |         return c.run("cat " + config['sftp']['filepath'][location] + "/" + filename, hide=True) | ||||||
|  |     except exceptions.UnexpectedExit: | ||||||
|  |         return False | ||||||
|  |  | ||||||
|  | def run_ssh(config, command, location): | ||||||
|  |     setup_child() | ||||||
|  |     fprint("Connecting over SSH to " + config['sftp']['host'], settings) | ||||||
|  |     global c | ||||||
|  |     if c is None: | ||||||
|  |         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], settings) | ||||||
|  |     with c.cd(config['sftp']['filepath'][location]): | ||||||
|  |         fprint("Running ssh command: " + command, settings) | ||||||
|  |         res = c.run(command, hide=True, asynchronous=True) | ||||||
|  |         return res | ||||||
|  |  | ||||||
|   | |||||||
| @@ -7,6 +7,7 @@ from sys import platform | |||||||
| import sys | import sys | ||||||
| from util import find_data_file | from util import find_data_file | ||||||
| from util import fprint | from util import fprint | ||||||
|  | from util import setup_child | ||||||
|  |  | ||||||
| TRAY_TOOLTIP = 'IP Pigeon'  | TRAY_TOOLTIP = 'IP Pigeon'  | ||||||
|  |  | ||||||
| @@ -31,6 +32,7 @@ class TaskBarIcon(wx.adv.TaskBarIcon): | |||||||
|     def CreatePopupMenu(self): |     def CreatePopupMenu(self): | ||||||
|         menu = wx.Menu() |         menu = wx.Menu() | ||||||
|         create_menu_item(menu, 'Control Panel', self.on_open) |         create_menu_item(menu, 'Control Panel', self.on_open) | ||||||
|  |         create_menu_item(menu, 'Login test', self.on_login) | ||||||
|         menu.AppendSeparator() |         menu.AppendSeparator() | ||||||
|         create_menu_item(menu, 'Exit', self.on_exit) |         create_menu_item(menu, 'Exit', self.on_exit) | ||||||
|         return menu |         return menu | ||||||
| @@ -40,18 +42,24 @@ class TaskBarIcon(wx.adv.TaskBarIcon): | |||||||
|         self.SetIcon(icon, TRAY_TOOLTIP) |         self.SetIcon(icon, TRAY_TOOLTIP) | ||||||
|  |  | ||||||
|     def on_left_down(self, event):       |     def on_left_down(self, event):       | ||||||
|         fprint ('Tray icon was left-clicked.') |         fprint('Tray icon was left-clicked.', settings) | ||||||
|  |  | ||||||
|     def on_open(self, event): |     def on_open(self, event): | ||||||
|         foreground() |         settings["showui"] = True | ||||||
|         #self.close_popup() |         self.close_popup() | ||||||
|  |  | ||||||
|  |     def on_login(self, event): | ||||||
|  |         settings["username"] = "frontend" | ||||||
|  |         settings["password"] = "qwertyuiop" | ||||||
|  |         settings["login"] = True | ||||||
|  |  | ||||||
|     def on_exit(self, event): |     def on_exit(self, event): | ||||||
|         wx.CallAfter(self.Destroy) |         wx.CallAfter(self.Destroy) | ||||||
|         self.close_popup() |  | ||||||
|         #print("kill cmd") |  | ||||||
|         global killme |         global killme | ||||||
|         killme.value += 1 |         killme.value += 1 | ||||||
|  |         self.close_popup() | ||||||
|  |         #print("kill cmd") | ||||||
|  |          | ||||||
|  |  | ||||||
|     def close_popup(self): |     def close_popup(self): | ||||||
|         self.frame.Close() |         self.frame.Close() | ||||||
| @@ -61,14 +69,22 @@ class TaskbarApp(wx.App): | |||||||
|         frame=wx.Frame(None) |         frame=wx.Frame(None) | ||||||
|         self.SetTopWindow(frame) |         self.SetTopWindow(frame) | ||||||
|         TaskBarIcon(frame) |         TaskBarIcon(frame) | ||||||
|  |          | ||||||
|         return True |         return True | ||||||
|  |  | ||||||
| def background(data, sets, kill): | def background(data, sets, kill): | ||||||
|  |     setup_child() | ||||||
|     global killme |     global killme | ||||||
|  |     global settings | ||||||
|  |     global displaydata | ||||||
|     killme = kill |     killme = kill | ||||||
|     app = TaskbarApp(False) |     app = TaskbarApp(False) | ||||||
|     displaydata = data |     displaydata = data | ||||||
|     settings = sets |     settings = sets | ||||||
|  |     fprint("Creating taskbar icon", settings) | ||||||
|     app.MainLoop() |     app.MainLoop() | ||||||
|          |          | ||||||
| TRAY_ICON = find_data_file('icon.png') | 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() | ||||||
| @@ -1,55 +0,0 @@ | |||||||
| import wx.adv |  | ||||||
| import wx |  | ||||||
| TRAY_TOOLTIP = 'Name'  |  | ||||||
| TRAY_ICON = 'icon.png'  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| def create_menu_item(menu, label, func): |  | ||||||
|     item = wx.MenuItem(menu, -1, label) |  | ||||||
|     menu.Bind(wx.EVT_MENU, func, id=item.GetId()) |  | ||||||
|     menu.Append(item) |  | ||||||
|     return item |  | ||||||
|  |  | ||||||
|  |  | ||||||
| class TaskBarIcon(wx.adv.TaskBarIcon): |  | ||||||
|     def __init__(self, frame): |  | ||||||
|         self.frame = frame |  | ||||||
|         super(TaskBarIcon, self).__init__() |  | ||||||
|         self.set_icon(TRAY_ICON) |  | ||||||
|         self.Bind(wx.adv.EVT_TASKBAR_LEFT_DOWN, self.on_left_down) |  | ||||||
|  |  | ||||||
|     def CreatePopupMenu(self): |  | ||||||
|         menu = wx.Menu() |  | ||||||
|         create_menu_item(menu, 'Site', self.on_hello) |  | ||||||
|         menu.AppendSeparator() |  | ||||||
|         create_menu_item(menu, 'Exit', self.on_exit) |  | ||||||
|         return menu |  | ||||||
|  |  | ||||||
|     def set_icon(self, path): |  | ||||||
|         icon = wx.Icon(path) |  | ||||||
|         self.SetIcon(icon, TRAY_TOOLTIP) |  | ||||||
|  |  | ||||||
|     def on_left_down(self, event):       |  | ||||||
|         print ('Tray icon was left-clicked.') |  | ||||||
|  |  | ||||||
|     def on_hello(self, event): |  | ||||||
|         print ('Hello, world!') |  | ||||||
|  |  | ||||||
|     def on_exit(self, event): |  | ||||||
|         wx.CallAfter(self.Destroy) |  | ||||||
|         self.frame.Close() |  | ||||||
|  |  | ||||||
| class App(wx.App): |  | ||||||
|     def OnInit(self): |  | ||||||
|         frame=wx.Frame(None) |  | ||||||
|         self.SetTopWindow(frame) |  | ||||||
|         TaskBarIcon(frame) |  | ||||||
|         return True |  | ||||||
|  |  | ||||||
| def main(): |  | ||||||
|     app = App(False) |  | ||||||
|     app.MainLoop() |  | ||||||
|  |  | ||||||
|  |  | ||||||
| if __name__ == '__main__': |  | ||||||
|     main() |  | ||||||
							
								
								
									
										97
									
								
								util.py
									
									
									
									
									
								
							
							
						
						
									
										97
									
								
								util.py
									
									
									
									
									
								
							| @@ -4,12 +4,18 @@ import subprocess | |||||||
| import os | import os | ||||||
| from sys import platform | from sys import platform | ||||||
| import time as t | import time as t | ||||||
|  | from time import sleep | ||||||
| import uuid | import uuid | ||||||
|  | import csv | ||||||
|  |  | ||||||
| win32 = platform == "win32" | win32 = platform == "win32" | ||||||
| linux = platform == "linux" or platform == "linux2" | linux = platform == "linux" or platform == "linux2" | ||||||
| macos = platform == "darwin" | macos = platform == "darwin" | ||||||
| datafile = "" | datafile = "" | ||||||
|  | logMsg = "" | ||||||
|  | logCont = "" | ||||||
|  |  | ||||||
|  | settings = None | ||||||
|  |  | ||||||
| if win32: | if win32: | ||||||
|     sysid = hex(uuid.getnode()) |     sysid = hex(uuid.getnode()) | ||||||
| @@ -25,22 +31,50 @@ if win32: | |||||||
|     _, username = res.strip().rsplit("\n", 1) |     _, username = res.strip().rsplit("\n", 1) | ||||||
|     userid, sysdom = username.rsplit("\\", 1) |     userid, sysdom = username.rsplit("\\", 1) | ||||||
|  |  | ||||||
|  | if linux or macos: | ||||||
|  |     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).strip() | ||||||
|  |     #fprint(sysdom) | ||||||
|  |     #fprint("d") | ||||||
|  |  | ||||||
| def time(): | def time(): | ||||||
|     return int(t.time()) |     return int(t.time()) | ||||||
|  |  | ||||||
| def fprint(msg): | def kill(pid): | ||||||
|  |     setup_child() | ||||||
|  |     try: | ||||||
|  |         if pid > 4: | ||||||
|  |             fprint("Killing PID " + str(pid), settings) | ||||||
|  |             os.kill(int(pid), 9) | ||||||
|  |             fprint("Signal 9 sent to PID " + str(pid), settings) | ||||||
|  |     except: | ||||||
|  |         fprint("Unable to kill " + str(pid), settings) | ||||||
|  |  | ||||||
|  | def fprint(msg, settings = None): | ||||||
|     #if not getattr(sys, "frozen", False): |     #if not getattr(sys, "frozen", False): | ||||||
|     setup_child() |     setup_child() | ||||||
|     try: |     try: | ||||||
|         frm = inspect.stack()[1] |         frm = inspect.stack()[1] | ||||||
|          |          | ||||||
|         mod = inspect.getmodule(frm[0]) |         mod = inspect.getmodule(frm[0]) | ||||||
|         print('[' + mod.__name__ + ":" + frm.function + ']:', 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: |     except Exception as e: | ||||||
|         try: |         try: | ||||||
|             print('[????:' + frm.function + ']:', msg) |             print('[????:' + frm.function + ']:', str(msg)) | ||||||
|  |             print('[util:fprint]: ' + str(e)) | ||||||
|         except: |         except: | ||||||
|             print('[????]:', msg) |             print('[????]:', str(msg)) | ||||||
|          |          | ||||||
|          |          | ||||||
|    # else: |    # else: | ||||||
| @@ -56,8 +90,7 @@ def find_data_file(filename): | |||||||
|         datadir = os.path.dirname(__file__) |         datadir = os.path.dirname(__file__) | ||||||
|     return os.path.join(datadir, filename) |     return os.path.join(datadir, filename) | ||||||
|  |  | ||||||
| def run_ps(cmd): | def run_cmd(cmd): | ||||||
|     fprint("init PS") |  | ||||||
|     if win32: |     if win32: | ||||||
|         startupinfo = subprocess.STARTUPINFO() |         startupinfo = subprocess.STARTUPINFO() | ||||||
|         #print("DICKS") |         #print("DICKS") | ||||||
| @@ -68,17 +101,23 @@ def run_ps(cmd): | |||||||
|         #else: |         #else: | ||||||
|         #    print("alt") |         #    print("alt") | ||||||
|         startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW    # , "-WindowStyle", "hidden" |         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) |         completed = subprocess.run(["powershell", "-Command", cmd], capture_output=True, startupinfo=startupinfo) | ||||||
|         fprint("ran PS command sucessfully") |         fprint("ran PS command successfully", settings) | ||||||
|         #completed = subprocess.run(["powershell", "-WindowStyle", "hidden", "-Command", cmd], capture_output=True, startupinfo=startupinfo) |         #completed = subprocess.run(["powershell", "-WindowStyle", "hidden", "-Command", cmd], capture_output=True, startupinfo=startupinfo) | ||||||
|      |         return completed | ||||||
|  |     if linux or macos: | ||||||
|  |         fprint("running sh command: " + cmd, settings) | ||||||
|  |         completed = subprocess.run(["sh", "-c", cmd], capture_output=True) | ||||||
|  |         fprint("ran sh command successfully", settings) | ||||||
|         return completed |         return completed | ||||||
|  |  | ||||||
| def setup_child(): | def setup_child(sets=None): | ||||||
|     if not getattr(sys, "frozen", False): |     if not getattr(sys, "frozen", False): | ||||||
|         sys.stdout = Logger(filename=find_data_file("output.log")) |         sys.stdout = Logger(filename=find_data_file("output.log")) | ||||||
|         sys.stderr = 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): | class Logger(object): | ||||||
|     def __init__(self, filename="output.log"): |     def __init__(self, filename="output.log"): | ||||||
| @@ -95,4 +134,40 @@ class Logger(object): | |||||||
|             sleep(0) |             sleep(0) | ||||||
|          |          | ||||||
|     def flush(self): |     def flush(self): | ||||||
|         print("") |         print("", end="") | ||||||
|  |  | ||||||
|  | def clear_fwll(): | ||||||
|  |     if win32: | ||||||
|  |         run_cmd('Remove-NetFirewallRule -Group "IPPigeon"') | ||||||
|  |     if linux: | ||||||
|  |         run_cmd("nft delete table ip ippigeon") | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def write_stats(stats): | ||||||
|  |     fprint("Writing stats", settings) | ||||||
|  |     tmp = list() | ||||||
|  |     tmp.append(["connections blocked", "connections allowed", "data uploaded", "data recieved", "block ratio"]) | ||||||
|  |     tmp.append(stats) | ||||||
|  |      | ||||||
|  |     with open(find_data_file("stats.csv"), "w", newline="") as f: | ||||||
|  |         writer = csv.writer(f) | ||||||
|  |         writer.writerows(tmp) | ||||||
|  |     fprint("Done writing stats", settings) | ||||||
|  |  | ||||||
|  | def read_stats(): | ||||||
|  |     with open(find_data_file("stats.csv"), newline='') as csvfile: | ||||||
|  |         csvreader = csv.reader(csvfile, delimiter=',', quotechar='|') | ||||||
|  |         header = True | ||||||
|  |         fprint(csvreader, settings) | ||||||
|  |         data = list() | ||||||
|  |         for line in csvreader: | ||||||
|  |             fprint(line, settings) | ||||||
|  |             if header: | ||||||
|  |                 header = False | ||||||
|  |                 continue | ||||||
|  |             data = line | ||||||
|  |         for idx in range(len(data) - 1): | ||||||
|  |             data[idx] = int(data[idx]) | ||||||
|  |         data[len(data) - 1] = float(data[len(data) - 1]) | ||||||
|  |         return data | ||||||
|  |              | ||||||
		Reference in New Issue
	
	Block a user