Compare commits

...

5 Commits

Author SHA1 Message Date
599a84a143 add statistics 2022-11-15 21:00:26 -06:00
e496e6c4c5 add macos initial support, ui changes 2022-11-15 19:25:14 -06:00
57de86f410 Add linux firewalling using nftables 2022-11-01 20:29:09 -05:00
12f93c04d2 Clean up extra code 2022-10-25 11:05:35 -05:00
37231e8b57 Remove login test 2022-10-25 01:41:15 -05:00
6 changed files with 234 additions and 145 deletions

View File

@ -52,7 +52,7 @@ def block_conn(config, datafile, res):
baddata = res baddata = res
fprint("Local loaded successfully") fprint("Local loaded successfully")
goodct = 0
#fprint(mydata) #fprint(mydata)
for line in mydata: for line in mydata:
#fprint(line) #fprint(line)
@ -67,13 +67,15 @@ def block_conn(config, datafile, res):
pid = int(pid) pid = int(pid)
except ValueError: except ValueError:
continue continue
found = False
for line in baddata: for line in baddata:
#fprint(destip + " " + line[4]) #fprint(destip + " " + line[4])
badsrcip = line[2] badsrcip = line[2]
baddestip = line[4] baddestip = line[4]
badpid = line[11] badpid = line[11]
if srcip == badsrcip or destip == baddestip and not pid in badapps: if srcip == badsrcip or destip == baddestip and not pid in badapps:
found = True
fprint("FLAG " + srcip + " " + destip + " " + str(pid)) fprint("FLAG " + srcip + " " + destip + " " + str(pid))
badapps.append(pid) badapps.append(pid)
badips.append(baddestip) badips.append(baddestip)
@ -81,4 +83,8 @@ def block_conn(config, datafile, res):
#fprint(badapps) #fprint(badapps)
#fprint("FLAG " + srcip + " " + destip + " " + str(pid)) #fprint("FLAG " + srcip + " " + destip + " " + str(pid))
#kill(pid) #kill(pid)
return badapps, badips, badlines
if not found:
goodct = goodct + 1
return badapps, badips, badlines, goodct

View File

@ -1,8 +1,8 @@
core: core:
autostart: false autostart: true
clockspeed: 20 clockspeed: 20
interval: 10 interval: 5
level: 3 level: 2
localadmin: true localadmin: true
sftp: sftp:
filepath: filepath:

View File

@ -48,7 +48,7 @@ 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: if linux or macos:
sysid = hex(uuid.getnode()) sysid = hex(uuid.getnode())
#fprint(sysid) #fprint(sysid)
datafile += sysid datafile += sysid
@ -67,10 +67,14 @@ def process_done(res):
if settings["running"] == True: if settings["running"] == True:
fprint("uploading to sftp...") fprint("uploading to sftp...")
#ssh.sftp_send_data(res, config, datafile) #ssh.sftp_send_data(res, config, datafile)
procdata_res = pool.apply_async(ssh.sftp_send_data, (config, datafile, 'send'), callback=upload_done) procdata_res = pool.apply_async(ssh.sftp_send_data, (config, datafile, 'send'), callback=upload_done)
def upload_done(res): def upload_done(res):
settings["block"] = True settings["block"] = True
tmpstat = settings["stats"]
tmpstat[2] += 1
settings["stats"] = tmpstat
def login_done(res): def login_done(res):
if not res: if not res:
@ -87,7 +91,16 @@ def blockdata_done(res):
tmpkill = settings["kill"] tmpkill = settings["kill"]
settings["kill"] = False settings["kill"] = False
#block_res = pool.apply_async(block.block_conn, (config, datafile, res, settings)) #block_res = pool.apply_async(block.block_conn, (config, datafile, res, settings))
block_pids, block_ips, block_data = block.block_conn(config, datafile, res) 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"] tmplist = settings["badapps"]
for x in block_pids: for x in block_pids:
@ -117,6 +130,11 @@ def blockdata_done(res):
settings["newdata"] = True settings["newdata"] = True
def readstat_done(res):
settings["stats"] = res
fprint("Read stats!" + str(settings["stats"]))
def killall(): def killall():
kids = active_children() kids = active_children()
for kid in kids: for kid in kids:
@ -138,10 +156,13 @@ def mainloop(pool):
#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 if counter == 0: # runs every INTERVAL
#fprint("start loop") #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))
@ -153,11 +174,11 @@ def mainloop(pool):
if settings["continueui"] == True: if settings["continueui"] == True:
settings["continueui"] = False settings["continueui"] = False
if ppanel is not None: #if ppanel is not None:
# login panel is already open # login panel is already open
ppanel.terminate() # ppanel.terminate()
ppanel = Process(target=panel.openwindow, args=(displaydata,settings,killme)) # ppanel = Process(target=panel.openwindow, args=(displaydata,settings,killme))
ppanel.start() # ppanel.start()
if settings["showui"] == True: if settings["showui"] == True:
settings["showui"] = False settings["showui"] = False
@ -199,14 +220,21 @@ def mainloop(pool):
if settings["fwll"] == True: if settings["fwll"] == True:
tmplist = settings["badlines"] tmplist = settings["badlines"]
tmpstat = settings["stats"]
tmpstat[0] += len(tmplist)
settings["stats"] = tmpstat
settings["badlines"] = list() settings["badlines"] = list()
for line in tmplist: for line in tmplist:
badproto = line[1] badproto = line[1]
badip = line[4] badip = line[4]
badport = line[5] badport = line[5]
fprint("Firewalling " + badip + ":" + str(badport)) fprint("Firewalling " + badip + ":" + str(badport))
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) if win32:
run_cmd(cmd) 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)
if settings["applyconfig"] == True: if settings["applyconfig"] == True:
@ -258,6 +286,7 @@ if __name__ == '__main__':
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.dict() # configuration settings = manager.dict() # configuration
# setup shared data variables
settings["login"] = False settings["login"] = False
settings["loggedin"] = False settings["loggedin"] = False
settings["showui"] = False settings["showui"] = False
@ -273,19 +302,29 @@ if __name__ == '__main__':
settings["fwll"] = 0 settings["fwll"] = 0
settings["running"] = config["core"]["autostart"] settings["running"] = config["core"]["autostart"]
settings["newdata"] = False settings["newdata"] = False
# 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() 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 counter = 0
while(keeprunning): while(keeprunning):

View File

@ -4,6 +4,7 @@ from util import fprint
from util import run_cmd from util import run_cmd
from util import win32 from util import win32
from util import linux from util import linux
from util import macos
import util import util
import time import time
import csv import csv
@ -108,6 +109,43 @@ def process(data):
writer.writerows(output2) writer.writerows(output2)
fprint("done creating csv") fprint("done creating csv")
if macos:
output = data.stdout.decode().split('\n') # split stdout into lines
#output = data.stdout.decode().split(',')
#fprint("output data: " + str(output))
output = [i for i in output if i]
if output[0].find("Not all processes could be identified") >= 0:
fprint("Not enough permissions")
raise PermissionError("Unable to acquire netstat data without admin!")
output2 = list()
output2.append([util.sysid, util.userid, util.sysdom, util.time()]) # add metadata
for line in output:
string_split = line.split(" ")
string_split = [i for i in string_split if i]
#fprint("Input: " + str(string_split))
if string_split[1].find("Multipath") >= 0:
break
if string_split[0].find("Active") >= 0 or string_split[0].find("Proto") >= 0:
continue
if len(string_split) == 10: # no connection status
#fprint(string_split)
string_split.append(string_split[-1])
string_split[-7] = "UNKNOWN"
string_split[-4] = string_split[-5]
#fprint(string_split)
output2.append(["Unknown", string_split[0], string_split[3], string_split[4], string_split[5], string_split[8]])
#fprint("FINAL CSV: " + str(output2))
with open(find_data_file(util.datafile), "w", newline="") as f:
writer = csv.writer(f)
writer.writerows(output2)
fprint("done creating csv")
def start(): def start():
setup_child() setup_child()
@ -123,3 +161,8 @@ def start():
fprint("data acquired") fprint("data acquired")
return data return data
if macos:
data = run_cmd("netstat -anv")
fprint("data acquired")
return data

214
panel.py
View File

@ -40,7 +40,7 @@ class OtherFrame(wx.Frame):
Class used for creating frames other than the main one Class used for creating frames other than the main one
""" """
def __init__(self): def __init__(self):
wx.Frame.__init__(self, None, -1, 'Server Panel', size=(1000, 620)) wx.Frame.__init__(self, None, -1, 'Server Panel', size=(1000, 675))
panel = ServerPanel(self) panel = ServerPanel(self)
self.SetIcon(wx.Icon(find_data_file("icon.ico"), wx.BITMAP_TYPE_ICO)) self.SetIcon(wx.Icon(find_data_file("icon.ico"), wx.BITMAP_TYPE_ICO))
@ -101,6 +101,9 @@ class LoginPanel(wx.Panel):
settings["username"] = basicText.GetValue() settings["username"] = basicText.GetValue()
settings["password"] = pwdText.GetValue() settings["password"] = pwdText.GetValue()
settings["login"] = True settings["login"] = True
#self.Destroy()
self.Close()
self.Parent.Close()
#OtherFrame() #OtherFrame()
def on_help(self, event): def on_help(self, event):
@ -142,7 +145,10 @@ class ServerPanel(wx.Panel):
super().__init__(parent, size=(500, 500)) super().__init__(parent, size=(500, 500))
#self.SetBackgroundColour((44, 51, 51)) #self.SetBackgroundColour((44, 51, 51))
self.main_sizer = wx.BoxSizer(wx.VERTICAL) self.main_sizer = wx.BoxSizer(wx.VERTICAL)
secondary_sizer = wx.BoxSizer(wx.HORIZONTAL) self.secondary_sizer = wx.BoxSizer(wx.HORIZONTAL)
self.sub_sizer_left = wx.BoxSizer(wx.VERTICAL)
self.sub_sizer_right = wx.BoxSizer(wx.VERTICAL)
self.sub_sizer_stats = wx.BoxSizer(wx.VERTICAL)
self.row_obj_dict = {} self.row_obj_dict = {}
self.list_ctrl = wx.ListCtrl( self.list_ctrl = wx.ListCtrl(
self, size=(-1, 400), self, size=(-1, 400),
@ -159,37 +165,65 @@ class ServerPanel(wx.Panel):
else: else:
txt = "Status: Not running" 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(settings["stats"][4])
self.statustext = wx.StaticText(self, label=txt) # pos=(20,20)) 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) #self.main_sizer.Add(tb)
#main_sizer.SetBackgroundColour((44, 51, 51)) #main_sizer.SetBackgroundColour((44, 51, 51))
# self.pnl1.SetBackgroundColour(wx.BLACK) # self.pnl1.SetBackgroundColour(wx.BLACK)
self.handle_columns() self.handle_columns()
#self.updatedata() #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_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.sub_sizer_right.Add(self.statustext, 0, wx.CENTER | wx.ALL | 100, 5)
self.sub_sizer_right.Add(self.logintext, 0, wx.CENTER | wx.ALL | 100, 5)
self.sub_sizer_left.Add(self.start_button, 0, wx.CENTER | wx.ALL | 100, 5)
self.sub_sizer_left.Add(self.stop_button, 0, wx.CENTER | wx.ALL | 100, 5)
self.sub_sizer_left.Add(self.secondary_frame_button, 0, wx.CENTER | wx.ALL | 100, 5)
self.sub_sizer_right.Add(self.login_button, 0, wx.CENTER | wx.ALL | 100, 5)
self.sub_sizer_stats.Add(self.stattext, 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.CallAfter(self.updatedata)
wx.GetApp().ProcessPendingEvents() wx.GetApp().ProcessPendingEvents()
self.main_sizer.Add(self.list_ctrl, 0, wx.ALL | wx.EXPAND, 20)
start_button = wx.Button(self, label='Start IPPigeon')
start_button.SetBackgroundColour((205, 215, 206))
start_button.Bind(wx.EVT_BUTTON, self.on_start)
#start_button.Bind(wx.EVT_ENTER_WINDOW, self.on_start)
stop_button = wx.Button(self, label='Stop IPPigeon')
stop_button.SetBackgroundColour('#F08080')
secondary_frame_button = wx.Button(self, label='Settings')
secondary_frame_button.Bind(wx.EVT_BUTTON, self.on_window)
# wx.BORDER(stop_button, wx.BORDER_NONE)
stop_button.Bind(wx.EVT_BUTTON, self.on_stop)
self.main_sizer.Add(self.statustext, 0, wx.CENTER | wx.ALL | 100, 5)
self.main_sizer.Add(start_button, 0, wx.CENTER | wx.ALL | 100, 5)
self.main_sizer.Add(stop_button, 0, wx.CENTER | wx.ALL | 100, 5)
self.main_sizer.Add(secondary_frame_button, 0, wx.CENTER | wx.ALL | 100, 5)
self.SetSizer(self.main_sizer)
def handle_columns(self): def handle_columns(self):
for col in range(len(COLUMN_NAMES)): for col in range(len(COLUMN_NAMES)):
self.list_ctrl.InsertColumn(0, COLUMN_NAMES[col], width=COLUMN_SIZES[col]) self.list_ctrl.InsertColumn(0, COLUMN_NAMES[col], width=COLUMN_SIZES[col])
def checklogin(self):
self.start_button.Enable(enable=settings["loggedin"])
self.stop_button.Enable(enable=settings["loggedin"])
self.secondary_frame_button.Enable(enable=settings["loggedin"])
def updatedata(self): def updatedata(self):
global settings global settings
if settings["running"] == True: if settings["running"] == True:
@ -197,11 +231,24 @@ class ServerPanel(wx.Panel):
else: else:
txt = "Status: Not running" 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(settings["stats"][4])
self.statustext.SetLabel(txt)
self.logintext.SetLabel(logintxt)
self.stattext.SetLabel(stattxt)
if settings["newdata"] == True: if settings["newdata"] == True:
settings["newdata"] = False settings["newdata"] = False
else: else:
wx.CallLater(1000, self.updatedata) wx.CallLater(100, self.updatedata)
return return
fprint("updatedata called") fprint("updatedata called")
loaddata() loaddata()
@ -232,8 +279,8 @@ class ServerPanel(wx.Panel):
#fprint(i, j, TEST_FILE.iloc[i, j]) #fprint(i, j, TEST_FILE.iloc[i, j])
#self.SetSizer(self.main_sizer) #self.SetSizer(self.main_sizer)
self.statustext.SetLabel(txt)
wx.CallLater(1000, self.updatedata) wx.CallLater(100, self.updatedata)
def on_start(self, event): def on_start(self, event):
fprint('in on_start') fprint('in on_start')
@ -249,6 +296,15 @@ class ServerPanel(wx.Panel):
dg = GetData(parent = None) dg = GetData(parent = None)
dg.ShowModal() dg.ShowModal()
def on_login(self, event):
fprint("open login")
if settings["loggedin"] == True:
settings["loggedin"] = False
return
dg2 = ServerFrame()
#dg2.ShowModal()
def ShowImage(self, imageFile): def ShowImage(self, imageFile):
if imageFile == "": if imageFile == "":
self.bitmap = wx.StaticBitmap(self, -1, size=(0, 0)) self.bitmap = wx.StaticBitmap(self, -1, size=(0, 0))
@ -276,20 +332,20 @@ def openwindow(data, sets, kill):
killme = kill killme = kill
displaydata = data displaydata = data
settings = sets settings = sets
if settings["loggedin"]: #if settings["loggedin"]:
fprint("Creating server panel") fprint("Creating server panel")
loaddata() loaddata()
app = wx.App(False) app = wx.App(False)
frame = OtherFrame() frame = OtherFrame()
frame.SetIcon(wx.Icon(find_data_file("icon.ico"), wx.BITMAP_TYPE_ICO)) frame.SetIcon(wx.Icon(find_data_file("icon.ico"), wx.BITMAP_TYPE_ICO))
app.MainLoop() app.MainLoop()
else: #else:
fprint("Creating login panel") #fprint("Creating login panel")
app = wx.App(False) #app = wx.App(False)
frame = ServerFrame() #frame = ServerFrame()
frame.SetIcon(wx.Icon(find_data_file("icon.ico"), wx.BITMAP_TYPE_ICO)) #frame.SetIcon(wx.Icon(find_data_file("icon.ico"), wx.BITMAP_TYPE_ICO))
app.MainLoop() #app.MainLoop()
class GetData(wx.Dialog): class GetData(wx.Dialog):
def __init__(self, parent): def __init__(self, parent):
@ -362,91 +418,3 @@ class GetData(wx.Dialog):
if __name__ == '__main__': if __name__ == '__main__':
openwindow(list(), dict(), int()) openwindow(list(), dict(), int())
"""class ServerPanel(wx.Frame):
def __init__(self, parent):
super().__init__(parent)
main_sizer = wx.BoxSizer(wx.VERTICAL)
secondary_sizer = wx.BoxSizer(wx.HORIZONTAL)
menubar = wx.MenuBar()
menu = wx.Menu()
menubar.Append(menu,"File")
self.SetMenuBar(menubar)
tb = wx.ToolBar( self, -1)
self.ToolBar = tb
#tb.AddTool( wx.ID_ANY, '', wx.Bitmap("IPPigeonLogo.png"))
tb.AddTool(wx.ID_ANY, '',wx.Bitmap("WXPython_30x30.png"),)
tb.AddTool(wx.ID_ANY, '',wx.Bitmap("settings_30x30.png"))
#tb.Bind(wx.EVT_TOOL, self.Onright)
#tb.Bind(wx.EVT_COMBOBOX,self.OnCombo)
#self.combo = wx.ComboBox( tb, 555, value = "Times", choices = ["Papyrus","Times","Comic Sans"])
#tb.AddControl(self.combo )
tb.Realize()
main_sizer.Add(tb)
self.Show(True)
self.row_obj_dict = {}
self.list_ctrl = wx.ListCtrl(
self, size=(-1, 100),
style=wx.LC_REPORT | wx.BORDER_SUNKEN
)
self.SetBackgroundColour(wx.BLACK)
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.SetBackgroundColour((205, 215, 206))
start_button.Bind(wx.EVT_BUTTON, self.on_edit)
stop_button = wx.Button(self, label='Stop')
stop_button.SetBackgroundColour('#F08080')
# wx.BORDER(stop_button, wx.BORDER_NONE)
stop_button.Bind(wx.EVT_BUTTON, self.on_edit)
main_sizer.Add(start_button, 0, wx.CENTER | 100, 5)
main_sizer.Add(stop_button, 0, wx.CENTER | 100, 5)
# start_button.SetWindowStyleFlag(wx.SIMPLE_BORDER)
# stop_button.SetWindowStyleFlag(wx.SIMPLE_BORDER)
# wx.StaticBitmap(self, -1, png, (500, 300), (png.GetWidth(), png.GetHeight()))
self.SetSizer(main_sizer)
def OnQuit(self, e):
self.Close()
def on_edit(self, event):
print('in on_edit')
def update_mp3_listing(self, folder_path):
print(folder_path)
# def Onright(self, event):
# self.text.AppendText(str(event.GetId())+"\n")
# def OnCombo(self,event):
# self.text.AppendText( self.combo.GetValue()+"\n")
class ServerFrame(wx.Frame):
def __init__(self):
super().__init__(parent=None, title='Server Dashboard')
self.frame = ServerPanel(self)
# image = wx.StaticBitmap(self, wx.ID_ANY)
# image.SetBitmap(wx.Bitmap('WXPython.png'))
self.Show()
if __name__ == '__main__':
app = wx.App(False)
frame = ServerFrame()
app.MainLoop()"""

37
util.py
View File

@ -6,6 +6,7 @@ from sys import platform
import time as t import time as t
from time import sleep 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"
@ -26,7 +27,7 @@ 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: if linux or macos:
sysid = hex(uuid.getnode()) sysid = hex(uuid.getnode())
#fprint(sysid) #fprint(sysid)
datafile += sysid datafile += sysid
@ -91,7 +92,7 @@ def run_cmd(cmd):
fprint("ran PS command successfully") fprint("ran PS command successfully")
#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 return completed
if linux: if linux or macos:
fprint("running sh command: " + cmd) fprint("running sh command: " + cmd)
completed = subprocess.run(["sh", "-c", cmd], capture_output=True) completed = subprocess.run(["sh", "-c", cmd], capture_output=True)
fprint("ran sh command successfully") fprint("ran sh command successfully")
@ -122,3 +123,35 @@ class Logger(object):
def clear_fwll(): def clear_fwll():
if win32: if win32:
run_cmd('Remove-NetFirewallRule -Group "IPPigeon"') run_cmd('Remove-NetFirewallRule -Group "IPPigeon"')
if linux:
run_cmd("nft delete table ip ippigeon")
def write_stats(stats):
fprint("Writing stats")
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")
def read_stats():
with open(find_data_file("stats.csv"), newline='') as csvfile:
csvreader = csv.reader(csvfile, delimiter=',', quotechar='|')
header = True
fprint(csvreader)
data = list()
for line in csvreader:
fprint(line)
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