diff --git a/actors/src/udsactor/linux/UDSActorService.py b/actors/src/udsactor/linux/UDSActorService.py index 8fd9a4f4..67c6a28c 100644 --- a/actors/src/udsactor/linux/UDSActorService.py +++ b/actors/src/udsactor/linux/UDSActorService.py @@ -31,6 +31,11 @@ ''' from __future__ import unicode_literals +import sys +import os +import stat +import subprocess + from udsactor import operations from udsactor.service import CommonService @@ -38,23 +43,18 @@ from udsactor.service import initCfg from udsactor.service import IPC_PORT from udsactor import ipc - +from udsactor import store from udsactor.log import logger from udsactor.linux.daemon import Daemon from udsactor.linux import renamer -import sys -import os -import stat -import subprocess - POST_CMD = '/etc/udsactor/post' -PRECONNECT_CMD = '/etc/udsactor/pre' try: from prctl import set_proctitle # @UnresolvedImport except Exception: # Platform may not include prctl, so in case it's not available, we let the "name" as is + def set_proctitle(_): pass @@ -97,7 +97,6 @@ class UDSActorSvc(Daemon, CommonService): 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') @@ -108,18 +107,19 @@ class UDSActorSvc(Daemon, CommonService): # Execute script in /etc/udsactor/post after interacting with broker, if no reboot is requested ofc # This will be executed only when machine gets "ready" try: - - if os.path.isfile(PRECONNECT_CMD): - if (os.stat(PRECONNECT_CMD).st_mode & stat.S_IXUSR) != 0: - subprocess.call([PRECONNECT_CMD, user, protocol]) + pre_cmd = store.preApplication() + if os.path.isfile(pre_cmd): + if (os.stat(pre_cmd).st_mode & stat.S_IXUSR) != 0: + subprocess.call([pre_cmd, user, protocol]) else: logger.info('PRECONNECT file exists but it it is not executable (needs execution permission by root)') else: logger.info('PRECONNECT file not found & not executed') - except Exception as e: + except Exception: # Ignore output of execution command logger.error('Executing preconnect command give') + return 'ok' def run(self): cfg = initCfg() # Gets a local copy of config to get "reboot" @@ -196,6 +196,7 @@ def usage(): sys.stderr.write("usage: {} start|stop|restart|login 'username'|logout 'username'\n".format(sys.argv[0])) sys.exit(2) + if __name__ == '__main__': logger.setLevel(20000) diff --git a/actors/src/udsactor/linux/store.py b/actors/src/udsactor/linux/store.py index a6d12da3..29e46e95 100644 --- a/actors/src/udsactor/linux/store.py +++ b/actors/src/udsactor/linux/store.py @@ -30,13 +30,13 @@ @author: Adolfo Gómez, dkmaster at dkmon dot com ''' - import six import os DEBUG = False CONFIGFILE = '/etc/udsactor/udsactor.cfg' if DEBUG is False else '/tmp/udsactor.cfg' +PRECONNECT_CMD = '/etc/udsactor/pre' def checkPermissions(): @@ -79,10 +79,15 @@ def writeConfig(data): os.chmod(CONFIGFILE, 0o0600) + def useOldJoinSystem(): return False + # Right now, we do not really need an application to be run on "startup" as could ocur with windows def runApplication(): return None + +def preApplication(): + return PRECONNECT_CMD diff --git a/actors/src/udsactor/service.py b/actors/src/udsactor/service.py index 2639f4f7..84c4188a 100644 --- a/actors/src/udsactor/service.py +++ b/actors/src/udsactor/service.py @@ -92,7 +92,7 @@ class CommonService(object): def reboot(self): self.rebootRequested = True - def execute(self, cmdLine, section): + def execute(self, cmdLine, section): # pylint: disable=no-self-use cmd = shlex.split(cmdLine, posix=False) if os.path.isfile(cmd[0]): diff --git a/actors/src/udsactor/windows/UDSActorService.py b/actors/src/udsactor/windows/UDSActorService.py index ca4b2cb1..38c08227 100644 --- a/actors/src/udsactor/windows/UDSActorService.py +++ b/actors/src/udsactor/windows/UDSActorService.py @@ -32,6 +32,10 @@ from __future__ import unicode_literals # pylint: disable=unused-wildcard-import, wildcard-import +import subprocess +import os +import stat + import win32serviceutil # @UnresolvedImport, pylint: disable=import-error import win32service # @UnresolvedImport, pylint: disable=import-error import win32security # @UnresolvedImport, pylint: disable=import-error @@ -40,8 +44,6 @@ import win32event # @UnresolvedImport, pylint: disable=import-error import win32com.client # @UnresolvedImport, @UnusedImport, pylint: disable=import-error import pythoncom # @UnresolvedImport, pylint: disable=import-error import servicemanager # @UnresolvedImport, pylint: disable=import-error -import subprocess -import os from udsactor import operations from udsactor import store @@ -205,6 +207,20 @@ class UDSActorSvc(win32serviceutil.ServiceFramework, CommonService): self._user = None logger.debug('User {} already in group'.format(user)) + # Now try to run pre connect command + try: + pre_cmd = store.preApplication() + if os.path.isfile(pre_cmd): + if (os.stat(pre_cmd).st_mode & stat.S_IXUSR) != 0: + subprocess.call([pre_cmd, user, protocol]) + else: + logger.info('PRECONNECT file exists but it it is not executable (needs execution permission by root)') + else: + logger.info('PRECONNECT file not found & not executed') + except Exception as e: + # Ignore output of execution command + logger.error('Executing preconnect command give') + return 'ok' def onLogout(self, user): @@ -223,7 +239,7 @@ class UDSActorSvc(win32serviceutil.ServiceFramework, CommonService): except Exception as e: logger.error('Exception removing user from Remote Desktop Users: {}'.format(e)) - def SvcDoRun(self): + def SvcDoRun(self): # pylint: disable=too-many-statements, too-many-branches ''' Main service loop ''' diff --git a/actors/src/udsactor/windows/store.py b/actors/src/udsactor/windows/store.py index 90bf903b..fca86ad3 100644 --- a/actors/src/udsactor/windows/store.py +++ b/actors/src/udsactor/windows/store.py @@ -35,7 +35,7 @@ import pickle from win32com.shell import shell # @UnresolvedImport, pylint: disable=import-error try: import winreg as wreg -except ImportError: # Python 2.7 fallback +except ImportError: # Python 2.7 fallback import _winreg as wreg # @UnresolvedImport, pylint: disable=import-error import win32security # @UnresolvedImport, pylint: disable=import-error @@ -50,6 +50,7 @@ def encoder(data): def decoder(data): return data.decode('bz2') + path = 'Software\\UDSActor' baseKey = wreg.HKEY_CURRENT_USER if DEBUG is True else wreg.HKEY_LOCAL_MACHINE # @UndefinedVariable @@ -85,6 +86,7 @@ def readConfig(): except Exception: return None + def writeConfig(data, fixPermissions=True): try: key = wreg.OpenKey(baseKey, path, 0, wreg.KEY_ALL_ACCESS) # @UndefinedVariable @@ -96,6 +98,7 @@ def writeConfig(data, fixPermissions=True): wreg.SetValueEx(key, "", 0, wreg.REG_BINARY, encoder(pickle.dumps(data))) # @UndefinedVariable wreg.CloseKey(key) # @UndefinedVariable + def useOldJoinSystem(): try: key = wreg.OpenKey(baseKey, 'Software\\UDSEnterpriseActor', 0, wreg.KEY_QUERY_VALUE) # @UndefinedVariable @@ -109,6 +112,7 @@ def useOldJoinSystem(): return data == 'old' + # Gives the oportunity to run an application ONE TIME (because, the registry key "run" will be deleted after read) def runApplication(): try: @@ -119,8 +123,21 @@ def runApplication(): except Exception: data = None wreg.CloseKey(key) # @UndefinedVariable - except: + except Exception: data = None return data + +def preApplication(): + try: + key = wreg.OpenKey(baseKey, 'Software\\UDSEnterpriseActor', 0, wreg.KEY_ALL_ACCESS) # @UndefinedVariable + try: + data, _ = wreg.QueryValueEx(key, 'pre') # @UndefinedVariable + except Exception: + data = None + wreg.CloseKey(key) # @UndefinedVariable + except Exception: + data = None + + return data