Compare commits

...

10 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
14 changed files with 528 additions and 113883 deletions

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

15
auth.py
View File

@ -3,26 +3,32 @@ 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"
#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')
sleep(1)
filename = sysid + "success.txt" filename = sysid + "success.txt"
count = 0
while count < 20:
output = ssh.check_for_file(config, filename, 'receivelogin') output = ssh.check_for_file(config, filename, 'receivelogin')
if output == False: if output == False:
filename = sysid + "fail.txt" filename = sysid + "fail.txt"
if ssh.check_for_file(config, filename, 'receivelogin') == False: if ssh.check_for_file(config, filename, 'receivelogin') == False:
# ALERT: DIRTY HACK: SECURITY VULNERABILITY # try again
#return True count += 1
raise ValueError("Unable to determine login status") sleep(0.1)
#raise ValueError("Unable to determine login status")
else: else:
return False return False
else: else:
@ -33,3 +39,4 @@ def login(config, user, password, sysid):
else: else:
fprint("Not admin") fprint("Not admin")
return False 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

@ -17,3 +17,4 @@ core:
autokill: false autokill: false
localadmin: true localadmin: true
interval: 10 interval: 10
clockspeed: 20

View File

@ -8,13 +8,17 @@ 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 auth
import panel 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
@ -61,7 +65,10 @@ 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, (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
def login_done(res): def login_done(res):
if not res: if not res:
@ -72,6 +79,31 @@ def login_done(res):
settings["loggedin"] = res settings["loggedin"] = res
settings["continueui"] = True 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()
@ -80,6 +112,8 @@ 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
@ -95,7 +129,7 @@ def mainloop(pool):
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 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))
@ -124,12 +158,24 @@ def mainloop(pool):
settings["login"] = False 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
sleep(interval / (interval * 20.0)) if settings["kill"] == True:
tmplist = settings["badapps"]
settings["badapps"] = list()
for x in tmplist:
kill(x)
sleep(interval / (interval * config["core"]["clockspeed"]))
counter += 1 counter += 1
if counter == interval * 20: if counter == interval * config["core"]["clockspeed"]:
counter = 0 counter = 0
class Logger(object): class Logger(object):
def __init__(self, filename="output.log"): def __init__(self, filename="output.log"):
self.log = open(filename, "a") self.log = open(filename, "a")
@ -154,9 +200,9 @@ 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)
@ -168,6 +214,11 @@ if __name__ == '__main__':
settings["loggedin"] = False settings["loggedin"] = False
settings["showui"] = False settings["showui"] = False
settings["continueui"] = 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

113854
output.log

File diff suppressed because one or more lines are too long

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

View File

@ -3,3 +3,6 @@ paramiko
wxpython wxpython
cx_Freeze cx_Freeze
pandas pandas
pyyaml
numpy
bcrypt

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,7 +5,7 @@ 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

1
ssh.py
View File

@ -37,3 +37,4 @@ def run_ssh(config, command, location):
fprint("Running ssh command: " + command) fprint("Running ssh command: " + command)
res = c.run(command, hide=True, asynchronous=True) res = c.run(command, hide=True, asynchronous=True)
return res return res

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"
@ -39,6 +40,13 @@ if linux:
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()