Compare commits

...

25 Commits

Author SHA1 Message Date
5ba82bcd3b fix login panel 2022-11-30 21:55:42 -06:00
f759f8ed86 fix bugs that were discovered thanks to backend changes 2022-11-29 21:01:21 -06:00
a5cb840a61 Fix PID 0 issue 2022-11-29 19:34:56 -06:00
d5f85fb62a Attempt to fix notifications when frozen 2022-11-29 18:54:01 -06:00
788487d181 Add whitelist, tweak various code 2022-11-29 18:16:13 -06:00
2680f78cd6 Add notification support 2022-11-29 16:31:24 -06:00
d62fa3b79f Add manual blacklist functionality 2022-11-22 20:45:29 -06:00
86eeb716ac fix macos invalid data temporarily 2022-11-22 19:32:01 -06:00
f6cc6b6fef testing- add blacklist button 2022-11-22 19:14:21 -06:00
b4a46ad253 Add quit button 2022-11-22 18:49:41 -06:00
9ac35912dd update block ratio format 2022-11-22 16:29:06 -06:00
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
7e67920719 Merge branch 'testing' of https://git.deck.sh/Interfaz/ff into testing 2022-10-25 01:38:09 -05:00
b3d26107f9 git fix 2022-10-25 01:33:35 -05:00
a31cd877f2 Disable debug mode for demo, add status text 2022-10-25 01:21:20 -05:00
ba0e84ee95 Add icon to installer 2022-10-25 01:04:10 -05:00
8a803b9d02 Add icons, firewall blocking (windows) 2022-10-25 01:03:04 -05:00
def22643f6 fix UI data for blocked connections 2022-10-24 22:35:35 -05:00
f64ff86d83 More UI functionality 2022-10-24 22:13:29 -05:00
ae230af4fc continue work on blocking 2022-10-18 21:01:34 -05:00
6f2f8fc535 add numpy dep 2022-10-18 19:32:56 -05:00
14 changed files with 864 additions and 567570 deletions

View File

@ -3,14 +3,18 @@ import csv
from util import fprint from util import fprint
from util import find_data_file from util import find_data_file
from time import sleep from time import sleep
import bcrypt
def login(config, user, password, sysid): def login(config, user, password, sysid):
fprint("Attempting to login as " + user) fprint("Attempting to login as " + user)
filename = sysid + "login.csv" 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: with open(find_data_file(filename), "w", newline="") as f:
writer = csv.writer(f) writer = csv.writer(f)
writer.writerows([[user,password,sysid],]) writer.writerows([[user,password,sysid],])
fprint("done creating csv") fprint("done creating csv")
#return True
ssh.sftp_send_data(config, filename, 'sendlogin') ssh.sftp_send_data(config, filename, 'sendlogin')
command = "python3 login_service.py " + sysid command = "python3 login_service.py " + sysid
ssh.run_ssh(config, command, 'scripts') ssh.run_ssh(config, command, 'scripts')
@ -24,6 +28,7 @@ def login(config, user, password, sysid):
# try again # try again
count += 1 count += 1
sleep(0.1) sleep(0.1)
filename = sysid + "success.txt"
#raise ValueError("Unable to determine login status") #raise ValueError("Unable to determine login status")
else: else:
return False return False

104
block.py
View File

@ -4,13 +4,111 @@ 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 kill
import util import util
import time import time
import csv import csv
import ssh import ssh
def get_blocklist(config): def get_blocklist(config, settings):
setup_child() setup_child()
appendbad = settings["appendbad"]
whitelist = settings["whitelist"]
fprint("Downloading deny list from server") fprint("Downloading deny list from server")
data = check_for_file(config, "BadIPs.csv", "receive") try:
fprint(data.stdout) 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

View File

@ -1,20 +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:
send: /home/ec2-user/Incoming/Incoming_Data
sendlogin: /home/ec2-user/Incoming/Login
receive: /home/ec2-user/Outgoing/Outgoing_Data receive: /home/ec2-user/Outgoing/Outgoing_Data
receivelogin: /home/ec2-user/Outgoing/Login receivelogin: /home/ec2-user/Outgoing/Login
scripts: /home/ec2-user/scripts scripts: /home/ec2-user/scripts
send: /home/ec2-user/Incoming/Incoming_Data
sendlogin: /home/ec2-user/Incoming/Login
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
clockspeed: 20

View File

@ -8,6 +8,9 @@ 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
@ -16,7 +19,8 @@ import auth
import panel import panel
import block import block
badapps = [756, 278670]
history = list()
displaydata = None displaydata = None
settings = None settings = None
netdata_res = None netdata_res = None
@ -45,7 +49,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
@ -56,41 +60,94 @@ if linux:
#fprint(hostname) #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, (config, datafile, 'send')) #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): def login_done(res):
if not res: if not res:
fprint("Login failure") fprint("Login failure", settings)
settings["message"] = "Login failure" settings["message"] = "Login failure"
else: else:
fprint("Login result in main: " + str(res)) fprint("Login result in main: " + str(res), settings)
settings["loggedin"] = res settings["loggedin"] = res
settings["continueui"] = True 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 kill(pid):
setup_child()
fprint("Killing PID " + str(pid))
#os.kill(pid, 9)
fprint("Signal 9 sent to PID " + str(pid))
def mainloop(pool): def mainloop(pool):
# worker pool: netstat, netstat cleanup, upload, download, ui tasks # worker pool: netstat, netstat cleanup, upload, download, ui tasks
global config
global counter global counter
global netdata_res global netdata_res
global procdata_res global procdata_res
@ -100,14 +157,17 @@ 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))
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())
@ -115,11 +175,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
@ -132,15 +192,70 @@ def mainloop(pool):
settings["login"] = False settings["login"] = False
if settings["block"] == True: if settings["block"] == True and settings["running"] == True:
blockdata_res = pool.apply_async(block.get_blocklist, (config,)) #, callback=blockdata_done) #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 settings["block"] = False
#fprint(settings["killbox"])
if len(settings["killbox"]) > 0: if config["core"]["level"] == 0:
fprint("Kill opportunity!") settings["kill"] = False
for proc in settings["killbox"]: settings["fwll"] = False
pool.apply_async(kill, (proc,))
settings["killbox"].remove(proc) 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"])) sleep(interval / (interval * config["core"]["clockspeed"]))
counter += 1 counter += 1
@ -172,43 +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 Manager() as manager:
with Pool(processes=5) as pool:
with Pool(processes=5) as pool: with open(find_data_file('config.yml'), 'r') as fileread:
with Manager() as manager:
with open(find_data_file('config.yml'), 'r') as file:
#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.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
settings["continueui"] = False settings["continueui"] = False
settings["killbox"] = list() settings["killbox"] = list()
settings["badapps"] = badapps settings["badapps"] = list()
settings["block"] = True 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 counter = 0
while(keeprunning): while(keeprunning):
mainloop(pool) mainloop(pool)

BIN
music.mp3 Normal file

Binary file not shown.

View File

@ -4,6 +4,8 @@ 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
from ippigeon import settings
import util import util
import time import time
import csv import csv
@ -12,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)
@ -68,13 +70,13 @@ 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: if linux:
output = data.stdout.decode().split('\n') # split stdout into lines output = data.stdout.decode().split('\n') # split stdout into lines
output = [i for i in output if i] output = [i for i in output if i]
if output[0].find("Not all processes could be identified") >= 0: if output[0].find("Not all processes could be identified") >= 0:
fprint("Not enough permissions") fprint("Not enough permissions", settings)
raise PermissionError("Unable to acquire netstat data without admin!") raise PermissionError("Unable to acquire netstat data without admin!")
output2 = list() output2 = list()
output2.append([util.sysid, util.userid, util.sysdom, util.time()]) # add metadata output2.append([util.sysid, util.userid, util.sysdom, util.time()]) # add metadata
@ -106,20 +108,62 @@ 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 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():
setup_child() setup_child()
fprint("netstat started") fprint("netstat started", settings)
if win32: if win32:
data = run_cmd("netstat -n -o -b") data = run_cmd("netstat -n -o -b")
fprint("data acquired") fprint("data acquired", settings)
return data return data
if linux: if linux:
data = run_cmd("netstat -atunpw") data = run_cmd("netstat -atunpw")
fprint("data acquired") 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
View 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()

567313
output.log

File diff suppressed because one or more lines are too long

511
panel.py
View File

@ -1,5 +1,7 @@
import glob import glob
import wx import wx
import logging
import sys
import wx.lib.buttons as buttons import wx.lib.buttons as buttons
import numpy as np import numpy as np
import pandas as pd import pandas as pd
@ -7,29 +9,47 @@ from util import sysid
from util import setup_child from util import setup_child
from util import fprint from util import fprint
from util import find_data_file from util import find_data_file
import util
BG_IMG = 'icon.png' BG_IMG = 'icon.png'
filename = sysid + "gendata.csv" filename = sysid + "gendata.csv"
COLUMN_NAMES = np.flip(['Executable', 'Proto', 'Source IP', 'Destination IP', 'Status', 'PID']) COLUMN_NAMES = np.flip(['Executable', 'Proto', 'Source IP', 'Destination IP', 'Status', 'PID'])
COLUMN_SIZES = np.flip([150, 50, 200, 200, 110, 65]) COLUMN_SIZES = np.flip([200, 50, 200, 200, 140, 100])
TEST_FILE = None 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 displaydata = None
settings = None settings = None
killme = False 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 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=(600, 250)) 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.Show() self.Show()
def on_edit(self, event): def on_edit(self, event):
fprint('in on_edit') fprint('in on_edit', settings)
def on_window(self, event): def on_window(self, event):
return return
@ -42,6 +62,7 @@ class HelpFrame(wx.Frame):
def __init__(self): def __init__(self):
wx.Frame.__init__(self, None, -1, 'Help', size=(600, 250)) wx.Frame.__init__(self, None, -1, 'Help', size=(600, 250))
panel = HelpPanel(self) panel = HelpPanel(self)
self.SetIcon(wx.Icon(find_data_file("icon.ico"), wx.BITMAP_TYPE_ICO))
self.Show() self.Show()
@ -68,12 +89,12 @@ class LoginPanel(wx.Panel):
vbox.Add(pwdText, 0, wx.ALIGN_CENTER | 100, 5) vbox.Add(pwdText, 0, wx.ALIGN_CENTER | 100, 5)
login_button = wx.Button(self, label='Login') login_button = wx.Button(self, label='Login')
login_button.Bind(wx.EVT_BUTTON, self.on_login) login_button.Bind(wx.EVT_BUTTON, self.on_login)
help_button = wx.Button(self, label='Help') #help_button = wx.Button(self, label='Help')
help_button.Bind(wx.EVT_BUTTON, self.on_help) #help_button.Bind(wx.EVT_BUTTON, self.on_help)
# signup_button = wx.Button(self, label='Sign Up') # signup_button = wx.Button(self, label='Sign Up')
hbox.Add(login_button, 0, wx.ALL | 200, 20) hbox.Add(login_button, 0, wx.ALL | 200, 20)
# hbox.Add(signup_button, 0, wx.ALL | 200, 20) # hbox.Add(signup_button, 0, wx.ALL | 200, 20)
hbox.Add(help_button, 0, wx.ALL | 200, 20) #hbox.Add(help_button, 0, wx.ALL | 200, 20)
vbox.Add(hbox, 0, wx.ALIGN_CENTER | 100, 5) vbox.Add(hbox, 0, wx.ALIGN_CENTER | 100, 5)
self.SetSizer(vbox) self.SetSizer(vbox)
@ -82,6 +103,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):
@ -122,69 +146,244 @@ class ServerPanel(wx.Panel):
def __init__(self, parent): def __init__(self, parent):
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)
main_sizer = wx.BoxSizer(wx.VERTICAL) self.secondary_sizer = wx.BoxSizer(wx.HORIZONTAL)
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.row_obj_dict = {}
self.list_ctrl = wx.ListCtrl( self.list_ctrl = wx.ListCtrl(
self, size=(-1, 200), self, size=(-1, 400),
style=wx.LC_REPORT | wx.BORDER_SUNKEN style=wx.LC_REPORT | wx.BORDER_SUNKEN
) )
tb = wx.ToolBar( self, -1) #tb = wx.ToolBar( self, -1)
self.ToolBar = tb #self.ToolBar = tb
tb.SetToolBitmapSize(wx.Size(30, 3)) #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("WXPython_30x30.png")),)
tb.AddTool(wx.ID_ANY, '',wx.Bitmap(find_data_file("settings_30x30.png"))) #tb.AddTool(wx.ID_ANY, '',wx.Bitmap(find_data_file("settings_30x30.png")))
tb.Realize() #tb.Realize()
main_sizer.Add(tb) 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)) #main_sizer.SetBackgroundColour((44, 51, 51))
# self.pnl1.SetBackgroundColour(wx.BLACK) # self.pnl1.SetBackgroundColour(wx.BLACK)
self.handle_columns() self.handle_columns()
global settings #self.updatedata()
for i in range(len(TEST_FILE)):
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"]:
for pid in settings["badapps"]:
#fprint(pid)
if str(TEST_FILE.iloc[i, 5]) == str(pid):
#fprint("Got " + TEST_FILE.iloc[i, 5])
settings["killbox"].append(pid)
fprint(settings["killbox"])
self.list_ctrl.SetItemBackgroundColour(i, wx.Colour(200, 51, 51))
for j in range(1, 6):
self.list_ctrl.SetItem(i, j, str(TEST_FILE.iloc[i, j]))
#fprint(i, j, TEST_FILE.iloc[i, j]) 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)
main_sizer.Add(self.list_ctrl, 0, wx.ALL | wx.EXPAND, 20) self.secondary_sizer.Add(self.sub_sizer_left, 0, wx.ALL | wx.CENTER, 20)
start_button = wx.Button(self, label='Start') self.secondary_sizer.Add(self.sub_sizer_right, 0, wx.ALL | wx.CENTER, 20)
start_button.SetBackgroundColour((205, 215, 206)) self.secondary_sizer.Add(self.sub_sizer_filter, 0, wx.ALL | wx.CENTER, 20)
start_button.Bind(wx.EVT_BUTTON, self.on_edit) self.secondary_sizer.Add(self.sub_sizer_stats, 0, wx.ALL | wx.CENTER, 20)
start_button.Bind(wx.EVT_ENTER_WINDOW, self.on_edit) self.start_button = wx.Button(self, label='Start IPPigeon')
stop_button = wx.Button(self, label='Stop') self.start_button.SetBackgroundColour((205, 215, 206))
stop_button.SetBackgroundColour('#F08080') self.start_button.Bind(wx.EVT_BUTTON, self.on_start)
#start_button.Bind(wx.EVT_ENTER_WINDOW, self.on_start)
secondary_frame_button = wx.Button(self, label='Window') self.stop_button = wx.Button(self, label='Stop IPPigeon')
secondary_frame_button.Bind(wx.EVT_BUTTON, self.on_window) 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) # wx.BORDER(stop_button, wx.BORDER_NONE)
stop_button.Bind(wx.EVT_BUTTON, self.on_edit) self.stop_button.Bind(wx.EVT_BUTTON, self.on_stop)
main_sizer.Add(start_button, 0, wx.CENTER | wx.ALL | 100, 5)
main_sizer.Add(stop_button, 0, wx.CENTER | wx.ALL | 100, 5) self.login_button = wx.Button(self, label='Login')
main_sizer.Add(secondary_frame_button, 0, wx.CENTER | wx.ALL | 100, 5) #self.login_button.SetBackgroundColour((205, 215, 206))
self.SetSizer(main_sizer) 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): 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"])
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]))
def on_edit(self, event): #fprint(i, j, TEST_FILE.iloc[i, j])
fprint('in on_edit') #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): def on_window(self, event):
OtherFrame() 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): def ShowImage(self, imageFile):
if imageFile == "": if imageFile == "":
@ -194,6 +393,7 @@ class ServerPanel(wx.Panel):
self.bitmap = wx.StaticBitmap(self, -1, bmp, (0, 0)) self.bitmap = wx.StaticBitmap(self, -1, bmp, (0, 0))
class ServerFrame(wx.Frame): class ServerFrame(wx.Frame):
def __init__(self): def __init__(self):
super().__init__(parent=None, super().__init__(parent=None,
@ -212,116 +412,141 @@ 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", settings)
global TEST_FILE loaddata()
try: app = wx.App(False)
TEST_FILE = pd.read_csv(find_data_file(filename), skiprows=1) frame = OtherFrame()
TEST_FILE = TEST_FILE.iloc[1:, :] frame.SetIcon(wx.Icon(find_data_file("icon.ico"), wx.BITMAP_TYPE_ICO))
TEST_FILE.columns = ['Executable', 'Protocol', 'Source IP', 'Destination IP', 'Status', 'PID'] app.MainLoop()
fprint(TEST_FILE) #else:
fprint(len(TEST_FILE)) #fprint("Creating login panel")
#fprint(TEST_FILE.iloc[1, 1])
except FileNotFoundError:
pass
app = wx.App(False)
frame = OtherFrame()
app.MainLoop()
else:
fprint("Creating login panel")
app = wx.App(False) #app = wx.App(False)
frame = ServerFrame() #frame = ServerFrame()
app.MainLoop() #frame.SetIcon(wx.Icon(find_data_file("icon.ico"), wx.BITMAP_TYPE_ICO))
#app.MainLoop()
if __name__ == '__main__':
openwindow(list(), dict(), int())
class RedirectText(object):
def __init__(self,aWxTextCtrl):
self.out = aWxTextCtrl
def write(self,string):
self.out.WriteText(string)
class logData(wx.Dialog):
"""class ServerPanel(wx.Frame):
def __init__(self, parent): def __init__(self, parent):
super().__init__(parent) wx.Dialog.__init__(self, parent, wx.ID_ANY, "Logs: ", size = (800,500))
main_sizer = wx.BoxSizer(wx.VERTICAL) self.p = wx.Panel(self, wx.ID_ANY)
secondary_sizer = wx.BoxSizer(wx.HORIZONTAL) #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
menubar = wx.MenuBar() def logLoop(self):
menu = wx.Menu() #self.logs.WriteText("before while loop\n")
menubar.Append(menu,"File") i=0
self.SetMenuBar(menubar) #self.logs.Clear()
tmp = settings["logMsg"]
tb = wx.ToolBar( self, -1) if (tmp is not None):
self.ToolBar = tb 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")
#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) #redir = RedirectText(self.logs)
#tb.Bind(wx.EVT_COMBOBOX,self.OnCombo) #sys.stdout = redir
#self.combo = wx.ComboBox( tb, 555, value = "Times", choices = ["Papyrus","Times","Comic Sans"]) #self.logs.WriteText(redir)
#tb.AddControl(self.combo ) #self.logs.LoadFile('output.log')
tb.Realize()
main_sizer.Add(tb)
self.Show(True) #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()])
self.row_obj_dict = {} def OnQuit(self, event):
self.list_ctrl = wx.ListCtrl( # save changes
self, size=(-1, 100), fprint("saving changes...", settings)
style=wx.LC_REPORT | wx.BORDER_SUNKEN config = settings["config"]
) config["sftp"]["host"] = self.hostnametext.GetValue()
self.SetBackgroundColour(wx.BLACK) config["sftp"]["user"] = self.usertext.GetValue()
self.list_ctrl.InsertColumn(0, 'Server name', width=140) config["sftp"]["port"] = int(self.porttext.GetValue())
self.list_ctrl.InsertColumn(1, 'Port number', width=140) config["sftp"]["keyfile"] = self.keyfiletext.GetValue()
self.list_ctrl.InsertColumn(2, 'Status', width=200) config["sftp"]["filepath"]["send"] = self.filepathsendtext.GetValue()
main_sizer.Add(self.list_ctrl, 0, wx.ALL | wx.EXPAND, 5) config["sftp"]["filepath"]["sendlogin"] = self.filepathsendlogintext.GetValue()
start_button = wx.Button(self, label='Start') config["sftp"]["filepath"]["receive"] = self.filepathreceivetext.GetValue()
start_button.SetBackgroundColour((205, 215, 206)) config["sftp"]["filepath"]["receivelogin"] = self.filepathreceivelogintext.GetValue()
start_button.Bind(wx.EVT_BUTTON, self.on_edit) config["ui"]["darkmode"] = bool(self.darkmodetext.GetValue())
stop_button = wx.Button(self, label='Stop') config["core"]["interval"] = int(self.intervaltext.GetValue())
stop_button.SetBackgroundColour('#F08080') config["core"]["level"] = int(self.seclevelslider.GetValue())
# wx.BORDER(stop_button, wx.BORDER_NONE) settings["config"] = config
stop_button.Bind(wx.EVT_BUTTON, self.on_edit) settings["applyconfig"] = True
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.result_name = None
self.Close() self.Destroy()
def on_edit(self, event): def on_edit(self, event):
print('in on_edit') 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__': if __name__ == '__main__':
app = wx.App(False) openwindow(list(), dict(), int())
frame = ServerFrame()
app.MainLoop()"""

View File

@ -4,3 +4,7 @@ wxpython
cx_Freeze cx_Freeze
pandas pandas
pyyaml pyyaml
numpy
bcrypt
plyer
playsound==1.2.2

View File

@ -2,10 +2,10 @@ import sys
from cx_Freeze import setup, Executable from cx_Freeze import setup, Executable
debug = True 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", "config.yml", "keyfile-admin.pem", "WXPython.png", "WXPython_30x30.png", "settings.png", "settings_30x30.png"], "optimize": 1} 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

38
ssh.py
View File

@ -3,38 +3,50 @@ 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 from invoke import exceptions
import sys import sys
c = None
settings = None
def sftp_send_data(config, filename, filetype): def sftp_send_data(config, filename, filetype):
setup_child() setup_child()
fprint("Connecting over SSH to " + config['sftp']['host']) if not macos:
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("Connecting over SSH to " + config['sftp']['host'], settings)
fprint("Sending data over SFTP: " + filename) global c
fprint(c.put(find_data_file(filename), remote=config['sftp']['filepath'][filetype])) if c is None:
fprint("Data sent over SFTP successfully") 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, settings)
fprint(c.put(find_data_file(filename), remote=config['sftp']['filepath'][filetype]), settings)
fprint("Data sent over SFTP successfully", settings)
#command = 'ls ' + config['sftp']['filepath'][filetype] #command = 'ls ' + config['sftp']['filepath'][filetype]
#fprint(c.run(command)) #fprint(c.run(command))
def check_for_file(config, filename, location): def check_for_file(config, filename, location):
setup_child() setup_child()
fprint("Connecting over SSH to " + config['sftp']['host']) fprint("Connecting over SSH to " + config['sftp']['host'], settings)
c = Connection(host=config['sftp']['host'], user=config['sftp']['user'], port=config['sftp']['port'], connect_kwargs={"key_filename": find_data_file(config['sftp']['keyfile']),}) global c
fprint("Checking for existence of file " + config['sftp']['filepath'][location] + "/" + filename) 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: try:
res = c.run("ls -l " + config['sftp']['filepath'][location] + "/" + filename, hide=True) res = c.run("ls -l " + config['sftp']['filepath'][location] + "/" + filename, hide=True)
fprint("File " + filename + " exists!") fprint("File " + filename + " exists!", settings)
return c.run("cat " + config['sftp']['filepath'][location] + "/" + filename, hide=True) return c.run("cat " + config['sftp']['filepath'][location] + "/" + filename, hide=True)
except exceptions.UnexpectedExit: except exceptions.UnexpectedExit:
return False return False
def run_ssh(config, command, location): def run_ssh(config, command, location):
setup_child() setup_child()
fprint("Connecting over SSH to " + config['sftp']['host']) fprint("Connecting over SSH to " + config['sftp']['host'], settings)
c = Connection(host=config['sftp']['host'], user=config['sftp']['user'], port=config['sftp']['port'], connect_kwargs={"key_filename": find_data_file(config['sftp']['keyfile']),}) global c
fprint("cd to " + config['sftp']['filepath'][location]) 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]): with c.cd(config['sftp']['filepath'][location]):
fprint("Running ssh command: " + command) fprint("Running ssh command: " + command, settings)
res = c.run(command, hide=True, asynchronous=True) res = c.run(command, hide=True, asynchronous=True)
return res return res

View File

@ -42,7 +42,7 @@ 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):
settings["showui"] = True settings["showui"] = True
@ -81,7 +81,7 @@ def background(data, sets, kill):
app = TaskbarApp(False) app = TaskbarApp(False)
displaydata = data displaydata = data
settings = sets settings = sets
fprint("Creating taskbar icon") fprint("Creating taskbar icon", settings)
app.MainLoop() app.MainLoop()
TRAY_ICON = find_data_file('icon.png') TRAY_ICON = find_data_file('icon.png')

79
util.py
View File

@ -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,7 +31,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
@ -39,17 +45,34 @@ if linux:
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 + ']:', str(msg)) logMsg = '[' + mod.__name__ + ":" + frm.function + ']:' + str(msg)
print(logMsg)
if (settings is not None):
tmpList = settings["logMsg"]
tmpList.append(logMsg)
settings["logMsg"] = tmpList
except Exception as e: except Exception as e:
try: try:
print('[????:' + frm.function + ']:', str(msg)) print('[????:' + frm.function + ']:', str(msg))
print('[util:fprint]: ' + str(e))
except: except:
print('[????]:', str(msg)) print('[????]:', str(msg))
@ -78,21 +101,23 @@ def run_cmd(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 successfully") 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 return completed
if linux: if linux or macos:
fprint("running sh command: " + cmd) fprint("running sh command: " + cmd, settings)
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", 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"):
@ -110,3 +135,39 @@ class Logger(object):
def flush(self): def flush(self):
print("", end="") 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