From 217655c2760f6b6eac865ef4114de4e16815a0dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20G=C3=B3mez=20Garc=C3=ADa?= Date: Tue, 14 Feb 2017 12:05:36 +0100 Subject: [PATCH 01/19] Fixes for joining domains in multi steps using key from registro (HKEY_LOCAL_MACHINE\Sotware\UDSEntepriseActor, value "join" of type string must contain "old" (remenber that in 64 bits, this key can be under WOW3264Node) --- actors/src/udsactor/linux/store.py | 3 +++ actors/src/udsactor/windows/UDSActorService.py | 5 ++++- actors/src/udsactor/windows/store.py | 14 +++++++++++++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/actors/src/udsactor/linux/store.py b/actors/src/udsactor/linux/store.py index ca2d5d17d..dd5e6efec 100644 --- a/actors/src/udsactor/linux/store.py +++ b/actors/src/udsactor/linux/store.py @@ -78,3 +78,6 @@ def writeConfig(data): cfg.write(f) os.chmod(CONFIGFILE, 0o0600) + +def useOldJoinSystem(): + return False diff --git a/actors/src/udsactor/windows/UDSActorService.py b/actors/src/udsactor/windows/UDSActorService.py index 291ffd0ab..10d1ca5b5 100644 --- a/actors/src/udsactor/windows/UDSActorService.py +++ b/actors/src/udsactor/windows/UDSActorService.py @@ -43,6 +43,7 @@ import servicemanager # @UnresolvedImport, pylint: disable=import-error import os from udsactor import operations +from udsactor import store from udsactor.service import CommonService from udsactor.service import initCfg @@ -158,10 +159,12 @@ class UDSActorSvc(win32serviceutil.ServiceFramework, CommonService): ver = ver[0] * 10 + ver[1] logger.debug('Starting joining domain {} with name {} (detected operating version: {})'.format( domain, name, ver)) + # If file c:\compat.bin exists, joind domain in two steps instead one + # Accepts one step joinDomain, also remember XP is no more supported by # microsoft, but this also must works with it because will do a "multi # step" join - if ver >= 60: + if ver >= 60 and store.useOldJoinSystem() is False: self.oneStepJoin(name, domain, ou, account, password) else: self.multiStepJoin(name, domain, ou, account, password) diff --git a/actors/src/udsactor/windows/store.py b/actors/src/udsactor/windows/store.py index 2f2899ec8..08c54d4f1 100644 --- a/actors/src/udsactor/windows/store.py +++ b/actors/src/udsactor/windows/store.py @@ -82,7 +82,6 @@ def readConfig(): except Exception: return None - def writeConfig(data, fixPermissions=True): try: key = wreg.OpenKey(baseKey, path, 0, wreg.KEY_ALL_ACCESS) # @UndefinedVariable @@ -93,3 +92,16 @@ def writeConfig(data, fixPermissions=True): wreg.SetValueEx(key, "", 0, wreg.REG_BINARY, encoder(cPickle.dumps(data))) # @UndefinedVariable wreg.CloseKey(key) # @UndefinedVariable + +def useOldJoinSystem(): + try: + key = wreg.OpenKey(baseKey, 'Software\\UDSEnterpriseActor', 0, wreg.KEY_QUERY_VALUE) # @UndefinedVariable + try: + data, _ = wreg.QueryValueEx(key, 'join') # @UndefinedVariable + except Exception: + data = '' + wreg.CloseKey(key) # @UndefinedVariable + except: + data = '' + + return data == 'old' From c9ab76c19cfd9095c078cb728ee2e461640c0136 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20G=C3=B3mez=20Garc=C3=ADa?= Date: Tue, 14 Feb 2017 13:35:30 +0100 Subject: [PATCH 02/19] Added infor message for multple join :) --- actors/src/udsactor/windows/UDSActorService.py | 1 + 1 file changed, 1 insertion(+) diff --git a/actors/src/udsactor/windows/UDSActorService.py b/actors/src/udsactor/windows/UDSActorService.py index 10d1ca5b5..500c44bf2 100644 --- a/actors/src/udsactor/windows/UDSActorService.py +++ b/actors/src/udsactor/windows/UDSActorService.py @@ -167,6 +167,7 @@ class UDSActorSvc(win32serviceutil.ServiceFramework, CommonService): if ver >= 60 and store.useOldJoinSystem() is False: self.oneStepJoin(name, domain, ou, account, password) else: + logger.info('Using multiple step join because configuration requests to do so') self.multiStepJoin(name, domain, ou, account, password) def preConnect(self, user, protocol): From 1ad57ee70c8f1beba42f09e04f3400a8911db42f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20G=C3=B3mez=20Garc=C3=ADa?= Date: Fri, 17 Feb 2017 14:11:58 +0100 Subject: [PATCH 03/19] Simple fix --- server/src/uds/core/managers/TaskManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/uds/core/managers/TaskManager.py b/server/src/uds/core/managers/TaskManager.py index c597dae2c..e8d4b44b5 100644 --- a/server/src/uds/core/managers/TaskManager.py +++ b/server/src/uds/core/managers/TaskManager.py @@ -118,7 +118,7 @@ class TaskManager(object): thread = DelayedTaskThread() thread.start() threads.append(thread) - time.sleep(1) + time.sleep(.5) signal.signal(signal.SIGTERM, TaskManager.sigTerm) From 8ee34cd42b1e4b2b050fcfa692673d4a1eccd2ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20G=C3=B3mez=20Garc=C3=ADa?= Date: Fri, 17 Feb 2017 14:12:43 +0100 Subject: [PATCH 04/19] Coherence --- server/src/uds/core/managers/TaskManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/uds/core/managers/TaskManager.py b/server/src/uds/core/managers/TaskManager.py index e8d4b44b5..e5058a35e 100644 --- a/server/src/uds/core/managers/TaskManager.py +++ b/server/src/uds/core/managers/TaskManager.py @@ -118,7 +118,7 @@ class TaskManager(object): thread = DelayedTaskThread() thread.start() threads.append(thread) - time.sleep(.5) + time.sleep(0.5) signal.signal(signal.SIGTERM, TaskManager.sigTerm) From a83e21867960e925740915867615e9e001ff6957 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20G=C3=B3mez=20Garc=C3=ADa?= Date: Tue, 21 Feb 2017 14:51:25 +0100 Subject: [PATCH 05/19] * Fixed use of Spice over OpenNebula * Minor cosmetic fixes :) --- server/src/uds/core/util/unique.py | 6 +++--- server/src/uds/transports/SPICE/BaseSPICETransport.py | 4 ++-- server/src/uds/transports/SPICE/RemoteViewerFile.py | 9 +++++---- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/server/src/uds/core/util/unique.py b/server/src/uds/core/util/unique.py index 25be02044..a9c151264 100644 --- a/server/src/uds/core/util/unique.py +++ b/server/src/uds/core/util/unique.py @@ -34,6 +34,6 @@ from __future__ import unicode_literals # Helper to acommodate all unique generators in one place -from .UniqueGIDGenerator import UniqueGIDGenerator -from .UniqueMacGenerator import UniqueMacGenerator -from .UniqueNameGenerator import UniqueNameGenerator +from .UniqueGIDGenerator import UniqueGIDGenerator # @UnusedImport +from .UniqueMacGenerator import UniqueMacGenerator # @UnusedImport +from .UniqueNameGenerator import UniqueNameGenerator # @UnusedImport diff --git a/server/src/uds/transports/SPICE/BaseSPICETransport.py b/server/src/uds/transports/SPICE/BaseSPICETransport.py index 04dfb9b28..c2cafddce 100644 --- a/server/src/uds/transports/SPICE/BaseSPICETransport.py +++ b/server/src/uds/transports/SPICE/BaseSPICETransport.py @@ -44,7 +44,7 @@ from uds.services.OVirt.OVirtProvider import Provider as oVirtProvider import logging import os -__updated__ = '2016-05-27' +__updated__ = '2017-02-21' logger = logging.getLogger(__name__) @@ -85,7 +85,7 @@ class BaseSpiceTransport(Transport): multiline=4, label=_('Certificate'), tooltip=_('Server certificate (public), can be found on your ovirt engine, probably at /etc/pki/ovirt-engine/certs/ca.der (Use the contents of this file).'), - required=True + required=False ) fullScreen = gui.CheckBoxField( order=5, diff --git a/server/src/uds/transports/SPICE/RemoteViewerFile.py b/server/src/uds/transports/SPICE/RemoteViewerFile.py index 8b540b0cd..8fa97b1aa 100644 --- a/server/src/uds/transports/SPICE/RemoteViewerFile.py +++ b/server/src/uds/transports/SPICE/RemoteViewerFile.py @@ -8,7 +8,7 @@ import six import os -__updated__ = '2016-05-27' +__updated__ = '2017-02-21' TEMPLATE = '''[virt-viewer] @@ -29,7 +29,7 @@ ca={ca} toggle-fullscreen=shift+f11 release-cursor=shift+f12 secure-attention=ctrl+alt+end -secure-channels=main;inputs;cursor;playback;record;display;usbredir;smartcard +{secure_channel} ''' @@ -81,6 +81,7 @@ class RemoteViewerFile(object): smartcard=smartcard, usb_auto_share=usb_auto_share, delete_file=delete_file, - host_subject=self.host_subject, - ca=ca + host_subject=self.host_subject if self.tls_port != -1 else '', + ca=ca if self.tls_port != -1 else '', + secure_channel='secure-channels=main;inputs;cursor;playback;record;display;usbredir;smartcard' if self.tls_port != -1 else '' ) From bd3d0dd00638dc6dfbe5577982c09f617bd00fe2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20G=C3=B3mez=20Garc=C3=ADa?= Date: Wed, 22 Feb 2017 10:38:27 +0100 Subject: [PATCH 06/19] Minor fixes for actor for linux --- actors/src/udsactor/linux/UDSActorService.py | 20 +++++++++++++++++-- actors/src/udsactor/service.py | 2 ++ .../src/udsactor/windows/UDSActorService.py | 2 +- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/actors/src/udsactor/linux/UDSActorService.py b/actors/src/udsactor/linux/UDSActorService.py index 1be95988a..3569b97ab 100644 --- a/actors/src/udsactor/linux/UDSActorService.py +++ b/actors/src/udsactor/linux/UDSActorService.py @@ -36,6 +36,7 @@ from udsactor import operations from udsactor.service import CommonService from udsactor.service import initCfg from udsactor.service import IPC_PORT + from udsactor import ipc from udsactor.log import logger @@ -58,6 +59,8 @@ except Exception: # Platform may not include prctl, so in case it's not availab class UDSActorSvc(Daemon, CommonService): + rebootMachineAfterOp = False + def __init__(self, args=None): Daemon.__init__(self, '/var/run/udsa.pid') CommonService.__init__(self) @@ -67,6 +70,12 @@ class UDSActorSvc(Daemon, CommonService): Renames the computer, and optionally sets a password for an user before this ''' + hostName = operations.getComputerName() + + if hostName.lower() == name.lower(): + logger.info('Computer name is now {}'.format(hostName)) + self.setReady() + return # Check for password change request for an user if user is not None: @@ -80,13 +89,20 @@ class UDSActorSvc(Daemon, CommonService): 'Could not change password for user {} (maybe invalid current password is configured at broker): {} '.format(user, unicode(e))) renamer.rename(name) - self.setReady() + + if self.rebootMachineAfterOp is False: + self.setReady() + else: + logger.info('Rebooting computer to activate new name {}'.format(name)) + self.reboot() + def joinDomain(self, name, domain, ou, account, password): logger.fatal('Join domain is not supported on linux platforms right now') def run(self): - initCfg() + localCfg = initCfg() # Gets a local copy of config to get "reboot" + self.rebootMachineAfterOp = localCfg.get('reboot', 'false') == 'true' logger.debug('Running Daemon') set_proctitle('UDSActorDaemon') diff --git a/actors/src/udsactor/service.py b/actors/src/udsactor/service.py index 252b94b3f..024a75321 100644 --- a/actors/src/udsactor/service.py +++ b/actors/src/udsactor/service.py @@ -70,6 +70,8 @@ def initCfg(): cfg = None break + return cfg + class CommonService(object): def __init__(self): diff --git a/actors/src/udsactor/windows/UDSActorService.py b/actors/src/udsactor/windows/UDSActorService.py index 500c44bf2..cc31386dd 100644 --- a/actors/src/udsactor/windows/UDSActorService.py +++ b/actors/src/udsactor/windows/UDSActorService.py @@ -114,7 +114,7 @@ class UDSActorSvc(win32serviceutil.ServiceFramework, CommonService): operations.renameComputer(name) # Reboot just after renaming - logger.info('Rebooting computer got activate new name {}'.format(name)) + logger.info('Rebooting computer to activate new name {}'.format(name)) self.reboot() def oneStepJoin(self, name, domain, ou, account, password): From 2664be7ec4fd73a89e2e71e7d6b6df923bbfc227 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20G=C3=B3mez=20Garc=C3=ADa?= Date: Wed, 22 Feb 2017 11:49:42 +0100 Subject: [PATCH 07/19] fixes for linux actor --- actors/src/udsactor/linux/UDSActorService.py | 11 ++++++++--- actors/src/udsactor/service.py | 2 -- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/actors/src/udsactor/linux/UDSActorService.py b/actors/src/udsactor/linux/UDSActorService.py index 3569b97ab..5a48c9a97 100644 --- a/actors/src/udsactor/linux/UDSActorService.py +++ b/actors/src/udsactor/linux/UDSActorService.py @@ -36,6 +36,7 @@ from udsactor import operations from udsactor.service import CommonService from udsactor.service import initCfg from udsactor.service import IPC_PORT +from udsactor.service import cfg from udsactor import ipc @@ -73,7 +74,7 @@ class UDSActorSvc(Daemon, CommonService): hostName = operations.getComputerName() if hostName.lower() == name.lower(): - logger.info('Computer name is now {}'.format(hostName)) + logger.info('Computer name is already {}'.format(hostName)) self.setReady() return @@ -101,8 +102,12 @@ class UDSActorSvc(Daemon, CommonService): logger.fatal('Join domain is not supported on linux platforms right now') def run(self): - localCfg = initCfg() # Gets a local copy of config to get "reboot" - self.rebootMachineAfterOp = localCfg.get('reboot', 'false') == 'true' + initCfg() # Gets a local copy of config to get "reboot" + + if cfg is not None: + self.rebootMachineAfterOp = cfg.get('reboot', False) + else: + self.rebootMachineAfterOp = False logger.debug('Running Daemon') set_proctitle('UDSActorDaemon') diff --git a/actors/src/udsactor/service.py b/actors/src/udsactor/service.py index 024a75321..252b94b3f 100644 --- a/actors/src/udsactor/service.py +++ b/actors/src/udsactor/service.py @@ -70,8 +70,6 @@ def initCfg(): cfg = None break - return cfg - class CommonService(object): def __init__(self): From 548f44b1a7aa23efe36d454e3a19fa38ba4d72f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20G=C3=B3mez=20Garc=C3=ADa?= Date: Wed, 22 Feb 2017 12:30:02 +0100 Subject: [PATCH 08/19] last fixes --- actors/src/udsactor/linux/UDSActorService.py | 7 +++++-- actors/src/udsactor/service.py | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/actors/src/udsactor/linux/UDSActorService.py b/actors/src/udsactor/linux/UDSActorService.py index 5a48c9a97..6c7eac42d 100644 --- a/actors/src/udsactor/linux/UDSActorService.py +++ b/actors/src/udsactor/linux/UDSActorService.py @@ -36,7 +36,6 @@ from udsactor import operations from udsactor.service import CommonService from udsactor.service import initCfg from udsactor.service import IPC_PORT -from udsactor.service import cfg from udsactor import ipc @@ -102,13 +101,17 @@ class UDSActorSvc(Daemon, CommonService): logger.fatal('Join domain is not supported on linux platforms right now') def run(self): - initCfg() # Gets a local copy of config to get "reboot" + cfg = initCfg() # Gets a local copy of config to get "reboot" + + logger.debug('CFG: {}'.format(cfg)) if cfg is not None: self.rebootMachineAfterOp = cfg.get('reboot', False) else: self.rebootMachineAfterOp = False + logger.info('Rebbot after is {}'.format(self.rebootMachineAfterOp)) + logger.debug('Running Daemon') set_proctitle('UDSActorDaemon') diff --git a/actors/src/udsactor/service.py b/actors/src/udsactor/service.py index 252b94b3f..024a75321 100644 --- a/actors/src/udsactor/service.py +++ b/actors/src/udsactor/service.py @@ -70,6 +70,8 @@ def initCfg(): cfg = None break + return cfg + class CommonService(object): def __init__(self): From efbca46af974e3179eae67f9f43ee626c576e69e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20G=C3=B3mez=20Garc=C3=ADa?= Date: Wed, 22 Feb 2017 12:51:32 +0100 Subject: [PATCH 09/19] small typo --- actors/src/udsactor/linux/UDSActorService.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actors/src/udsactor/linux/UDSActorService.py b/actors/src/udsactor/linux/UDSActorService.py index 6c7eac42d..3cd21ed5c 100644 --- a/actors/src/udsactor/linux/UDSActorService.py +++ b/actors/src/udsactor/linux/UDSActorService.py @@ -110,7 +110,7 @@ class UDSActorSvc(Daemon, CommonService): else: self.rebootMachineAfterOp = False - logger.info('Rebbot after is {}'.format(self.rebootMachineAfterOp)) + logger.info('Reboot after is {}'.format(self.rebootMachineAfterOp)) logger.debug('Running Daemon') set_proctitle('UDSActorDaemon') From 1626fe96b1a0e31a8565df9e5e4990bd26420714 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20G=C3=B3mez=20Garc=C3=ADa?= Date: Wed, 22 Feb 2017 13:32:28 +0100 Subject: [PATCH 10/19] Fixed getting password for access spice from OpenNebula --- server/src/uds/services/OpenNebula/on/vm.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/uds/services/OpenNebula/on/vm.py b/server/src/uds/services/OpenNebula/on/vm.py index c43ade4e9..2050472f9 100644 --- a/server/src/uds/services/OpenNebula/on/vm.py +++ b/server/src/uds/services/OpenNebula/on/vm.py @@ -39,7 +39,7 @@ from defusedxml import minidom # Python bindings for OpenNebula from .common import VmState -__updated__ = '2017-01-26' +__updated__ = '2017-02-22' logger = logging.getLogger(__name__) @@ -187,7 +187,7 @@ def getDisplayConnection(api, machineId): type_ = graphics.getElementsByTagName('TYPE')[0].childNodes[0].data port = graphics.getElementsByTagName('PORT')[0].childNodes[0].data try: - passwd = graphics.getElementsByTagName('PASSWD').childNodes[0].data + passwd = graphics.getElementsByTagName('PASSWD')[0].childNodes[0].data except Exception: passwd = '' From cc7740bafbf51d6cace747091b05a539294f108a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20G=C3=B3mez=20Garc=C3=ADa?= Date: Mon, 27 Feb 2017 07:45:38 +0100 Subject: [PATCH 11/19] Translation Fix --- server/src/uds/REST/methods/user_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/uds/REST/methods/user_services.py b/server/src/uds/REST/methods/user_services.py index 84e2b5ff6..75536a33e 100644 --- a/server/src/uds/REST/methods/user_services.py +++ b/server/src/uds/REST/methods/user_services.py @@ -356,5 +356,5 @@ class Changelog(DetailHandler): return [ {'revision': {'title': _('Revision'), 'type': 'numeric', 'width': '6em'}}, {'stamp': {'title': _('Publish date'), 'type': 'datetime'}}, - {'log': {'title': _('State')}}, + {'log': {'title': _('Comment')}}, ] From c6dd782150b2fcafa45bec32f08e3a0c171f43dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20G=C3=B3mez=20Garc=C3=ADa?= Date: Mon, 27 Feb 2017 07:57:47 +0100 Subject: [PATCH 12/19] * Fixed webLogout if we accesed UDS using ticketing system --- server/src/uds/web/views/index.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/uds/web/views/index.py b/server/src/uds/web/views/index.py index 536b822fe..423afd9cc 100644 --- a/server/src/uds/web/views/index.py +++ b/server/src/uds/web/views/index.py @@ -52,7 +52,7 @@ import logging logger = logging.getLogger(__name__) -__updated__ = '2017-02-02' +__updated__ = '2017-02-27' def about(request): @@ -77,7 +77,7 @@ def index(request): :param request: http request ''' if request.session.get('ticket') == '1': - return webLogout() + return webLogout(request) # Session data os = request.os From 170319f871709a1a2538a9a46f3bdd8a5d5f8bd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20G=C3=B3mez=20Garc=C3=ADa?= Date: Mon, 27 Feb 2017 08:11:46 +0100 Subject: [PATCH 13/19] Fix for very very weird situation (invalid argument in case no OS was detected...) --- server/src/uds/transports/NX/NXTransport.py | 2 +- server/src/uds/transports/NX/TSNXTransport.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/uds/transports/NX/NXTransport.py b/server/src/uds/transports/NX/NXTransport.py index 6925f2274..f909d6f5a 100644 --- a/server/src/uds/transports/NX/NXTransport.py +++ b/server/src/uds/transports/NX/NXTransport.py @@ -202,6 +202,6 @@ class NXTransport(Transport): }.get(os['OS']) if os is None: - return super(NXTransport, self).getUDSTransportScript(self, userService, transport, ip, os, user, password, request) + return super(self.__class__, self).getUDSTransportScript(userService, transport, ip, os, user, password, request) return self.getScript('scripts/{}/direct.py'.format(os)).format(r=r) diff --git a/server/src/uds/transports/NX/TSNXTransport.py b/server/src/uds/transports/NX/TSNXTransport.py index 03aa1c942..05177a83a 100644 --- a/server/src/uds/transports/NX/TSNXTransport.py +++ b/server/src/uds/transports/NX/TSNXTransport.py @@ -237,7 +237,7 @@ class TSNXTransport(Transport): }.get(os['OS']) if os is None: - return super(TSNXTransport, self).getUDSTransportScript(self, userService, transport, ip, os, user, password, request) + return super(self.__class__, self).getUDSTransportScript(userService, transport, ip, os, user, password, request) return self.getScript('scripts/{}/tunnel.py'.format(os)).format( r=r, From c62e90f0a10d4b51cc1fb419e4fad7e36e8cfbf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20G=C3=B3mez=20Garc=C3=ADa?= Date: Tue, 28 Feb 2017 10:28:35 +0100 Subject: [PATCH 14/19] Small fix for better cancel on opennebula --- server/src/uds/services/OpenNebula/LiveDeployment.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/uds/services/OpenNebula/LiveDeployment.py b/server/src/uds/services/OpenNebula/LiveDeployment.py index c28fedcc2..e32e48890 100644 --- a/server/src/uds/services/OpenNebula/LiveDeployment.py +++ b/server/src/uds/services/OpenNebula/LiveDeployment.py @@ -39,7 +39,7 @@ from . import on import pickle import logging -__updated__ = '2016-07-11' +__updated__ = '2017-02-28' logger = logging.getLogger(__name__) @@ -500,7 +500,7 @@ class LiveDeployment(UserDeployment): if op == opError: return self.__error('Machine is already in error state!') - if op == opFinish or op == opWait: + if op in [opFinish, opWait, opStart]: self._queue = [opRemove, opFinish] return self.__executeQueue() From f11bccc8686e1234f460add3beefb9a95224659b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20G=C3=B3mez=20Garc=C3=ADa?= Date: Tue, 28 Feb 2017 11:38:17 +0100 Subject: [PATCH 15/19] Last fixes for OpenNebula (now correctly detect "done" VM State) --- server/src/uds/services/OpenNebula/LiveDeployment.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/uds/services/OpenNebula/LiveDeployment.py b/server/src/uds/services/OpenNebula/LiveDeployment.py index e32e48890..ec039a0fd 100644 --- a/server/src/uds/services/OpenNebula/LiveDeployment.py +++ b/server/src/uds/services/OpenNebula/LiveDeployment.py @@ -224,7 +224,7 @@ class LiveDeployment(UserDeployment): state = self.service().getMachineState(self._vmid) # If we want to check an state and machine does not exists (except in case that we whant to check this) - if state == on.VmState.UNKNOWN: + if state in [on.VmState.UNKNOWN, on.VmState.DONE]: return self.__error('Machine not found') ret = State.RUNNING @@ -500,7 +500,7 @@ class LiveDeployment(UserDeployment): if op == opError: return self.__error('Machine is already in error state!') - if op in [opFinish, opWait, opStart]: + if op in [opFinish, opWait, opStart, opCreate]: self._queue = [opRemove, opFinish] return self.__executeQueue() From 0c7a4911d21f1d72799523a29d5267f46d2f0d68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20G=C3=B3mez=20Garc=C3=ADa?= Date: Thu, 2 Mar 2017 22:34:33 +0100 Subject: [PATCH 16/19] Small message fix --- server/src/uds/services/OpenNebula/on/template.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/uds/services/OpenNebula/on/template.py b/server/src/uds/services/OpenNebula/on/template.py index 240afbab8..84ad07175 100644 --- a/server/src/uds/services/OpenNebula/on/template.py +++ b/server/src/uds/services/OpenNebula/on/template.py @@ -38,7 +38,7 @@ from defusedxml import minidom # Python bindings for OpenNebula from .common import sanitizeName -__updated__ = '2016-07-27' +__updated__ = '2017-03-02' logger = logging.getLogger(__name__) @@ -155,7 +155,7 @@ def remove(api, templateId): api.deleteTemplate(templateId) # api.call('template.delete', int(templateId)) except Exception as e: - logger.error('Creating template on OpenNebula: {}'.format(e)) + logger.error('Removing template on OpenNebula: {}'.format(e)) def deployFrom(api, templateId, name): ''' From 22313a517f2a6f2c8eee15eb5e748e876cd078af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20G=C3=B3mez=20Garc=C3=ADa?= Date: Fri, 3 Mar 2017 08:30:24 +0100 Subject: [PATCH 17/19] Small opennebula fix for better control of certain situations... --- server/src/uds/services/OpenNebula/on/vm.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/server/src/uds/services/OpenNebula/on/vm.py b/server/src/uds/services/OpenNebula/on/vm.py index 2050472f9..8efde47d2 100644 --- a/server/src/uds/services/OpenNebula/on/vm.py +++ b/server/src/uds/services/OpenNebula/on/vm.py @@ -39,7 +39,7 @@ from defusedxml import minidom # Python bindings for OpenNebula from .common import VmState -__updated__ = '2017-02-22' +__updated__ = '2017-03-03' logger = logging.getLogger(__name__) @@ -157,11 +157,15 @@ def getNetInfo(api, machineId, networkId=None): md = minidom.parseString(api.VMInfo(machineId)[1]) node = md - for nic in md.getElementsByTagName('NIC'): - netId = nic.getElementsByTagName('NETWORK_ID')[0].childNodes[0].data - if networkId is None or int(netId) == int(networkId): - node = nic - break + try: + for nic in md.getElementsByTagName('NIC'): + netId = nic.getElementsByTagName('NETWORK_ID')[0].childNodes[0].data + if networkId is None or int(netId) == int(networkId): + node = nic + break + except Exception: + raise Exception('No network interface found on template. Please, add a network and republish.') + logger.debug(node.toxml()) # Default, returns first MAC found (or raise an exception if there is no MAC) From 4c7b48588f1944b71407b19ad707a537ba7b4e4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20G=C3=B3mez=20Garc=C3=ADa?= Date: Fri, 3 Mar 2017 11:03:09 +0100 Subject: [PATCH 18/19] Fixed ovirt 4 client "unicode" problems :) * --- .../uds/services/OVirt/client/oVirtClient4.py | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/server/src/uds/services/OVirt/client/oVirtClient4.py b/server/src/uds/services/OVirt/client/oVirtClient4.py index 8c9cd77aa..f8fb01675 100644 --- a/server/src/uds/services/OVirt/client/oVirtClient4.py +++ b/server/src/uds/services/OVirt/client/oVirtClient4.py @@ -5,13 +5,12 @@ Created on Nov 14, 2012 ''' import ovirtsdk4 as ovirt -import ovirtsdk4.types import threading import logging -import re +import six -__updated__ = '2016-09-11' +__updated__ = '2017-03-03' logger = logging.getLogger(__name__) @@ -224,7 +223,7 @@ class Client(object): api = self.__getApi() - c = api.system_service().clusters_service().service(clusterId).get() + c = api.system_service().clusters_service().service(six.binary_type(clusterId)).get() dc = c.data_center @@ -274,7 +273,7 @@ class Client(object): api = self.__getApi() - datacenter_service = api.system_service().data_centers_service().service(datacenterId) + datacenter_service = api.system_service().data_centers_service().service(six.binary_type(datacenterId)) d = datacenter_service.get() storage = [] @@ -328,7 +327,7 @@ class Client(object): api = self.__getApi() - dd = api.system_service().storage_domains_service().service(storageId).get() + dd = api.system_service().storage_domains_service().service(six.binary_type(storageId)).get() res = { 'id': dd.id, @@ -368,9 +367,9 @@ class Client(object): # cluster = ov.clusters_service().service('00000002-0002-0002-0002-0000000002e4') # .get() # vm = ov.vms_service().service('e7ff4e00-b175-4e80-9c1f-e50a5e76d347') # .get() - vms = api.system_service().vms_service().service(machineId) + vms = api.system_service().vms_service().service(six.binary_type(machineId)) - cluster = api.system_service().clusters_service().service(clusterId).get() + cluster = api.system_service().clusters_service().service(six.binary_type(clusterId)).get() vm = vms.get() if vm is None: @@ -422,7 +421,7 @@ class Client(object): api = self.__getApi() - template = api.system_service().templates_service().service(templateId).get() + template = api.system_service().templates_service().service(six.binary_type(templateId)).get() if template is None: return 'removed' @@ -457,8 +456,8 @@ class Client(object): logger.debug('Deploying machine {0}'.format(name)) - cluster = ovirt.types.Cluster(id=clusterId) - template = ovirt.types.Template(id=templateId) + cluster = ovirt.types.Cluster(id=six.binary_type(clusterId)) + template = ovirt.types.Template(id=six.binary_type(templateId)) if usbType in ('native', 'legacy'): usb = ovirt.types.Usb(enabled=True, type=ovirt.types.UsbType.NATIVE if usbType == 'native' else ovirt.types.UsbType.LEGACY) else: @@ -485,7 +484,7 @@ class Client(object): api = self.__getApi() - api.system_service().templates_service().service(templateId).remove() + api.system_service().templates_service().service(six.binary_type(templateId)).remove() # This returns nothing, if it fails it raises an exception finally: lock.release() @@ -511,7 +510,7 @@ class Client(object): api = self.__getApi() - vm = api.system_service().vms_service().service(machineId).get() + vm = api.system_service().vms_service().service(six.binary_type(machineId)).get() if vm is None or vm.status is None: return 'unknown' @@ -538,7 +537,7 @@ class Client(object): api = self.__getApi() - vmService = api.system_service().vms_service().service(machineId) + vmService = api.system_service().vms_service().service(six.binary_type(machineId)) if vmService.get() is None: raise Exception('Machine not found') @@ -562,7 +561,7 @@ class Client(object): api = self.__getApi() - vmService = api.system_service().vms_service().service(machineId) + vmService = api.system_service().vms_service().service(six.binary_type(machineId)) if vmService.get() is None: raise Exception('Machine not found') @@ -586,7 +585,7 @@ class Client(object): api = self.__getApi() - vmService = api.system_service().vms_service().service(machineId) + vmService = api.system_service().vms_service().service(six.binary_type(machineId)) if vmService.get() is None: raise Exception('Machine not found') @@ -610,7 +609,7 @@ class Client(object): api = self.__getApi() - vmService = api.system_service().vms_service().service(machineId) + vmService = api.system_service().vms_service().service(six.binary_type(machineId)) if vmService.get() is None: raise Exception('Machine not found') @@ -629,7 +628,7 @@ class Client(object): api = self.__getApi() - vmService = api.system_service().vms_service().service(machineId) + vmService = api.system_service().vms_service().service(six.binary_type(machineId)) if vmService.get() is None: raise Exception('Machine not found') @@ -652,7 +651,7 @@ class Client(object): lock.acquire(True) api = self.__getApi() - vmService = api.system_service().vms_service().service(machineId) + vmService = api.system_service().vms_service().service(six.binary_type(machineId)) vm = vmService.get() if vm is None: From d566285098b2a764c3e4572b3ac653ddde15c51e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20G=C3=B3mez=20Garc=C3=ADa?= Date: Mon, 6 Mar 2017 08:40:22 +0100 Subject: [PATCH 19/19] Minor fixes --- server/src/uds/services/OpenNebula/on/template.py | 4 ++-- server/src/uds/transports/SPICE/scripts/macosx/direct.py | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/server/src/uds/services/OpenNebula/on/template.py b/server/src/uds/services/OpenNebula/on/template.py index 84ad07175..5de9df660 100644 --- a/server/src/uds/services/OpenNebula/on/template.py +++ b/server/src/uds/services/OpenNebula/on/template.py @@ -38,7 +38,7 @@ from defusedxml import minidom # Python bindings for OpenNebula from .common import sanitizeName -__updated__ = '2017-03-02' +__updated__ = '2017-03-03' logger = logging.getLogger(__name__) @@ -113,7 +113,7 @@ def create(api, fromTemplateId, name, toDataStore): return six.text_type(templateId) except Exception as e: - logger.error('Creating template on OpenNebula: {}'.format(e)) + logger.exception('Creating template on OpenNebula: {}'.format(e)) try: api.deleteTemplate(templateId) # Try to remove created template in case of fail except Exception: diff --git a/server/src/uds/transports/SPICE/scripts/macosx/direct.py b/server/src/uds/transports/SPICE/scripts/macosx/direct.py index e6045576e..0b248a6bc 100644 --- a/server/src/uds/transports/SPICE/scripts/macosx/direct.py +++ b/server/src/uds/transports/SPICE/scripts/macosx/direct.py @@ -27,9 +27,6 @@ if not os.path.isfile(remoteViewer): theFile = '''{m.r.as_file}''' -filename = tools.saveTempFile(theFile) - - filename = tools.saveTempFile(theFile) subprocess.Popen([remoteViewer, filename])