Compare commits

...

18 Commits

Author SHA1 Message Date
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
258918eecc yaml2 2022-10-18 19:24:00 -05:00
f781056b69 Merge branch 'testing' of https://git.deck.sh/Interfaz/ff into testing 2022-10-18 19:22:41 -05:00
2ee04b59d1 yaml 2022-10-18 19:22:32 -05:00
88b38d1492 start block code 2022-10-18 19:13:48 -05:00
bbb92d1fdb Add red highlighting, better align buttons 2022-10-18 16:08:45 -05:00
0b97b2287a Add new UI files 2022-10-18 12:41:10 -05:00
578eea1c1f Add UI import, add login to UI, etc 2022-10-17 13:50:39 -05:00
5c7cd9b0a5 Finish auth 2022-10-11 20:47:12 -05:00
a374ec73b4 Add login success print test 2022-10-11 20:20:08 -05:00
b0457865d6 change test user 2022-10-11 20:15:17 -05:00
832cd45239 fix hostname output on linux 2022-10-11 20:04:45 -05:00
eb3d5c8910 Add initial linux support 2022-10-11 19:59:32 -05:00
4fb575ba62 Remove extraneous files 2022-10-11 01:39:26 -05:00
44166a2507 Add login functionality (no hashing) 2022-10-11 01:36:50 -05:00
24 changed files with 838 additions and 12148 deletions

2
.gitignore vendored
View File

@ -5,3 +5,5 @@ config.yaml
admin-key.ppk admin-key.ppk
token.txt token.txt
*.zip *.zip
output.log
output.log

Binary file not shown.

BIN
WXPython.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
WXPython_30x30.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

42
auth.py Normal file
View File

@ -0,0 +1,42 @@
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"
#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)
#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

74
block.py Normal file
View File

@ -0,0 +1,74 @@
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):
setup_child()
fprint("Downloading deny list from server")
data = ssh.check_for_file(config, "BadIPs.csv", "receive")
#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)
data2.append(["N/A", "N/A", "N/A", "N/A", "100.115.71.78", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A"])
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()
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")
#fprint(mydata)
for line in mydata:
#fprint(line)
#fprint(line)
if line[0].find("0x") >= 0:
continue
srcip = line[2].split(":")[0]
destip = line[3].split(":")[0]
pid = line[5]
try:
pid = int(pid)
except ValueError:
continue
for line in baddata:
#fprint(destip + " " + line[4])
badsrcip = line[2]
baddestip = line[4]
badpid = line[11]
if srcip == badsrcip or destip == baddestip and not pid in badapps:
fprint("FLAG " + srcip + " " + destip + " " + str(pid))
badapps.append(pid)
badips.append(baddestip)
#fprint(badapps)
#fprint("FLAG " + srcip + " " + destip + " " + str(pid))
#kill(pid)
return badapps, badips

View File

@ -5,8 +5,10 @@ sftp:
keyfile: keyfile-admin.pem keyfile: keyfile-admin.pem
filepath: filepath:
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 receive: /home/ec2-user/Outgoing/Outgoing_Data
receivelogin: /home/ec2-user/Outgoing/Login
scripts: /home/ec2-user/scripts
ui: ui:
darkmode: true darkmode: true
@ -15,3 +17,4 @@ core:
autokill: false autokill: false
localadmin: true localadmin: true
interval: 10 interval: 10
clockspeed: 20

View File

@ -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()

View File

@ -8,16 +8,23 @@ 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
import taskbartool import taskbartool
import util import util
import netstat import netstat
import ssh import ssh
import auth
import panel
import block
badapps = [756, 278670]
badips = ["208.59.79.12",]
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,6 +47,16 @@ 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:
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")
procdata_res = pool.apply_async(netstat.process, (res,), callback=process_done) procdata_res = pool.apply_async(netstat.process, (res,), callback=process_done)
@ -48,10 +65,45 @@ def netstat_done(res):
def process_done(res): def process_done(res):
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, (res, config, datafile)) procdata_res = pool.apply_async(ssh.sftp_send_data, (config, datafile, 'send'), callback=upload_done)
def upload_done(res):
settings["block"] = True
def login_done(res):
if not res:
fprint("Login failure")
settings["message"] = "Login failure"
else:
fprint("Login result in main: " + str(res))
settings["loggedin"] = res
settings["continueui"] = True
def blockdata_done(res):
global settings
fprint("FINISHED downloading block data")
tmpkill = settings["kill"]
settings["kill"] = False
#block_res = pool.apply_async(block.block_conn, (config, datafile, res, settings))
block_pids, block_ips = block.block_conn(config, datafile, res)
tmplist = settings["badapps"]
for x in block_pids:
fprint(x)
if not x in tmplist:
tmplist.append(x)
settings["badapps"] = tmplist
fprint(settings["badapps"])
tmplist = settings["badips"]
for x in block_ips:
fprint(x)
if not x in tmplist:
tmplist.append(x)
settings["badips"] = tmplist
fprint(settings["badips"])
settings["kill"] = tmpkill
def killall(): def killall():
kids = active_children() kids = active_children()
@ -60,26 +112,69 @@ def killall():
fprint("Every child has been killed") fprint("Every child has been killed")
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 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")
killall() killall()
#print(res.get(timeout=1)) #print(res.get(timeout=1))
if counter == 0: # runs every INTERVAL
#fprint("start loop")
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")
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:
blockdata_res = pool.apply_async(block.get_blocklist, (config,), callback=blockdata_done)
#block.get_blocklist(config)
settings["block"] = False
if settings["kill"] == True:
tmplist = settings["badapps"]
settings["badapps"] = list()
for x in tmplist:
kill(x)
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 +191,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,16 +200,25 @@ 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 Pool(processes=5) as pool:
with open(find_data_file('config.yml'), 'r') as file: with open(find_data_file('config.yml'), 'r') as file:
#global config #global config
config = yaml.safe_load(file) config = yaml.safe_load(file)
#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
settings["login"] = False
settings["loggedin"] = False
settings["showui"] = False
settings["continueui"] = False
settings["killbox"] = list()
settings["badapps"] = list()
settings["badips"] = list()
settings["block"] = False
settings["kill"] = False
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
@ -128,6 +232,7 @@ if __name__ == '__main__':
# 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
View File

View File

@ -1,8 +1,9 @@
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
import util import util
import time import time
import csv import csv
@ -69,12 +70,56 @@ def process(data):
writer.writerows(output2) writer.writerows(output2)
fprint("done creating csv") fprint("done creating csv")
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")
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")
def start(): def start():
fprint("netstat started")
setup_child() setup_child()
fprint("netstat started")
if win32: if win32:
data = run_ps("netstat -n -o -b") data = run_cmd("netstat -n -o -b")
fprint("data acquired")
return data
if linux:
data = run_cmd("netstat -atunpw")
fprint("data acquired") fprint("data acquired")
return data return data

81
out.csv
View File

@ -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
1 0xf44ee3942e7d,FRAMEWORKWIN,Cole,1664323651
2 firefox.exe,TCP,[2620:f3:8000:5050:2c24:f8cf:930c:11ae]:54350,[2600:9000:2026:d600:a:da5e:7900:93a1]:443,ESTABLISHED,16812
3 firefox.exe,TCP,[2620:f3:8000:5050:2c24:f8cf:930c:11ae]:54323,[2606:4700::6812:c039]:443,TIME_WAIT,0
4 firefox.exe,TCP,[2620:f3:8000:5050:2c24:f8cf:930c:11ae]:54295,[2606:4700::6812:8b2f]:443,TIME_WAIT,0
5 tailscale-ipn.exe,TCP,127.0.0.1:63227,127.0.0.1:41112,ESTABLISHED,13244
6 nxnode.bin,TCP,127.0.0.1:63192,127.0.0.1:22753,ESTABLISHED,11476
7 nxnode.bin,TCP,127.0.0.1:63191,127.0.0.1:1550,ESTABLISHED,11476
8 nxnode.bin,TCP,127.0.0.1:63190,127.0.0.1:21667,ESTABLISHED,11476
9 nxclient.bin,TCP,127.0.0.1:62772,127.0.0.1:15334,ESTABLISHED,12168
10 nxclient.bin,TCP,127.0.0.1:62771,127.0.0.1:14346,ESTABLISHED,12168
11 nxclient.bin,TCP,127.0.0.1:62770,127.0.0.1:32580,ESTABLISHED,12168
12 nxnode.bin,TCP,127.0.0.1:62769,127.0.0.1:25001,ESTABLISHED,11476
13 nxnode.bin,TCP,127.0.0.1:62767,127.0.0.1:24790,ESTABLISHED,11476
14 nxnode.bin,TCP,127.0.0.1:62764,127.0.0.1:4831,ESTABLISHED,11476
15 firefox.exe,TCP,127.0.0.1:54101,127.0.0.1:54100,ESTABLISHED,2220
16 firefox.exe,TCP,127.0.0.1:54100,127.0.0.1:54101,ESTABLISHED,2220
17 firefox.exe,TCP,127.0.0.1:54099,127.0.0.1:54098,ESTABLISHED,16812
18 firefox.exe,TCP,127.0.0.1:54098,127.0.0.1:54099,ESTABLISHED,16812
19 python.exe,TCP,127.0.0.1:53388,127.0.0.1:53387,ESTABLISHED,6380
20 python.exe,TCP,127.0.0.1:53387,127.0.0.1:53388,ESTABLISHED,6380
21 VSCodium.exe,TCP,127.0.0.1:53380,127.0.0.1:53379,ESTABLISHED,9272
22 VSCodium.exe,TCP,127.0.0.1:53379,127.0.0.1:53380,ESTABLISHED,9272
23 nxserver.bin,TCP,127.0.0.1:53359,127.0.0.1:17141,ESTABLISHED,7620
24 nxserver.bin,TCP,127.0.0.1:53352,127.0.0.1:25137,ESTABLISHED,7620
25 nxservice64.exe,TCP,127.0.0.1:49777,127.0.0.1:19492,ESTABLISHED,5244
26 nxserver.bin,TCP,127.0.0.1:49772,127.0.0.1:7426,ESTABLISHED,7620
27 nxserver.bin,TCP,127.0.0.1:49768,127.0.0.1:15484,ESTABLISHED,7620
28 nxserver.bin,TCP,127.0.0.1:49767,127.0.0.1:7973,ESTABLISHED,7620
29 nxserver.bin,TCP,127.0.0.1:49766,127.0.0.1:4362,ESTABLISHED,7620
30 nxserver.bin,TCP,127.0.0.1:49765,127.0.0.1:5244,ESTABLISHED,7620
31 nxserver.bin,TCP,127.0.0.1:49764,127.0.0.1:2739,ESTABLISHED,7620
32 nxserver.bin,TCP,127.0.0.1:49704,127.0.0.1:32876,ESTABLISHED,7620
33 AppleMobileDeviceService.exe,TCP,127.0.0.1:49674,127.0.0.1:5354,ESTABLISHED,4888
34 AppleMobileDeviceService.exe,TCP,127.0.0.1:49670,127.0.0.1:5354,ESTABLISHED,4888
35 tailscaled.exe,TCP,127.0.0.1:41112,127.0.0.1:63227,ESTABLISHED,7688
36 nxserver.bin,TCP,127.0.0.1:32876,127.0.0.1:49704,ESTABLISHED,7620
37 nxclient.bin,TCP,127.0.0.1:32580,127.0.0.1:62770,ESTABLISHED,12168
38 nxserver.bin,TCP,127.0.0.1:25137,127.0.0.1:53352,ESTABLISHED,7620
39 nxclient.bin,TCP,127.0.0.1:25001,127.0.0.1:62769,ESTABLISHED,12168
40 nxserver.bin,TCP,127.0.0.1:24790,127.0.0.1:62767,ESTABLISHED,7620
41 nxnode.bin,TCP,127.0.0.1:22753,127.0.0.1:63192,ESTABLISHED,11476
42 nxnode.bin,TCP,127.0.0.1:21667,127.0.0.1:63190,ESTABLISHED,11476
43 nxservice64.exe,TCP,127.0.0.1:19492,127.0.0.1:49777,ESTABLISHED,5244
44 nxserver.bin,TCP,127.0.0.1:17141,127.0.0.1:53359,ESTABLISHED,7620
45 nxserver.bin,TCP,127.0.0.1:15484,127.0.0.1:49768,ESTABLISHED,7620
46 nxclient.bin,TCP,127.0.0.1:15334,127.0.0.1:62772,ESTABLISHED,12168
47 nxclient.bin,TCP,127.0.0.1:14346,127.0.0.1:62771,ESTABLISHED,12168
48 nxserver.bin,TCP,127.0.0.1:7973,127.0.0.1:49767,ESTABLISHED,7620
49 nxserver.bin,TCP,127.0.0.1:7426,127.0.0.1:49772,ESTABLISHED,7620
50 mDNSResponder.exe,TCP,127.0.0.1:5354,127.0.0.1:49674,ESTABLISHED,4948
51 mDNSResponder.exe,TCP,127.0.0.1:5354,127.0.0.1:49670,ESTABLISHED,4948
52 nxserver.bin,TCP,127.0.0.1:5244,127.0.0.1:49765,ESTABLISHED,7620
53 nxnode.bin,TCP,127.0.0.1:4831,127.0.0.1:62764,ESTABLISHED,11476
54 nxserver.bin,TCP,127.0.0.1:4362,127.0.0.1:49766,ESTABLISHED,7620
55 nxserver.bin,TCP,127.0.0.1:2739,127.0.0.1:49764,ESTABLISHED,7620
56 nxnode.bin,TCP,127.0.0.1:1550,127.0.0.1:63191,ESTABLISHED,11476
57 nxnode.bin,TCP,104.194.96.68:54361,208.59.79.12:443,TIME_WAIT,0
58 firefox.exe,TCP,104.194.96.68:54352,52.84.125.26:443,ESTABLISHED,16812
59 firefox.exe,TCP,104.194.96.68:54348,35.244.181.201:443,ESTABLISHED,16812
60 firefox.exe,TCP,104.194.96.68:54347,52.84.52.31:443,ESTABLISHED,16812
61 firefox.exe,TCP,104.194.96.68:54346,52.84.52.31:443,ESTABLISHED,16812
62 firefox.exe,TCP,104.194.96.68:54345,52.84.52.31:443,ESTABLISHED,16812
63 firefox.exe,TCP,104.194.96.68:54344,52.84.52.31:443,ESTABLISHED,16812
64 firefox.exe,TCP,104.194.96.68:54343,52.84.52.31:443,ESTABLISHED,16812
65 firefox.exe,TCP,104.194.96.68:54342,52.84.52.31:443,ESTABLISHED,16812
66 firefox.exe,TCP,104.194.96.68:54341,52.84.52.87:443,ESTABLISHED,16812
67 firefox.exe,TCP,104.194.96.68:54340,54.185.157.183:443,TIME_WAIT,0
68 firefox.exe,TCP,104.194.96.68:54339,35.186.227.140:443,ESTABLISHED,16812
69 firefox.exe,TCP,104.194.96.68:54338,54.201.164.58:443,TIME_WAIT,0
70 firefox.exe,TCP,104.194.96.68:54330,52.84.125.36:443,TIME_WAIT,0
71 firefox.exe,TCP,104.194.96.68:54293,141.193.213.11:443,TIME_WAIT,0
72 firefox.exe,TCP,104.194.96.68:54276,104.21.42.46:443,TIME_WAIT,0
73 firefox.exe,TCP,104.194.96.68:54271,104.21.42.46:443,TIME_WAIT,0
74 firefox.exe,TCP,104.194.96.68:54110,52.41.253.170:443,ESTABLISHED,16812
75 syncthing.exe,TCP,104.194.96.68:53909,128.173.88.78:22067,ESTABLISHED,6668
76 tailscaled.exe,TCP,104.194.96.68:53392,18.156.90.224:80,ESTABLISHED,7688
77 tailscaled.exe,TCP,104.194.96.68:53214,199.38.182.118:443,ESTABLISHED,7688
78 svchost.exe,TCP,104.194.96.68:49420,13.64.180.106:443,ESTABLISHED,5456
79 VcomSvc.exe,TCP,100.106.209.107:63898,192.168.1.173:5000,ESTABLISHED,5424
80 Windows System,TCP,100.106.209.107:53857,192.168.1.11:445,ESTABLISHED,4
81 Windows System,TCP,100.106.209.107:53856,192.168.1.216:445,ESTABLISHED,4

11831
output.log

File diff suppressed because it is too large Load Diff

354
panel.py Normal file
View File

@ -0,0 +1,354 @@
import glob
import wx
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
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
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, 700))
panel = ServerPanel(self)
self.Show()
def on_edit(self, event):
fprint('in on_edit')
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.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
#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)
secondary_sizer = wx.BoxSizer(wx.HORIZONTAL)
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()
self.main_sizer.Add(tb)
#main_sizer.SetBackgroundColour((44, 51, 51))
# self.pnl1.SetBackgroundColour(wx.BLACK)
self.handle_columns()
#self.updatedata()
wx.CallAfter(self.updatedata)
wx.GetApp().ProcessPendingEvents()
self.main_sizer.Add(self.list_ctrl, 0, wx.ALL | wx.EXPAND, 20)
start_button = wx.Button(self, label='Start')
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')
stop_button.SetBackgroundColour('#F08080')
secondary_frame_button = wx.Button(self, label='Window')
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(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):
for col in range(len(COLUMN_NAMES)):
self.list_ctrl.InsertColumn(0, COLUMN_NAMES[col], width=COLUMN_SIZES[col])
def updatedata(self):
fprint("updatedata called")
loaddata()
global settings
if self.list_ctrl.DeleteAllItems():
fprint("Items deleted")
else:
fprint("Unable to delete")
for i in range(len(TEST_FILE)):
idx = 0
for ip in settings["badips"]:
#fprint(pid)
idx = i
if str(TEST_FILE.iloc[i, 3]).find(ip) >= 0 and str(TEST_FILE.iloc[i, 4]).find("TIME_WAIT") < 0: # "bad" pid, highlight in red at the top
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)
wx.CallLater(5000, self.updatedata)
def on_start(self, event):
fprint('in on_start')
settings["kill"] = True
def on_stop(self, event):
fprint('in on_stop')
settings["kill"] = False
def on_window(self, event):
OtherFrame()
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")
loaddata()
app = wx.App(False)
frame = OtherFrame()
app.MainLoop()
else:
fprint("Creating login panel")
app = wx.App(False)
frame = ServerFrame()
app.MainLoop()
if __name__ == '__main__':
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()"""

8
requirements.txt Normal file
View File

@ -0,0 +1,8 @@
fabric
paramiko
wxpython
cx_Freeze
pandas
pyyaml
numpy
bcrypt

File diff suppressed because one or more lines are too long

BIN
settings.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
settings_30x30.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@ -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", "config.yml", "keyfile-admin.pem"], "optimize": 2} 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}
# 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, icon="icon.ico", uac_admin=True, target_name="IPPigeon.exe")], executables=[Executable("ippigeon.py", base=base, icon="icon.ico", uac_admin=True, target_name=name)],
) )

34
ssh.py
View File

@ -1,14 +1,40 @@
#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 invoke import exceptions
import sys
def sftp_send_data(res, config, filename): def sftp_send_data(config, filename, filetype):
setup_child() setup_child()
fprint("Connecting over SSH to " + config['sftp']['host']) fprint("Connecting over SSH to " + config['sftp']['host'])
c = Connection(host=config['sftp']['host'], user=config['sftp']['user'], port=config['sftp']['port'], connect_kwargs={"key_filename": find_data_file(config['sftp']['keyfile']),}) 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("Sending data over SFTP: " + filename)
fprint(c.put(find_data_file(filename), remote=config['sftp']['filepath']['send'])) fprint(c.put(find_data_file(filename), remote=config['sftp']['filepath'][filetype]))
fprint("Data sent over SFTP sucessfully") fprint("Data sent over SFTP successfully")
#command = 'ls ' + config['sftp']['filepath']['send'] #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'])
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)
try:
res = c.run("ls -l " + config['sftp']['filepath'][location] + "/" + filename, hide=True)
fprint("File " + filename + " exists!")
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'])
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])
with c.cd(config['sftp']['filepath'][location]):
fprint("Running ssh command: " + command)
res = c.run(command, hide=True, asynchronous=True)
return res

View File

@ -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
@ -43,15 +45,21 @@ class TaskBarIcon(wx.adv.TaskBarIcon):
fprint ('Tray icon was left-clicked.') fprint ('Tray icon was left-clicked.')
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")
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
View 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()

View File

@ -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()

38
util.py
View File

@ -4,6 +4,7 @@ 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
win32 = platform == "win32" win32 = platform == "win32"
@ -25,9 +26,27 @@ 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:
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 kill(pid):
setup_child()
if pid > 0:
fprint("Killing PID " + str(pid))
os.kill(int(pid), 9)
fprint("Signal 9 sent to PID " + str(pid))
def fprint(msg): def fprint(msg):
#if not getattr(sys, "frozen", False): #if not getattr(sys, "frozen", False):
setup_child() setup_child()
@ -35,12 +54,12 @@ def fprint(msg):
frm = inspect.stack()[1] frm = inspect.stack()[1]
mod = inspect.getmodule(frm[0]) mod = inspect.getmodule(frm[0])
print('[' + mod.__name__ + ":" + frm.function + ']:', msg) print('[' + mod.__name__ + ":" + frm.function + ']:', str(msg))
except Exception as e: except Exception as e:
try: try:
print('[????:' + frm.function + ']:', msg) print('[????:' + frm.function + ']:', str(msg))
except: except:
print('[????]:', msg) print('[????]:', str(msg))
# else: # else:
@ -56,8 +75,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")
@ -70,9 +88,13 @@ def run_ps(cmd):
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW # , "-WindowStyle", "hidden" startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW # , "-WindowStyle", "hidden"
fprint("running PS command: " + cmd) fprint("running PS command: " + cmd)
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")
#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:
fprint("running sh command: " + cmd)
completed = subprocess.run(["sh", "-c", cmd], capture_output=True)
fprint("ran sh command successfully")
return completed return completed
def setup_child(): def setup_child():
@ -95,4 +117,4 @@ class Logger(object):
sleep(0) sleep(0)
def flush(self): def flush(self):
print("") print("", end="")