diff options
author | Jose M. Guisado <jguisado@soleta.eu> | 2021-11-18 10:38:25 +0100 |
---|---|---|
committer | Jose M. Guisado <jguisado@soleta.eu> | 2021-11-18 13:50:16 +0100 |
commit | f9511932ad996a4cd75b569cfa0eb7ccc223b608 (patch) | |
tree | 936fa55dfc37d4acc5db6f0b4ad88f5634416ba1 /src/windows | |
parent | 3dfe54968b6e50d5b85391bd9302c2a4f0a21aa3 (diff) |
#1065 Add windows mode
Add agent mode for windows platform.
Subprocess module for shell/run is cross-platform an no change was
needed. The subprocess will run with the same privilege as its parent,
ogclient.
TODO: Provide a windows installer. As of now, an administrator
needs to install python and required libraries for this mode to be
usable.
Diffstat (limited to 'src/windows')
-rw-r--r-- | src/windows/__init__.py | 1 | ||||
-rw-r--r-- | src/windows/ogOperations.py | 113 |
2 files changed, 114 insertions, 0 deletions
diff --git a/src/windows/__init__.py b/src/windows/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/windows/__init__.py @@ -0,0 +1 @@ + diff --git a/src/windows/ogOperations.py b/src/windows/ogOperations.py new file mode 100644 index 0000000..0af7250 --- /dev/null +++ b/src/windows/ogOperations.py @@ -0,0 +1,113 @@ +# +# Copyright (C) 2021 Soleta Networks <info@soleta.eu> +# +# This program is free software: you can redistribute it and/or modify it under +# the terms of the GNU Affero General Public License as published by the +# Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. + +import os +import subprocess +from subprocess import CalledProcessError +import multiprocessing as mp +from multiprocessing import Process + +from PIL import Image, ImageDraw +from pystray import Icon, Menu, MenuItem + +from src.ogRest import ThreadState + + +def _create_default_image(): + """ + Creates a default image for the tray icon. Use in case + no favicon.ico is found. + """ + width = height = 250 + color1 = (255, 255, 255) + color2 = (255, 0, 255) + + image = Image.new('RGB', (width, height), color1) + dc = ImageDraw.Draw(image) + dc.rectangle( + (width // 2, 0, width, height // 2), + fill=color2) + dc.rectangle( + (0, height // 2, width // 2, height), + fill=color2) + + return image + + +def create_image(): + try: + image = Image.open(r'./favicon.ico') + image = Image.composite(image, Image.new('RGB', image.size, 'white'), image) + except: + image = _create_default_image() + return image + + +def create_systray(): + menu = Menu(MenuItem('Powered by Soleta Networks!', + lambda icon, item: 1)) + icon = Icon('ogClient', create_image(), menu=menu) + assert icon.icon + icon.run() + + +systray_p = Process(target=create_systray) + + +class OgWindowsOperations: + + def __init__(self): + mp.set_start_method('spawn') + systray_p.start() + + def _restartBrowser(self, url): + raise NotImplementedError + + def poweroff(self): + systray_p.terminate() + + def reboot(self): + systray_p.terminate() + + def shellrun(self, request, ogRest): + cmd = request.getrun() + try: + result = subprocess.run(cmd, + shell=True, + stdin=subprocess.DEVNULL, + capture_output=True, + text=True, + check=True) + except CalledProcessError as error: + if error.stderr: + return error.stderr + if error.stdout: + return error.stdout + return "{Non zero exit code and empty output}" + return result.stdout + + def session(self, request, ogRest): + raise NotImplementedError + + def hardware(self, path, ogRest): + raise NotImplementedError + + def setup(self, request, ogRest): + raise NotImplementedError + + def image_restore(self, request, ogRest): + raise NotImplementedError + + def image_create(self, path, request, ogRest): + raise NotImplementedError + + def refresh(self, ogRest): + return {"status": "WIN"} + + def probe(self, ogRest): + return {'status': 'WIN' if ogRest.state != ThreadState.BUSY else 'BSY'} |