From 1d93de1b596a3ea7484f795bda58e3a90773f718 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Thu, 29 Aug 2024 11:03:00 +0200 Subject: [PATCH] refs #531 remove unused code, bump version --- linux/debian/changelog | 7 + macos/build-pkg.sh | 4 +- src/OGAServiceHelper.py | 56 ----- src/OGAgent.qrc | 5 - src/VERSION | 2 +- src/about-dialog.ui | 3 - src/opengnsys/linux/operations.py | 89 -------- src/opengnsys/linux/renamer/__init__.py | 61 ----- src/opengnsys/linux/renamer/debian.py | 68 ------ src/opengnsys/linux/renamer/opensuse.py | 66 ------ src/opengnsys/linux/renamer/redhat.py | 74 ------ src/opengnsys/macos/operations.py | 88 -------- .../modules/server/OpenGnSys/__init__.py | 11 - src/opengnsys/windows/operations.py | 133 +---------- src/prototypes/threaded_server.py | 170 -------------- src/test_modules/__init__.py | 0 src/test_modules/client/Sample1/__init__.py | 38 ---- src/test_modules/client/__init__.py | 0 src/test_modules/server/Sample1/__init__.py | 2 - src/test_modules/server/Sample1/sample1.py | 40 ---- .../server/Sample1/sample_pkg/__init__.py | 36 --- src/test_modules/server/__init__.py | 0 src/test_rest_server.py | 210 ------------------ 23 files changed, 12 insertions(+), 1151 deletions(-) delete mode 100644 src/OGAServiceHelper.py delete mode 100644 src/OGAgent.qrc delete mode 100644 src/opengnsys/linux/renamer/__init__.py delete mode 100644 src/opengnsys/linux/renamer/debian.py delete mode 100644 src/opengnsys/linux/renamer/opensuse.py delete mode 100644 src/opengnsys/linux/renamer/redhat.py delete mode 100644 src/prototypes/threaded_server.py delete mode 100644 src/test_modules/__init__.py delete mode 100644 src/test_modules/client/Sample1/__init__.py delete mode 100644 src/test_modules/client/__init__.py delete mode 100644 src/test_modules/server/Sample1/__init__.py delete mode 100644 src/test_modules/server/Sample1/sample1.py delete mode 100644 src/test_modules/server/Sample1/sample_pkg/__init__.py delete mode 100644 src/test_modules/server/__init__.py delete mode 100644 src/test_rest_server.py diff --git a/linux/debian/changelog b/linux/debian/changelog index a6cf0a0..37b61ba 100644 --- a/linux/debian/changelog +++ b/linux/debian/changelog @@ -1,3 +1,10 @@ +ogagent (1.3.5-1) stable; urgency=medium + + * Don't unconditionally load modules--dynamically load everything + * Remove old, unused code + + -- OpenGnsys developers Thu, 29 Aug 2024 10:47:12 +0200 + ogagent (1.3.4-1) stable; urgency=medium * Implement JobMgr diff --git a/macos/build-pkg.sh b/macos/build-pkg.sh index 9e112ae..964ea9c 100755 --- a/macos/build-pkg.sh +++ b/macos/build-pkg.sh @@ -12,8 +12,8 @@ mkdir -p build && cd build mkdir -p flat/base.pkg flat/Resources/en.lproj mkdir -p root/Applications -# Copy application and script files. Exclude 'test_modules' -cp -a ../../src root/Applications/OGAgent.app; rm -rf root/Applications/OGAgent.app/test_modules +# Copy application and script files +cp -a ../../src root/Applications/OGAgent.app cp -a ../scripts . # Create plist file. diff --git a/src/OGAServiceHelper.py b/src/OGAServiceHelper.py deleted file mode 100644 index ddcdf2d..0000000 --- a/src/OGAServiceHelper.py +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2014 Virtual Cable S.L. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# * Neither the name of Virtual Cable S.L. nor the names of its contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -''' -@author: Adolfo Gómez, dkmaster at dkmon dot com -''' - -import win32service -import win32serviceutil - -svc_name = "UDSActor" - -try: - hscm = win32service.OpenSCManager(None, None, win32service.SC_MANAGER_ALL_ACCESS) - - try: - hs = win32serviceutil.SmartOpenService(hscm, svc_name, win32service.SERVICE_ALL_ACCESS) - service_failure_actions = { - 'ResetPeriod': 864000, # Time in ms after which to reset the failure count to zero. - 'RebootMsg': u'', # Not using reboot option - 'Command': u'', # Not using run-command option - 'Actions': [ - (win32service.SC_ACTION_RESTART, 5000), # action, delay in ms - (win32service.SC_ACTION_RESTART, 5000) - ] - } - win32service.ChangeServiceConfig2(hs, win32service.SERVICE_CONFIG_FAILURE_ACTIONS, service_failure_actions) - finally: - win32service.CloseServiceHandle(hs) -finally: - win32service.CloseServiceHandle(hscm) diff --git a/src/OGAgent.qrc b/src/OGAgent.qrc deleted file mode 100644 index 5917766..0000000 --- a/src/OGAgent.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - img/oga.png - - diff --git a/src/VERSION b/src/VERSION index d0149fe..80e78df 100644 --- a/src/VERSION +++ b/src/VERSION @@ -1 +1 @@ -1.3.4 +1.3.5 diff --git a/src/about-dialog.ui b/src/about-dialog.ui index 93f4817..72d248c 100644 --- a/src/about-dialog.ui +++ b/src/about-dialog.ui @@ -217,9 +217,6 @@ p, li { white-space: pre-wrap; } - - - buttonBox diff --git a/src/opengnsys/linux/operations.py b/src/opengnsys/linux/operations.py index 88371b3..9d2d928 100644 --- a/src/opengnsys/linux/operations.py +++ b/src/opengnsys/linux/operations.py @@ -44,7 +44,6 @@ import array import six import distro from opengnsys import utils -from .renamer import rename def _getMacAddr(ifname): @@ -114,13 +113,6 @@ def _getIpAndMac(ifname): return (ip, mac) -def getComputerName(): - ''' - Returns computer name, with no domain - ''' - return socket.gethostname().split('.')[0] - - def getNetworkInfo(): ''' Obtains a list of network interfaces @@ -135,10 +127,6 @@ def getNetworkInfo(): yield utils.Bunch(name=ifname, mac=mac, ip=ip) -def getDomainName(): - return '' - - def getLinuxVersion(): """ Returns the version of the Linux distribution @@ -191,83 +179,6 @@ def logoff(): subprocess.call(['/usr/bin/pkill', '-u', os.environ['USER']]) -def renameComputer(newName): - rename(newName) - - -def joinDomain(domain, ou, account, password, executeInOneStep=False): - pass - - -def changeUserPassword(user, oldPassword, newPassword): - ''' - Simple password change for user using command line - ''' - os.system('echo "{1}\n{1}" | /usr/bin/passwd {0} 2> /dev/null'.format(user, newPassword)) - - -class XScreenSaverInfo(ctypes.Structure): - _fields_ = [('window', ctypes.c_long), - ('state', ctypes.c_int), - ('kind', ctypes.c_int), - ('til_or_since', ctypes.c_ulong), - ('idle', ctypes.c_ulong), - ('eventMask', ctypes.c_ulong)] - -# Initialize xlib & xss -try: - xlibPath = ctypes.util.find_library('X11') - xssPath = ctypes.util.find_library('Xss') - xlib = ctypes.cdll.LoadLibrary(xlibPath) - xss = ctypes.cdll.LoadLibrary(xssPath) - - # Fix result type to XScreenSaverInfo Structure - xss.XScreenSaverQueryExtension.restype = ctypes.c_int - xss.XScreenSaverAllocInfo.restype = ctypes.POINTER(XScreenSaverInfo) # Result in a XScreenSaverInfo structure -except Exception: # Libraries not accesible, not found or whatever.. - xlib = xss = None - - -def initIdleDuration(atLeastSeconds): - ''' - On linux we set the screensaver to at least required seconds, or we never will get "idle" - ''' - # Workaround for dummy thread - if six.PY3 is False: - import threading - threading._DummyThread._Thread__stop = lambda x: 42 - - subprocess.call(['/usr/bin/xset', 's', '{}'.format(atLeastSeconds + 30)]) - # And now reset it - subprocess.call(['/usr/bin/xset', 's', 'reset']) - - -def getIdleDuration(): - ''' - Returns idle duration, in seconds - ''' - if xlib is None or xss is None: - return 0 # Libraries not available - - # production code might want to not hardcode the offset 16... - display = xlib.XOpenDisplay(None) - - event_base = ctypes.c_int() - error_base = ctypes.c_int() - - available = xss.XScreenSaverQueryExtension(display, ctypes.byref(event_base), ctypes.byref(error_base)) - if available != 1: - return 0 # No screen saver is available, no way of getting idle - - info = xss.XScreenSaverAllocInfo() - xss.XScreenSaverQueryInfo(display, xlib.XDefaultRootWindow(display), info) - - if info.contents.state != 0: - return 3600 * 100 * 1000 # If screen saver is active, return a high enough value - - return info.contents.idle / 1000.0 - - def getCurrentUser(): ''' Returns current logged in user diff --git a/src/opengnsys/linux/renamer/__init__.py b/src/opengnsys/linux/renamer/__init__.py deleted file mode 100644 index 7b3bc69..0000000 --- a/src/opengnsys/linux/renamer/__init__.py +++ /dev/null @@ -1,61 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (c) 2014 Virtual Cable S.L. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# * Neither the name of Virtual Cable S.L. nor the names of its contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -''' -@author: Adolfo Gómez, dkmaster at dkmon dot com -''' - - -import platform -import os -import sys -import pkgutil - -from opengnsys.log import logger - -renamers = {} - - -# Renamers now are for IPv4 only addresses -def rename(newName): - distribution = platform.linux_distribution()[0].lower().strip() - if distribution in renamers: - return renamers[distribution](newName) - - # Try Debian renamer, simplest one - logger.info('Renamer for platform "{0}" not found, tryin debian renamer'.format(distribution)) - return renamers['debian'](newName) - - -# Do load of packages -def _init(): - pkgpath = os.path.dirname(sys.modules[__name__].__file__) - for _, name, _ in pkgutil.iter_modules([pkgpath]): - __import__(__name__ + '.' + name, globals(), locals()) - -_init() \ No newline at end of file diff --git a/src/opengnsys/linux/renamer/debian.py b/src/opengnsys/linux/renamer/debian.py deleted file mode 100644 index 2e6e2a1..0000000 --- a/src/opengnsys/linux/renamer/debian.py +++ /dev/null @@ -1,68 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (c) 2014 Virtual Cable S.L. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# * Neither the name of Virtual Cable S.L. nor the names of its contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -''' -@author: Adolfo Gómez, dkmaster at dkmon dot com -''' - - -from opengnsys.linux.renamer import renamers -from opengnsys.log import logger - -import os - - -def rename(newName): - ''' - Debian renamer - Expects new host name on newName - Host does not needs to be rebooted after renaming - ''' - logger.debug('using Debian renamer') - - with open('/etc/hostname', 'w') as hostname: - hostname.write(newName) - - # Force system new name - os.system('/bin/hostname %s' % newName) - - # add name to "hosts" - with open('/etc/hosts', 'r') as hosts: - lines = hosts.readlines() - with open('/etc/hosts', 'w') as hosts: - hosts.write("127.0.1.1\t%s\n" % newName) - for l in lines: - if l[:9] == '127.0.1.1': # Skips existing 127.0.1.1. if it already exists - continue - hosts.write(l) - - return True - -# All names in lower case -renamers['debian'] = rename -renamers['ubuntu'] = rename diff --git a/src/opengnsys/linux/renamer/opensuse.py b/src/opengnsys/linux/renamer/opensuse.py deleted file mode 100644 index 3f05e4e..0000000 --- a/src/opengnsys/linux/renamer/opensuse.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (c) 2014 Virtual Cable S.L. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# * Neither the name of Virtual Cable S.L. nor the names of its contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -''' -@author: Adolfo Gómez, dkmaster at dkmon dot com -''' - - -from opengnsys.linux.renamer import renamers -from opengnsys.log import logger - -import os - - -def rename(newName): - ''' - RH, Centos, Fedora Renamer - Expects new host name on newName - Host does not needs to be rebooted after renaming - ''' - logger.debug('using SUSE renamer') - - with open('/etc/hostname', 'w') as hostname: - hostname.write(newName) - - # Force system new name - os.system('/bin/hostname %s' % newName) - - # add name to "hosts" - with open('/etc/hosts', 'r') as hosts: - lines = hosts.readlines() - with open('/etc/hosts', 'w') as hosts: - hosts.write("127.0.1.1\t{}\n".format(newName)) - for l in lines: - if l[:9] != '127.0.1.1': # Skips existing 127.0.1.1. if it already exists - hosts.write(l) - - return True - -# All names in lower case -renamers['opensuse'] = rename -renamers['suse'] = rename diff --git a/src/opengnsys/linux/renamer/redhat.py b/src/opengnsys/linux/renamer/redhat.py deleted file mode 100644 index 2605c22..0000000 --- a/src/opengnsys/linux/renamer/redhat.py +++ /dev/null @@ -1,74 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (c) 2014 Virtual Cable S.L. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# * Neither the name of Virtual Cable S.L. nor the names of its contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -''' -@author: Adolfo Gómez, dkmaster at dkmon dot com -''' - - -from opengnsys.linux.renamer import renamers -from opengnsys.log import logger - -import os - - -def rename(newName): - ''' - RH, Centos, Fedora Renamer - Expects new host name on newName - Host does not needs to be rebooted after renaming - ''' - logger.debug('using RH renamer') - - with open('/etc/hostname', 'w') as hostname: - hostname.write(newName) - - # Force system new name - os.system('/bin/hostname %s' % newName) - - # add name to "hosts" - with open('/etc/hosts', 'r') as hosts: - lines = hosts.readlines() - with open('/etc/hosts', 'w') as hosts: - hosts.write("127.0.1.1\t{}\n".format(newName)) - for l in lines: - if l[:9] != '127.0.1.1': # Skips existing 127.0.1.1. if it already exists - hosts.write(l) - - with open('/etc/sysconfig/network', 'r') as net: - lines = net.readlines() - with open('/etc/sysconfig/network', 'w') as net: - net.write('HOSTNAME={}\n'.format(newName)) - for l in lines: - if l[:8] != 'HOSTNAME': - net.write(l) - - return True - -# All names in lower case -renamers['centos linux'] = rename -renamers['fedora'] = rename diff --git a/src/opengnsys/macos/operations.py b/src/opengnsys/macos/operations.py index 9957f3b..5f827a1 100644 --- a/src/opengnsys/macos/operations.py +++ b/src/opengnsys/macos/operations.py @@ -112,13 +112,6 @@ def _getIpAndMac(ifname): return (ip, mac) -def getComputerName(): - ''' - Returns computer name, with no domain - ''' - return socket.gethostname().split('.')[0] - - def getNetworkInfo(): ''' Obtains a list of network interfaces @@ -133,10 +126,6 @@ def getNetworkInfo(): yield utils.Bunch(name=ifname, mac=mac, ip=ip) -def getDomainName(): - return '' - - def getMacosVersion(): return 'macOS {}'.format(platform.mac_ver()[0]) @@ -180,83 +169,6 @@ def logoff(): subprocess.call('/usr/bin/osascript -e \'tell app "System Events" to «event aevtrlgo»\'', shell=True) -def renameComputer(newName): - rename(newName) - - -def joinDomain(domain, ou, account, password, executeInOneStep=False): - pass - - -def changeUserPassword(user, oldPassword, newPassword): - ''' - Simple password change for user using command line - ''' - os.system('echo "{1}\n{1}" | /usr/bin/passwd {0} 2> /dev/null'.format(user, newPassword)) - - -class XScreenSaverInfo(ctypes.Structure): - _fields_ = [('window', ctypes.c_long), - ('state', ctypes.c_int), - ('kind', ctypes.c_int), - ('til_or_since', ctypes.c_ulong), - ('idle', ctypes.c_ulong), - ('eventMask', ctypes.c_ulong)] - -# Initialize xlib & xss -try: - xlibPath = ctypes.util.find_library('X11') - xssPath = ctypes.util.find_library('Xss') - xlib = ctypes.cdll.LoadLibrary(xlibPath) - xss = ctypes.cdll.LoadLibrary(xssPath) - - # Fix result type to XScreenSaverInfo Structure - xss.XScreenSaverQueryExtension.restype = ctypes.c_int - xss.XScreenSaverAllocInfo.restype = ctypes.POINTER(XScreenSaverInfo) # Result in a XScreenSaverInfo structure -except Exception: # Libraries not accesible, not found or whatever.. - xlib = xss = None - - -def initIdleDuration(atLeastSeconds): - ''' - On linux we set the screensaver to at least required seconds, or we never will get "idle" - ''' - # Workaround for dummy thread - if six.PY3 is False: - import threading - threading._DummyThread._Thread__stop = lambda x: 42 - - subprocess.call(['/usr/bin/xset', 's', '{}'.format(atLeastSeconds + 30)]) - # And now reset it - subprocess.call(['/usr/bin/xset', 's', 'reset']) - - -def getIdleDuration(): - ''' - Returns idle duration, in seconds - ''' - if xlib is None or xss is None: - return 0 # Libraries not available - - # production code might want to not hardcode the offset 16... - display = xlib.XOpenDisplay(None) - - event_base = ctypes.c_int() - error_base = ctypes.c_int() - - available = xss.XScreenSaverQueryExtension(display, ctypes.byref(event_base), ctypes.byref(error_base)) - if available != 1: - return 0 # No screen saver is available, no way of getting idle - - info = xss.XScreenSaverAllocInfo() - xss.XScreenSaverQueryInfo(display, xlib.XDefaultRootWindow(display), info) - - if info.contents.state != 0: - return 3600 * 100 * 1000 # If screen saver is active, return a high enough value - - return info.contents.idle / 1000.0 - - def getCurrentUser(): ''' Returns current logged in user diff --git a/src/opengnsys/modules/server/OpenGnSys/__init__.py b/src/opengnsys/modules/server/OpenGnSys/__init__.py index 04e8967..0506b93 100644 --- a/src/opengnsys/modules/server/OpenGnSys/__init__.py +++ b/src/opengnsys/modules/server/OpenGnSys/__init__.py @@ -91,17 +91,6 @@ def execution_level(level): return check_permitted -# Error handler decorator. -def catch_background_error(fnc): - def wrapper(*args, **kwargs): - this = args[0] - try: - fnc(*args, **kwargs) - except Exception as e: - this.REST.sendMessage('error?id={}'.format(kwargs.get('requestId', 'error')), {'error': '{}'.format(e)}) - return wrapper - - class OpenGnSysWorker(ServerWorker): name = 'opengnsys' # Module name interface = None # Bound interface for OpenGnsys diff --git a/src/opengnsys/windows/operations.py b/src/opengnsys/windows/operations.py index bc07a93..789bbe3 100644 --- a/src/opengnsys/windows/operations.py +++ b/src/opengnsys/windows/operations.py @@ -47,15 +47,6 @@ from opengnsys import utils from opengnsys.log import logger -def getErrorMessage(res=0): - msg = win32api.FormatMessage(res) - return msg.decode('windows-1250', 'ignore') - - -def getComputerName(): - return win32api.GetComputerNameEx(win32con.ComputerNamePhysicalDnsHostname) - - def getNetworkInfo(): ''' Obtains a list of network interfaces @@ -82,23 +73,6 @@ def getNetworkInfo(): return -def getDomainName(): - ''' - Will return the domain name if we belong a domain, else None - (if part of a network group, will also return None) - ''' - # Status: - # 0 = Unknown - # 1 = Unjoined - # 2 = Workgroup - # 3 = Domain - domain, status = win32net.NetGetJoinInformation() - if status != 3: - domain = None - - return domain - - def getWindowsVersion(): ''' Returns Windows version. @@ -116,8 +90,8 @@ def getWindowsVersion(): EWX_LOGOFF = 0x00000000 EWX_SHUTDOWN = 0x00000001 EWX_REBOOT = 0x00000002 -EWX_FORCE = 0x00000004 -EWX_POWEROFF = 0x00000008 +#EWX_FORCE = 0x00000004 +#EWX_POWEROFF = 0x00000008 EWX_FORCEIFHUNG = 0x00000010 @@ -138,109 +112,6 @@ def logoff(): win32api.ExitWindowsEx(EWX_LOGOFF) -def renameComputer(newName): - # Needs admin privileges to work - if ctypes.windll.kernel32.SetComputerNameExW(DWORD(win32con.ComputerNamePhysicalDnsHostname), LPCWSTR(newName)) == 0: # @UndefinedVariable - # win32api.FormatMessage -> returns error string - # win32api.GetLastError -> returns error code - # (just put this comment here to remember to log this when logger is available) - error = getErrorMessage() - computerName = win32api.GetComputerNameEx(win32con.ComputerNamePhysicalDnsHostname) - raise Exception('Error renaming computer from {} to {}: {}'.format(computerName, newName, error)) - - -NETSETUP_JOIN_DOMAIN = 0x00000001 -NETSETUP_ACCT_CREATE = 0x00000002 -NETSETUP_ACCT_DELETE = 0x00000004 -NETSETUP_WIN9X_UPGRADE = 0x00000010 -NETSETUP_DOMAIN_JOIN_IF_JOINED = 0x00000020 -NETSETUP_JOIN_UNSECURE = 0x00000040 -NETSETUP_MACHINE_PWD_PASSED = 0x00000080 -NETSETUP_JOIN_WITH_NEW_NAME = 0x00000400 -NETSETUP_DEFER_SPN_SET = 0x1000000 - - -def joinDomain(domain, ou, account, password, executeInOneStep=False): - ''' - Joins machine to a windows domain - :param domain: Domain to join to - :param ou: Ou that will hold machine - :param account: Account used to join domain - :param password: Password of account used to join domain - :param executeInOneStep: If true, means that this machine has been renamed and wants to add NETSETUP_JOIN_WITH_NEW_NAME to request so we can do rename/join in one step. - ''' - # If account do not have domain, include it - if '@' not in account and '\\' not in account: - if '.' in domain: - account = account + '@' + domain - else: - account = domain + '\\' + account - - # Do log - flags = NETSETUP_ACCT_CREATE | NETSETUP_DOMAIN_JOIN_IF_JOINED | NETSETUP_JOIN_DOMAIN - - if executeInOneStep: - flags |= NETSETUP_JOIN_WITH_NEW_NAME - - flags = DWORD(flags) - - domain = LPCWSTR(domain) - - # Must be in format "ou=.., ..., dc=...," - ou = LPCWSTR(ou) if ou is not None and ou != '' else None - account = LPCWSTR(account) - password = LPCWSTR(password) - - res = ctypes.windll.netapi32.NetJoinDomain(None, domain, ou, account, password, flags) - # Machine found in another ou, use it and warn this on log - if res == 2224: - flags = DWORD(NETSETUP_DOMAIN_JOIN_IF_JOINED | NETSETUP_JOIN_DOMAIN) - res = ctypes.windll.netapi32.NetJoinDomain(None, domain, None, account, password, flags) - if res != 0: - # Log the error - error = getErrorMessage(res) - if res == 1355: - error = "DC Is not reachable" - print('{} {}'.format(res, error)) - raise Exception('Error joining domain {}, with credentials {}/*****{}: {}, {}'.format(domain.value, account.value, ', under OU {}'.format(ou.value) if ou.value is not None else '', res, error)) - - -def changeUserPassword(user, oldPassword, newPassword): - computerName = LPCWSTR(getComputerName()) - user = LPCWSTR(user) - oldPassword = LPCWSTR(oldPassword) - newPassword = LPCWSTR(newPassword) - - res = ctypes.windll.netapi32.NetUserChangePassword(computerName, user, oldPassword, newPassword) - - if res != 0: - # Log the error, and raise exception to parent - error = getErrorMessage() - raise Exception('Error changing password for user {}: {}'.format(user.value, error)) - - -class LASTINPUTINFO(ctypes.Structure): - _fields_ = [ - ('cbSize', ctypes.c_uint), - ('dwTime', ctypes.c_uint), - ] - - -def initIdleDuration(atLeastSeconds): - ''' - In windows, there is no need to set screensaver - ''' - pass - - -def getIdleDuration(): - lastInputInfo = LASTINPUTINFO() - lastInputInfo.cbSize = ctypes.sizeof(lastInputInfo) - ctypes.windll.user32.GetLastInputInfo(ctypes.byref(lastInputInfo)) - millis = ctypes.windll.kernel32.GetTickCount() - lastInputInfo.dwTime # @UndefinedVariable - return millis / 1000.0 - - def getCurrentUser(): ''' Returns current logged in username diff --git a/src/prototypes/threaded_server.py b/src/prototypes/threaded_server.py deleted file mode 100644 index b8d7751..0000000 --- a/src/prototypes/threaded_server.py +++ /dev/null @@ -1,170 +0,0 @@ -''' -Created on Jul 9, 2015 - -@author: dkmaster -''' - - -# Pydev can't parse "six.moves.xxxx" because it is loaded lazy -from six.moves.socketserver import ThreadingMixIn # @UnresolvedImport -from six.moves.SimpleHTTPServer import SimpleHTTPRequestHandler # @UnresolvedImport -from six.moves.BaseHTTPServer import HTTPServer # @UnresolvedImport -from six.moves.urllib.parse import unquote # @UnresolvedImport - -import json -import threading -import ssl - -import os.path -import tempfile - -# For testing -# -------------------- -CERTFILE = 'UDSActor.pem' - - -def createSelfSignedCert(force=False): - - certFile = os.path.join(tempfile.gettempdir(), CERTFILE) - - if os.path.exists(certFile) and not force: - return certFile - - certData = '''-----BEGIN PRIVATE KEY----- -MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCb50K3mIznNklz -yVAD7xSQOSJQ6+NPXj7U9/4zLZ+TvmbQ7RqUUsxbfxHbeRnoYTWV2nKk4+tHqmvz -ujLSS/loFhTSMqtrLn7rowSYJoQhKOUkAiQlWkqCfItWgL5pJopDpNHFul9Rn3ds -PMWQTiGeUNR4Y3RnBhr1Q1BsqAzf4m6zFUmgLPPmVLdF4uJ3Tuz8TSy2gWLs5aSr -5do4WamwUfYjRSVMJECmwjUM4rQ8SQgg0sHBeBuDUGNBvBQFac1G7qUcMReeu8Zr -DUtMsXma/l4rA8NB5CRmTrQbTBF4l+jb2BDFebDqDUK1Oqs9X35yOQfDOAFYHiix -PX0IsXOZAgMBAAECggEBAJi3000RrIUZUp6Ph0gzPMuCjDEEwWiQA7CPNX1gpb8O -dp0WhkDhUroWIaICYPSXtOwUTtVjRqivMoxPy1Thg3EIoGC/rdeSdlXRHMEGicwJ -yVyalFnatr5Xzg5wkxVh4XMd0zeDt7e3JD7s0QLo5lm1CEzd77qz6lhzFic5/1KX -bzdULtTlq60dazg2hEbcS4OmM1UMCtRVDAsOIUIZPL0M9j1C1d1iEdYnh2xshKeG -/GOfo95xsgdMlGjtv3hUT5ryKVoEsu+36rGb4VfhPfUvvoVbRx5QZpW+QvxaYh5E -Fi0JEROozFwG31Y++8El7J3yQko8cFBa1lYYUwwpNAECgYEAykT+GiM2YxJ4uVF1 -OoKiE9BD53i0IG5j87lGPnWqzEwYBwnqjEKDTou+uzMGz3MDV56UEFNho7wUWh28 -LpEkjJB9QgbsugjxIBr4JoL/rYk036e/6+U8I95lvYWrzb+rBMIkRDYI7kbQD/mQ -piYUpuCkTymNAu2RisK6bBzJslkCgYEAxVE23OQvkCeOV8hJNPZGpJ1mDS+TiOow -oOScMZmZpail181eYbAfMsCr7ri812lSj98NvA2GNVLpddil6LtS1cQ5p36lFBtV -xQUMZiFz4qVbEak+izL+vPaev/mXXsOcibAIQ+qI/0txFpNhJjpaaSy6vRCBYFmc -8pgSoBnBI0ECgYAUKCn2atnpp5aWSTLYgNosBU4vDA1PShD14dnJMaqyr0aZtPhF -v/8b3btFJoGgPMLxgWEZ+2U4ju6sSFhPf7FXvLJu2QfQRkHZRDbEh7t5DLpTK4Fp -va9vl6Ml7uM/HsGpOLuqfIQJUs87OFCc7iCSvMJDDU37I7ekT2GKkpfbCQKBgBrE -0NeY0WcSJrp7/oqD2sOcYurpCG/rrZs2SIZmGzUhMxaa0vIXzbO59dlWELB8pmnE -Tf20K//x9qA5OxDe0PcVPukdQlH+/1zSOYNliG44FqnHtyd1TJ/gKVtMBiAiE4uO -aSClod5Yosf4SJbCFd/s5Iyfv52NqsAyp1w3Aj/BAoGAVCnEiGUfyHlIR+UH4zZW -GXJMeqdZLfcEIszMxLePkml4gUQhoq9oIs/Kw+L1DDxUwzkXN4BNTlFbOSu9gzK1 -dhuIUGfS6RPL88U+ivC3A0y2jT43oUMqe3hiRt360UQ1GXzp2dMnR9odSRB1wHoO -IOjEBZ8341/c9ZHc5PCGAG8= ------END PRIVATE KEY----- ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIJAIrEIthCfxUCMA0GCSqGSIb3DQEBCwUAMIGNMQswCQYD -VQQGEwJFUzEPMA0GA1UECAwGTWFkcmlkMREwDwYDVQQHDAhBbGNvcmNvbjEMMAoG -A1UECgwDVURTMQ4wDAYDVQQLDAVBY3RvcjESMBAGA1UEAwwJVURTIEFjdG9yMSgw -JgYJKoZIhvcNAQkBFhlzdXBwb3J0QHVkc2VudGVycHJpc2UuY29tMB4XDTE0MTAy -NjIzNDEyNFoXDTI0MTAyMzIzNDEyNFowgY0xCzAJBgNVBAYTAkVTMQ8wDQYDVQQI -DAZNYWRyaWQxETAPBgNVBAcMCEFsY29yY29uMQwwCgYDVQQKDANVRFMxDjAMBgNV -BAsMBUFjdG9yMRIwEAYDVQQDDAlVRFMgQWN0b3IxKDAmBgkqhkiG9w0BCQEWGXN1 -cHBvcnRAdWRzZW50ZXJwcmlzZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCb50K3mIznNklzyVAD7xSQOSJQ6+NPXj7U9/4zLZ+TvmbQ7RqUUsxb -fxHbeRnoYTWV2nKk4+tHqmvzujLSS/loFhTSMqtrLn7rowSYJoQhKOUkAiQlWkqC -fItWgL5pJopDpNHFul9Rn3dsPMWQTiGeUNR4Y3RnBhr1Q1BsqAzf4m6zFUmgLPPm -VLdF4uJ3Tuz8TSy2gWLs5aSr5do4WamwUfYjRSVMJECmwjUM4rQ8SQgg0sHBeBuD -UGNBvBQFac1G7qUcMReeu8ZrDUtMsXma/l4rA8NB5CRmTrQbTBF4l+jb2BDFebDq -DUK1Oqs9X35yOQfDOAFYHiixPX0IsXOZAgMBAAGjUDBOMB0GA1UdDgQWBBRShS90 -5lJTNvYPIEqP3GxWwG5iiDAfBgNVHSMEGDAWgBRShS905lJTNvYPIEqP3GxWwG5i -iDAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAU0Sp4gXhQmRVzq+7+ -vRFUkQuPj4Ga/d9r5Wrbg3hck3+5pwe9/7APoq0P/M0DBhQpiJKjrD6ydUevC+Y/ -43ZOJPhMlNw0o6TdQxOkX6FDwQanLLs7sfvJvqtVzYn3nuRFKT3dvl7Zg44QMw2M -ay42q59fAcpB4LaDx/i7gOYSS5eca3lYW7j7YSr/+ozXK2KlgUkuCUHN95lOq+dF -trmV9mjzM4CNPZqKSE7kpHRywgrXGPCO000NvEGSYf82AtgRSFKiU8NWLQSEPdcB -k//2dsQZw2cRZ8DrC2B6Tb3M+3+CA6wVyqfqZh1SZva3LfGvq/C+u+ItguzPqNpI -xtvM ------END CERTIFICATE-----''' - with open(certFile, "wt") as f: - f.write(certData) - - return certFile -# -------------- - - -class HTTPServerHandler(SimpleHTTPRequestHandler): - service = None - protocol_version = 'HTTP/1.1' - server_version = 'OpenGnsys Agent Server' - sys_version = '' - - def sendJsonError(self, code, message): - self.send_response(code) - self.send_header('Content-type', 'application/json') - self.end_headers() - self.wfile.write(json.dumps({'error': message})) - return - - def sendJsonResponse(self, data): - self.send_response(200) - data = json.dumps(data) - self.send_header('Content-type', 'application/json') - self.send_header('Content-Length', len(data)) - self.end_headers() - # Send the html message - self.wfile.write(data) - - - # parseURL - def parseUrl(self): - # Very simple path & params splitter - path = self.path.split('?')[0][1:].split('/') - - try: - params = dict((v[0], unquote(v[1])) for v in (v.split('=') for v in self.path.split('?')[1].split('&'))) - except Exception: - params = {} - - return (path, params) - - - def do_GET(self): - path, params = self.parseUrl() - - self.sendJsonResponse({'path': path, 'params': params}) - - def do_POST(self): - path, getParams = self.parseUrl() - - # Now post parameters, that are in JSON format - - - - - -class HTTPThreadingServer(ThreadingMixIn, HTTPServer): - pass - -class HTTPServerThread(threading.Thread): - def __init__(self, address, service): - super(self.__class__, self).__init__() - - HTTPServerHandler.service = service - - self.certFile = createSelfSignedCert() - self.server = HTTPThreadingServer(address, HTTPServerHandler) - self.server.socket = ssl.wrap_socket(self.server.socket, certfile=self.certFile, server_side=True) - - def getServerUrl(self): - return 'https://{}:{}/{}'.format(self.server.server_address[0], self.server.server_address[1], HTTPServerHandler.uuid) - - def stop(self): - self.server.shutdown() - - def run(self): - self.server.serve_forever() - - -if __name__ == '__main__': - thr = HTTPServerThread(('0.0.0.0', 8000), None) - print('Server started: {}'.format(thr)) - thr.start() - - \ No newline at end of file diff --git a/src/test_modules/__init__.py b/src/test_modules/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/test_modules/client/Sample1/__init__.py b/src/test_modules/client/Sample1/__init__.py deleted file mode 100644 index a6dcf49..0000000 --- a/src/test_modules/client/Sample1/__init__.py +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2014 Virtual Cable S.L. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# * Neither the name of Virtual Cable S.L. nor the names of its contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -''' -@author: Adolfo Gómez, dkmaster at dkmon dot com -''' - - -from opengnsys.workers import ClientWorker - -class Sample1(ClientWorker): - name = 'Sample1' - diff --git a/src/test_modules/client/__init__.py b/src/test_modules/client/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/test_modules/server/Sample1/__init__.py b/src/test_modules/server/Sample1/__init__.py deleted file mode 100644 index 0359b8a..0000000 --- a/src/test_modules/server/Sample1/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# Module must be imported on package, so we can initialize and load it -from .sample1 import Sample1 \ No newline at end of file diff --git a/src/test_modules/server/Sample1/sample1.py b/src/test_modules/server/Sample1/sample1.py deleted file mode 100644 index 08cb90f..0000000 --- a/src/test_modules/server/Sample1/sample1.py +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2014 Virtual Cable S.L. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# * Neither the name of Virtual Cable S.L. nor the names of its contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -''' -@author: Adolfo Gómez, dkmaster at dkmon dot com -''' - - -from opengnsys.workers import ServerWorker - -from .sample_pkg import test - -class Sample1(ServerWorker): - name='Sample1' - diff --git a/src/test_modules/server/Sample1/sample_pkg/__init__.py b/src/test_modules/server/Sample1/sample_pkg/__init__.py deleted file mode 100644 index 571a11c..0000000 --- a/src/test_modules/server/Sample1/sample_pkg/__init__.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2014 Virtual Cable S.L. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# * Neither the name of Virtual Cable S.L. nor the names of its contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -''' -@author: Adolfo Gómez, dkmaster at dkmon dot com -''' - - - -def test(): - return 'Test' \ No newline at end of file diff --git a/src/test_modules/server/__init__.py b/src/test_modules/server/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/test_rest_server.py b/src/test_rest_server.py deleted file mode 100644 index f1bdd37..0000000 --- a/src/test_rest_server.py +++ /dev/null @@ -1,210 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (c) 2015 Virtual Cable S.L. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# * Neither the name of Virtual Cable S.L. nor the names of its contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -''' -@author: Adolfo Gómez, dkmaster at dkmon dot com -''' -# pylint: disable=unused-wildcard-import,wildcard-import - - -# Pydev can't parse "six.moves.xxxx" because it is loaded lazy -from six.moves.socketserver import ThreadingMixIn # @UnresolvedImport -from six.moves.BaseHTTPServer import BaseHTTPRequestHandler # @UnresolvedImport -from six.moves.BaseHTTPServer import HTTPServer # @UnresolvedImport -from six.moves.urllib.parse import unquote # @UnresolvedImport - -import json -import threading -import ssl - -import logging -from tempfile import gettempdir -from os.path import exists, join - -logger = logging.getLogger(__name__) - - -CERTFILE = 'OGTestServer.pem' - - -def createSelfSignedCert(force=False): - - certFile = join(gettempdir(), CERTFILE) - - if exists(certFile) and not force: - return certFile - - certData = '''-----BEGIN PRIVATE KEY----- -MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCb50K3mIznNklz -yVAD7xSQOSJQ6+NPXj7U9/4zLZ+TvmbQ7RqUUsxbfxHbeRnoYTWV2nKk4+tHqmvz -ujLSS/loFhTSMqtrLn7rowSYJoQhKOUkAiQlWkqCfItWgL5pJopDpNHFul9Rn3ds -PMWQTiGeUNR4Y3RnBhr1Q1BsqAzf4m6zFUmgLPPmVLdF4uJ3Tuz8TSy2gWLs5aSr -5do4WamwUfYjRSVMJECmwjUM4rQ8SQgg0sHBeBuDUGNBvBQFac1G7qUcMReeu8Zr -DUtMsXma/l4rA8NB5CRmTrQbTBF4l+jb2BDFebDqDUK1Oqs9X35yOQfDOAFYHiix -PX0IsXOZAgMBAAECggEBAJi3000RrIUZUp6Ph0gzPMuCjDEEwWiQA7CPNX1gpb8O -dp0WhkDhUroWIaICYPSXtOwUTtVjRqivMoxPy1Thg3EIoGC/rdeSdlXRHMEGicwJ -yVyalFnatr5Xzg5wkxVh4XMd0zeDt7e3JD7s0QLo5lm1CEzd77qz6lhzFic5/1KX -bzdULtTlq60dazg2hEbcS4OmM1UMCtRVDAsOIUIZPL0M9j1C1d1iEdYnh2xshKeG -/GOfo95xsgdMlGjtv3hUT5ryKVoEsu+36rGb4VfhPfUvvoVbRx5QZpW+QvxaYh5E -Fi0JEROozFwG31Y++8El7J3yQko8cFBa1lYYUwwpNAECgYEAykT+GiM2YxJ4uVF1 -OoKiE9BD53i0IG5j87lGPnWqzEwYBwnqjEKDTou+uzMGz3MDV56UEFNho7wUWh28 -LpEkjJB9QgbsugjxIBr4JoL/rYk036e/6+U8I95lvYWrzb+rBMIkRDYI7kbQD/mQ -piYUpuCkTymNAu2RisK6bBzJslkCgYEAxVE23OQvkCeOV8hJNPZGpJ1mDS+TiOow -oOScMZmZpail181eYbAfMsCr7ri812lSj98NvA2GNVLpddil6LtS1cQ5p36lFBtV -xQUMZiFz4qVbEak+izL+vPaev/mXXsOcibAIQ+qI/0txFpNhJjpaaSy6vRCBYFmc -8pgSoBnBI0ECgYAUKCn2atnpp5aWSTLYgNosBU4vDA1PShD14dnJMaqyr0aZtPhF -v/8b3btFJoGgPMLxgWEZ+2U4ju6sSFhPf7FXvLJu2QfQRkHZRDbEh7t5DLpTK4Fp -va9vl6Ml7uM/HsGpOLuqfIQJUs87OFCc7iCSvMJDDU37I7ekT2GKkpfbCQKBgBrE -0NeY0WcSJrp7/oqD2sOcYurpCG/rrZs2SIZmGzUhMxaa0vIXzbO59dlWELB8pmnE -Tf20K//x9qA5OxDe0PcVPukdQlH+/1zSOYNliG44FqnHtyd1TJ/gKVtMBiAiE4uO -aSClod5Yosf4SJbCFd/s5Iyfv52NqsAyp1w3Aj/BAoGAVCnEiGUfyHlIR+UH4zZW -GXJMeqdZLfcEIszMxLePkml4gUQhoq9oIs/Kw+L1DDxUwzkXN4BNTlFbOSu9gzK1 -dhuIUGfS6RPL88U+ivC3A0y2jT43oUMqe3hiRt360UQ1GXzp2dMnR9odSRB1wHoO -IOjEBZ8341/c9ZHc5PCGAG8= ------END PRIVATE KEY----- ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIJAIrEIthCfxUCMA0GCSqGSIb3DQEBCwUAMIGNMQswCQYD -VQQGEwJFUzEPMA0GA1UECAwGTWFkcmlkMREwDwYDVQQHDAhBbGNvcmNvbjEMMAoG -A1UECgwDVURTMQ4wDAYDVQQLDAVBY3RvcjESMBAGA1UEAwwJVURTIEFjdG9yMSgw -JgYJKoZIhvcNAQkBFhlzdXBwb3J0QHVkc2VudGVycHJpc2UuY29tMB4XDTE0MTAy -NjIzNDEyNFoXDTI0MTAyMzIzNDEyNFowgY0xCzAJBgNVBAYTAkVTMQ8wDQYDVQQI -DAZNYWRyaWQxETAPBgNVBAcMCEFsY29yY29uMQwwCgYDVQQKDANVRFMxDjAMBgNV -BAsMBUFjdG9yMRIwEAYDVQQDDAlVRFMgQWN0b3IxKDAmBgkqhkiG9w0BCQEWGXN1 -cHBvcnRAdWRzZW50ZXJwcmlzZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCb50K3mIznNklzyVAD7xSQOSJQ6+NPXj7U9/4zLZ+TvmbQ7RqUUsxb -fxHbeRnoYTWV2nKk4+tHqmvzujLSS/loFhTSMqtrLn7rowSYJoQhKOUkAiQlWkqC -fItWgL5pJopDpNHFul9Rn3dsPMWQTiGeUNR4Y3RnBhr1Q1BsqAzf4m6zFUmgLPPm -VLdF4uJ3Tuz8TSy2gWLs5aSr5do4WamwUfYjRSVMJECmwjUM4rQ8SQgg0sHBeBuD -UGNBvBQFac1G7qUcMReeu8ZrDUtMsXma/l4rA8NB5CRmTrQbTBF4l+jb2BDFebDq -DUK1Oqs9X35yOQfDOAFYHiixPX0IsXOZAgMBAAGjUDBOMB0GA1UdDgQWBBRShS90 -5lJTNvYPIEqP3GxWwG5iiDAfBgNVHSMEGDAWgBRShS905lJTNvYPIEqP3GxWwG5i -iDAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAU0Sp4gXhQmRVzq+7+ -vRFUkQuPj4Ga/d9r5Wrbg3hck3+5pwe9/7APoq0P/M0DBhQpiJKjrD6ydUevC+Y/ -43ZOJPhMlNw0o6TdQxOkX6FDwQanLLs7sfvJvqtVzYn3nuRFKT3dvl7Zg44QMw2M -ay42q59fAcpB4LaDx/i7gOYSS5eca3lYW7j7YSr/+ozXK2KlgUkuCUHN95lOq+dF -trmV9mjzM4CNPZqKSE7kpHRywgrXGPCO000NvEGSYf82AtgRSFKiU8NWLQSEPdcB -k//2dsQZw2cRZ8DrC2B6Tb3M+3+CA6wVyqfqZh1SZva3LfGvq/C+u+ItguzPqNpI -xtvM ------END CERTIFICATE-----''' - with open(certFile, "wt") as f: - f.write(certData) - - return certFile - -class HTTPServerHandler(BaseHTTPRequestHandler): - service = None - protocol_version = 'HTTP/1.0' - server_version = 'OpenGnsys Test REST Server' - sys_version = '' - - def sendJsonError(self, code, message): - self.send_response(code) - self.send_header('Content-type', 'application/json') - self.end_headers() - self.wfile.write(json.dumps({'error': message})) - return - - def sendJsonResponse(self, data): - self.send_response(200) - data = json.dumps(data) - self.send_header('Content-type', 'application/json') - self.send_header('Content-Length', len(data)) - self.end_headers() - # Send the html message - self.wfile.write(data) - - - # parseURL - def parseUrl(self): - # Very simple path & params splitter - path = self.path.split('?')[0][1:].split('/') - - try: - params = dict((v[0], unquote(v[1])) for v in (v.split('=') for v in self.path.split('?')[1].split('&'))) - except Exception: - params = {} - - return (path, params) - - - def do_GET(self): - path, params = self.parseUrl() - - self.sendJsonResponse({'path': path, 'params': params}) - - def do_POST(self): - path, getParams = self.parseUrl() - - # Now post parameters, that are in JSON format - self.sendJsonResponse({'path': path, 'params': getParams}) - - def log_error(self, fmt, *args): - logger.error('HTTP ' + fmt % args) - - def log_message(self, fmt, *args): - logger.info('HTTP ' + fmt % args) - - -class HTTPThreadingServer(ThreadingMixIn, HTTPServer): - pass - -class HTTPServerThread(threading.Thread): - def __init__(self, address, service): - super(self.__class__, self).__init__() - - HTTPServerHandler.service = service - - self.certFile = createSelfSignedCert() - self.server = HTTPThreadingServer(address, HTTPServerHandler) - self.server.socket = ssl.wrap_socket(self.server.socket, certfile=self.certFile, server_side=True) - - logger.info('Initialized HTTPS Server thread on {}'.format(address)) - - def getServerUrl(self): - return 'https://{}:{}/{}'.format(self.server.server_address[0], self.server.server_address[1], HTTPServerHandler.uuid) - - def stop(self): - self.server.shutdown() - - def run(self): - self.server.serve_forever() - - - -if __name__ == '__main__': - logging.basicConfig( - filename='/tmp/restserver.log', - filemode='w', - format='%(levelname)s %(asctime)s %(message)s', - level=logging.DEBUG - ) - - thr = HTTPServerThread(('0.0.0.0', 9999), None) - print('Server started: {}'.format(thr)) - thr.run() - \ No newline at end of file