From adb88c41e36c0676296f0904b9a8d6dafc09561d Mon Sep 17 00:00:00 2001 From: Ivan Maslov Date: Thu, 30 Jun 2022 11:18:47 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B2=D0=B5=D0=B4?= =?UTF-8?q?=D0=B5=D0=BD=20orchestrator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Orchestrator/__Orchestrator__.py | 379 ++++++++---------- 1 file changed, 173 insertions(+), 206 deletions(-) diff --git a/Sources/pyOpenRPA/Orchestrator/__Orchestrator__.py b/Sources/pyOpenRPA/Orchestrator/__Orchestrator__.py index 06f16e95..dca95b25 100644 --- a/Sources/pyOpenRPA/Orchestrator/__Orchestrator__.py +++ b/Sources/pyOpenRPA/Orchestrator/__Orchestrator__.py @@ -1779,18 +1779,20 @@ def ProcessorActivityItemAppend(inGSettings = None, inDef=None, inArgList=None, ## Process defs def ProcessIsStarted(inProcessNameWOExeStr): # Check if process is started """ - Check if there is any running process that contains the given name processName. + Проверить, запущен ли процесс, который в наименовании содержит inProcessNameWOExeStr. + !ВНИМАНИЕ! ПРОВЕРЯЕТ ВСЕ ПРОЦЕССЫ ОПЕРАЦИОННОЙ СИСТЕМЫ. И ДРУГИХ ПОЛЬЗОВАТЕЛЬСКИХ СЕССИЙ, ЕСЛИ ОНИ ЗАПУЩЕНЫ НА ЭТОЙ МАШИНЕ. + .. code-block:: python - # USAGE + # ПРИМЕР from pyOpenRPA import Orchestrator lProcessIsStartedBool = Orchestrator.ProcessIsStarted(inProcessNameWOExeStr = "notepad") # lProcessIsStartedBool is True - notepad.exe is running on the Orchestrator machine - :param inProcessNameWOExeStr: Process name WithOut (WO) '.exe' postfix. Example: "notepad" (not "notepad.exe") - :return: True - process is running on the orchestrator machine; False - process is not running on the orchestrator machine + :param inProcessNameWOExeStr: Наименование процесса без расширения .exe (WO = WithOut = Без) Пример: Для проверки процесса блокнота нужно указывать "notepad", не "notepad.exe" + :return: True - Процесс запущен на ОС ; False - Процесс не запущен на ОС, где работает Оркестратор """ #Iterate over the all the running process for proc in psutil.process_iter(): @@ -1804,11 +1806,13 @@ def ProcessIsStarted(inProcessNameWOExeStr): # Check if process is started def ProcessStart(inPathStr, inArgList, inStopProcessNameWOExeStr=None): """ - Start process locally. Extra feature: Use inStopProcessNameWOExeStr to stop the execution if current process is running. + Запуск процесса на сессии Оркестратора, если на ОС не запущен процесс inStopProcessNameWOExeStr. + + !ВНИМАНИЕ! ПРИ ПРОВЕРКЕ РАНЕЕ ЗАПУЩЕННЫХ ПРОЦЕССОВ ПРОВЕРЯЕТ ВСЕ ПРОЦЕССЫ ОПЕРАЦИОННОЙ СИСТЕМЫ. И ДРУГИХ ПОЛЬЗОВАТЕЛЬСКИХ СЕССИЙ, ЕСЛИ ОНИ ЗАПУЩЕНЫ НА ЭТОЙ МАШИНЕ. .. code-block:: python - # USAGE + # ПРИМЕР from pyOpenRPA import Orchestrator Orchestrator.ProcessStart( @@ -1817,10 +1821,9 @@ def ProcessStart(inPathStr, inArgList, inStopProcessNameWOExeStr=None): inStopProcessNameWOExeStr = "notepad") # notepad.exe will be started if no notepad.exe is active on the machine - :param inPathStr: Command to send in CMD - :param inArgList: List of the arguments for the CMD command. Example: ["test.txt"] - :param inStopProcessNameWOExeStr: Trigger: stop execution if process is running. Process name WithOut (WO) '.exe' postfix. Example: "notepad" (not "notepad.exe") - :return: None - nothing is returned. If process will not start -exception will be raised + :param inPathStr: Путь к файлу запускаемого процесса + :param inArgList: Список аргументов, передаваемых в запускаемый процесс. Пример: ["test.txt"] + :param inStopProcessNameWOExeStr: Доп. контроль: Не запускать процесс, если обнаружен запущенный процесс под наименованием inStopProcessNameWOExeStr без расширения .exe (WO = WithOut = Без) """ lStartProcessBool = True if inStopProcessNameWOExeStr is not None: #Check if process running @@ -1841,11 +1844,11 @@ def ProcessStart(inPathStr, inArgList, inStopProcessNameWOExeStr=None): def ProcessStop(inProcessNameWOExeStr, inCloseForceBool, inUserNameStr = "%username%"): """ - Stop process on the orchestrator machine. You can set user session on the machine and set flag about to force close process. + Остановить процесс на ОС, где работает Оркестратор, под учетной записью inUserNameStr. .. code-block:: python - # USAGE + # ПРИМЕР from pyOpenRPA import Orchestrator Orchestrator.ProcessStop( @@ -1854,10 +1857,9 @@ def ProcessStop(inProcessNameWOExeStr, inCloseForceBool, inUserNameStr = "%usern inUserNameStr = "USER_99") # Will close process "notepad.exe" on the user session "USER_99" (!ATTENTION! if process not exists no exceptions will be raised) - :param inProcessNameWOExeStr: Process name WithOut (WO) '.exe' postfix. Example: "notepad" (not "notepad.exe") - :param inCloseForceBool: True - do force close. False - send signal to safe close (!ATTENTION! - Safe close works only in orchestrator session. Win OS doens't allow to send safe close signal between GUI sessions) - :param inUserNameStr: User name which is has current process to close. Default value is close process on the Orchestrator session - :return: None + :param inProcessNameWOExeStr: Наименование процесса без расширения .exe (WO = WithOut = Без). Пример: Для проверки процесса блокнота нужно указывать "notepad", не "notepad.exe" + :param inCloseForceBool: True - принудительно завершить процесс. False - отправить сигнал на безопасное отключение (!ВНИМАНИЕ! - ОС не позволяет отправлять сигнал на безопасное отключение на другую сесиию - только на той, где работает Оркестратор) + :param inUserNameStr: Наименование пользователя, под именем которого искать процесс для остановки. По умолчанию "%username%" - искать процесс на текущей сессии """ # Support input arg if with .exe lProcessNameWExeStr = inProcessNameWOExeStr @@ -1878,30 +1880,32 @@ def ProcessStop(inProcessNameWOExeStr, inCloseForceBool, inUserNameStr = "%usern def ProcessListGet(inProcessNameWOExeList=None): """ - Return process list on the orchestrator machine sorted by Memory Usage. You can determine the list of the processes you are interested - def will return the list about it. + Вернуть список процессов, запущенных на ОС, где работает Оркестратор. В списке отсортировать процессы по количеству используемой оперативной памяти. Также можно указать перечень процессов, которые интересуют - функция будет показывать активные из них. + + !ВНИМАНИЕ! ДЛЯ ПОЛУЧЕНИЯ СПИСКА ВСЕХ ПРОЦЕССОВ ОС НЕОБХОДИМО ЗАПУСКАТЬ ОРКЕСТРАТОР С ПРАВАМИ АДМИНИСТРАТОРА. .. code-block:: python - # USAGE + # ПРИМЕР from pyOpenRPA import Orchestrator lProcessList = Orchestrator.ProcessListGet() # Return the list of the process on the machine. # !ATTENTION! RUn orchestrator as administrator to get all process list on the machine. - :param inProcessNameWOExeList: - :return: { - "ProcessWOExeList": ["notepad","..."], - "ProcessWOExeUpperList": ["NOTEPAD","..."], - "ProcessDetailList": [ - { - 'pid': 412, - 'username': "DESKTOP\\USER", - 'name': 'notepad.exe', - 'vms': 13.77767775, - 'NameWOExeUpperStr': 'NOTEPAD', - 'NameWOExeStr': "'notepad'"}, - {...}] + :param inProcessNameWOExeList: Список процессов, среди которых искать активные. Если параметр не указывать - вернет перечень всех доступных процессов + :return: Сведения о запущенных процессах в следующем формате { + "ProcessWOExeList": ["notepad","..."], + "ProcessWOExeUpperList": ["NOTEPAD","..."], + "ProcessDetailList": [ + { + 'pid': 412, # Идентификатор процесса + 'username': "DESKTOP\\USER", + 'name': 'notepad.exe', + 'vms': 13.77767775, # В Мб + 'NameWOExeUpperStr': 'NOTEPAD', + 'NameWOExeStr': "'notepad'"}, + {...}] """ if inProcessNameWOExeList is None: inProcessNameWOExeList = [] @@ -1936,19 +1940,18 @@ def ProcessListGet(inProcessNameWOExeList=None): def ProcessDefIntervalCall(inDef, inIntervalSecFloat, inIntervalAsyncBool=False, inDefArgList=None, inDefArgDict=None, inDefArgGSettingsNameStr=None, inDefArgLoggerNameStr=None, inExecuteInNewThreadBool=True, inLogger=None, inGSettings = None): """ - Use this procedure if you need to run periodically some def. Set def, args, interval and enjoy :) - + Периодический вызов функции Python. + + :param inDef: Функция Python, которую потребуется периодически вызывать + :param inIntervalSecFloat: Интервал между вызовами функции в сек. + :param inIntervalAsyncBool: False - ожидать интервал inIntervalSecFloat только после окончания выполнения предыдущей итерации; True - Ожидать интервал сразу после запуска итерации + :param inDefArgList: Список (list) неименованных аргументов для передачи в функцию. По умолчанию None + :param inDefArgDict: Словарь (dict) именованных аргументов для передачи в функцию. По умолчанию None + :param inDefArgGSettingsNameStr: Наименование аргумента глобального словаря настроек Оркестратора GSettings (опционально) + :param inDefArgLoggerNameStr: Наименование аргумента логгера Оркестратора (опционально) + :param inExecuteInNewThreadBool: True - периодический вызов выполнять в отдельном потоке (не останавливать выполнение текущего потока); False - Выполнение периодического вызова в текущем потоке, в котором была вызвана функция ProcessDefIntervalCall. По умолчанию: True + :param inLogger: Логгер для фиксации сообщений выполнения функции (опционально) :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) - :param inDef: def link, which will be called with interval inIntervalSecFloat - :param inIntervalSecFloat: Interval in seconds between call - :param inIntervalAsyncBool: False - wait interval before next call after the previous iteration result; True - wait interval after previous iteration call - :param inDefArgList: List of the args in def. Default None (empty list) - :param inDefArgDict: Dict of the args in def. Default None (empty dict) - :param inDefArgGSettingsNameStr: Name of the GSettings arg name for def (optional) - :param inDefArgLoggerNameStr: Name of the Logger arg name for def (optional). If Use - please check fill of the inLogger arg. - :param inExecuteInNewThreadBool: True - create new thread for the periodic execution; False - execute in current thread. Default: True - :param inLogger: logging def if some case is appear - :return: """ inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings if inLogger is None: inLogger = OrchestratorLoggerGet() @@ -2017,15 +2020,15 @@ def ProcessDefIntervalCall(inDef, inIntervalSecFloat, inIntervalAsyncBool=False, # Python def - start module function def PythonStart(inModulePathStr, inDefNameStr, inArgList=None, inArgDict=None, inLogger = None): """ - Import module and run def in the Orchestrator process. + Импорт модуля и выполнение функции в процессе Оркестратора. .. note:: - Import module will be each time when PythonStart def will be called. + Импорт модуля inModulePathStr будет происходить каждый раз в вызовом функции PythonStart. .. code-block:: python - # USAGE + # ПРИМЕР from pyOpenRPA import Orchestrator Orchestrator.PythonStart( @@ -2033,12 +2036,11 @@ def PythonStart(inModulePathStr, inDefNameStr, inArgList=None, inArgDict=None, i inDefNameStr="TestDef") # Import module in Orchestrator process and call def "TestDef" from module "ModuleToCall.py" - :param inModulePathStr: Absolute or relative (working directory of the orchestrator process) path to the importing module .py - :param inDefNameStr: Def name in module - :param inArgList: List of the arguments for callable def - :param inArgDict: Dict of the named arguments for callable def - :param inLogger: Logger instance to log some information when PythonStart def is running - :return: None + :param inModulePathStr: Абсолютный или относительный путь (относительно рабочей директории процесса Оркестратора), по которому расположен импортируемый .py файл + :param inDefNameStr: Наименование функции в модуле .py + :param inArgList: Список (list) неименованных аргументов для передачи в функцию. По умолчанию None + :param inArgDict: Словарь (dict) именованных аргументов для передачи в функцию. По умолчанию None + :param inLogger: Логгер для фиксации сообщений выполнения функции (опционально) """ if inLogger is None: inLogger = OrchestratorLoggerGet() if inArgList is None: inArgList=[] @@ -2053,17 +2055,16 @@ def PythonStart(inModulePathStr, inDefNameStr, inArgList=None, inArgDict=None, i # # # # # # # # # # # # # # # # # # # # # # # # Scheduler # # # # # # # # # # # # # # # # # # # # # # # - def SchedulerActivityTimeAddWeekly(inTimeHHMMStr="23:55:", inWeekdayList=None, inActivityList=None, inGSettings = None): """ - Add activity item list in scheduler. You can set weekday list and set time when launch. Activity list will be executed at planned time/day. + Добавить активность по расписанию. Допускается указание времени и дней недели, в которые производить запуск. .. code-block:: python - # USAGE + # ПРИМЕР from pyOpenRPA import Orchestrator - # EXAMPLE 1 + # ВАРИАНТ 1 def TestDef(inArg1Str): pass lActivityItem = Orchestrator.ProcessorActivityItemCreate( @@ -2080,10 +2081,9 @@ def SchedulerActivityTimeAddWeekly(inTimeHHMMStr="23:55:", inWeekdayList=None, i # Activity will be executed at 04:34 Wednesday (2), thursday (3), friday (4) :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) - :param inTimeHHMMStr: Activation time from "00:00" to "23:59". Example: "05:29" - :param inWeekdayList: Week day list to initiate activity list. Use int from 0 (monday) to 6 (sunday) as list items. Example: [0,1,2,3,4]. Default value is everyday ([0,1,2,3,4,5,6]) - :param inActivityList: Activity list structure - :return: None + :param inTimeHHMMStr: Время запуска активности. Допускаются значения от "00:00" до "23:59". Example: "05:29" + :param inWeekdayList: Список (list) дней недели, в которые выполнять запуск список активностей (ActivityItem list). 0 (понедельник) - 6 (воскресенье). Пример: [0,1,2,3,4]. По умолчанию устанавливается каждый день [0,1,2,3,4,5,6] + :param inActivityList: Список активностей (ActivityItem list) на исполнение """ inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings if inWeekdayList is None: inWeekdayList=[0,1,2,3,4,5,6] @@ -2104,11 +2104,11 @@ def SchedulerActivityTimeAddWeekly(inTimeHHMMStr="23:55:", inWeekdayList=None, i def RDPTemplateCreate(inLoginStr, inPasswordStr, inHostStr="127.0.0.1", inPortInt = 3389, inWidthPXInt = 1680, inHeightPXInt = 1050, inUseBothMonitorBool = False, inDepthBitInt = 32, inSharedDriveList=None, inRedirectClipboardBool=True): """ - Create RDP connect dict item/ Use it connect/reconnect (Orchestrator.RDPSessionConnect) + Создать шаблон подключения RDP (dict). Данный шаблон далее можно использовать в Orchestrator.RDPSessionConnect .. code-block:: python - # USAGE + # ПРИМЕР from pyOpenRPA import Orchestrator lRDPItemDict = Orchestrator.RDPTemplateCreate( @@ -2120,49 +2120,38 @@ def RDPTemplateCreate(inLoginStr, inPasswordStr, inHostStr="127.0.0.1", inPortIn inHeightPXInt = 1050, inUseBothMonitorBool = False, inDepthBitInt = 32, - inSharedDriveList=None) - # lRDPTemplateDict= { # Init the configuration item - # "Host": "127.0.0.1", "Port": "3389", "Login": "USER_99", "Password": "USER_PASS_HERE", - # "Screen": { "Width": 1680, "Height": 1050, "FlagUseAllMonitors": False, "DepthBit": "32" }, - # "SharedDriveList": ["c"], - # "RedirectClipboardBool": True, # True - share clipboard to RDP; False - else - # ###### Will updated in program ############ - # "SessionHex": "77777sdfsdf77777dsfdfsf77777777", # Hex is created when robot runs, example "" - # "SessionIsWindowExistBool": False, "SessionIsWindowResponsibleBool": False, "SessionIsIgnoredBool": False - # } - - :param inLoginStr: User/Robot Login, example "USER_99" - :param inPasswordStr: Password, example "USER_PASS_HERE" - :param inHostStr: Host address, example "77.77.22.22" - :param inPortInt: RDP Port, example "3389" (default) - :param inWidthPXInt: Width of the remote desktop in pixels, example 1680 - :param inHeightPXInt: Height of the remote desktop in pixels, example 1050 - :param inUseBothMonitorBool: True - connect to the RDP with both monitors. False - else case - :param inDepthBitInt: Remote desktop bitness. Available: 32 or 24 or 16 or 15, example 32 - :param inSharedDriveList: Host local disc to connect to the RDP session. Example: ["c", "d"] - :param inRedirectClipboardBool: # True - share clipboard to RDP; False - else + inSharedDriveList=None, + inRedirectClipboardBool=False) + + :param inLoginStr: Логин учетной записи, на которую будет происходить вход по RDP + :param inPasswordStr: Пароль учетной записи, на которую будет происходить вход по RDP. !ВНИМАНИЕ! Пароль нигде не сохраняется - конфиденциальность обеспечена + :param inHostStr: Имя хоста, к которому планируется подключение по RDP. Пример "77.77.22.22" + :param inPortInt: RDP порт, по которому будет происходить подключение. По умолчанию 3389 (стандартный порт RDP) + :param inWidthPXInt: Разрешение ширины RDP графической сессии в пикселях. По умолчанию 1680 + :param inHeightPXInt: Разрешение высоты RDP графической сессии в пикселях. По умолчанию 1050 + :param inUseBothMonitorBool: True - Использовать все подключенные мониторы на RDP сессии; False - Использовать только один монитор на подключенной RDP сессии + :param inDepthBitInt: Глубина цвета на удаленной RDP графической сессии. Допустимые варианты: 32 || 24 || 16 || 15. По умолчанию 32 + :param inSharedDriveList: Перечень общих дисков, доступ к которым предоставить на сторону удаленной RDP сессии. Пример: ["c", "d"] + :param inRedirectClipboardBool: True - Синхронизировать буфер обмена между сессией Оркестратора и удаленной RDP сессией; False - Не синхронизировать буфер обмена. По умолчанию True (в целях обратной совместимости). !ВНИМАНИЕ! Для учетных записей роботов мы рекомендуем не синхронизировать буфер обмена, так как это может привести к ошибкам роботов, которые работают с клавиатурой и буфером обмена :return: { - "Host": inHostStr, # Host address, example "77.77.22.22" - "Port": str(inPortInt), # RDP Port, example "3389" - "Login": inLoginStr, # Login, example "test" - "Password": inPasswordStr, # Password, example "test" + "Host": inHostStr, # Адрес хоста, пример "77.77.22.22" + "Port": str(inPortInt), # RDP порт, пример "3389" + "Login": inLoginStr, # Логин УЗ, пример "test" + "Password": inPasswordStr, # Пароль УЗ, пример "test" "Screen": { - "Width": inWidthPXInt, # Width of the remote desktop in pixels, example 1680 - "Height": inHeightPXInt, # Height of the remote desktop in pixels, example 1050 - # "640x480" or "1680x1050" or "FullScreen". If Resolution not exists set full screen, example - "FlagUseAllMonitors": inUseBothMonitorBool, # True or False, example False - "DepthBit": str(inDepthBitInt) # "32" or "24" or "16" or "15", example "32" + "Width": inWidthPXInt, # Разрешение ширины RDP графической сессии в пикселях. По умолчанию 1680 + "Height": inHeightPXInt, Разрешение высоты RDP графической сессии в пикселях. По умолчанию 1050 + "FlagUseAllMonitors": inUseBothMonitorBool, + "DepthBit": str(inDepthBitInt) }, - "SharedDriveList": inSharedDriveList, # List of the Root sesion hard drives, example ["c"] - "RedirectClipboardBool": True, # True - share clipboard to RDP; False - else - ###### Will updated in program ############ - "SessionHex": "77777sdfsdf77777dsfdfsf77777777", # Hex is created when robot runs, example "" + "SharedDriveList": inSharedDriveList, + "RedirectClipboardBool": True, + ###### PROGRAM VARIABLE ############ + "SessionHex": "77777sdfsdf77777dsfdfsf77777777", "SessionIsWindowExistBool": False, - # Flag if the RDP window is exist, old name "FlagSessionIsActive". Check every n seconds , example False "SessionIsWindowResponsibleBool": False, - # Flag if RDP window is responsible (recieve commands). Check every nn seconds. If window is Responsible - window is Exist too , example False - "SessionIsIgnoredBool": False # Flag to ignore RDP window False - dont ignore, True - ignore, example False + "SessionIsIgnoredBool": False } """ @@ -2196,27 +2185,22 @@ def RDPTemplateCreate(inLoginStr, inPasswordStr, inHostStr="127.0.0.1", inPortIn # TODO Search dublicates in GSettings RDPlist ! # Return list if dublicates def RDPSessionDublicatesResolve(inGSettings): - """ - DEVELOPING Search duplicates in GSettings RDPlist - !def is developing! - - :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) - :return: - """ pass #for lItemKeyStr in inGSettings["RobotRDPActive"]["RDPList"]: # lItemDict = inGSettings["RobotRDPActive"]["RDPList"][lItemKeyStr] def RDPSessionConnect(inRDPSessionKeyStr, inRDPTemplateDict=None, inHostStr=None, inPortStr=None, inLoginStr=None, inPasswordStr=None, inGSettings = None, inRedirectClipboardBool=True): """ - Create new RDPSession in RobotRDPActive. Attention - activity will be ignored if RDP key is already exists - 2 way of the use - Var 1 (Main stream): inGSettings, inRDPSessionKeyStr, inRDPTemplateDict - Var 2 (Backward compatibility): inGSettings, inRDPSessionKeyStr, inHostStr, inPortStr, inLoginStr, inPasswordStr + Выполнить подключение к RDP и следить за стабильностью соединения со стороны Оркестратора. + !ВНИМАНИЕ! - Подключение будет проигнорировано, если соединение по таком RDP ключу уже было инициализировано ранее. + + 2 способа использования функции: + ВАРИАНТ 1 (ОСНОВНОЙ): inGSettings, inRDPSessionKeyStr, inRDPTemplateDict. Для получения inRDPTemplateDict см. функцию Orchestrator.RDPTemplateCreate + ВАРИАНТ 2 (ОБРАТНАЯ СОВМЕСТИМОСТЬ ДО ВЕРСИИ 1.1.20): inGSettings, inRDPSessionKeyStr, inHostStr, inPortStr, inLoginStr, inPasswordStr .. code-block:: python - # USAGE + # ПРИМЕР (ВАРИАНТ 1) from pyOpenRPA import Orchestrator lRDPItemDict = Orchestrator.RDPTemplateCreate( @@ -2228,15 +2212,15 @@ def RDPSessionConnect(inRDPSessionKeyStr, inRDPTemplateDict=None, inHostStr=None inRDPSessionKeyStr = "RDPKey", inRDPTemplateDict = lRDPItemDict) # Orchestrator will create RDP session by the lRDPItemDict configuration - + + :param inRDPSessionKeyStr: Ключ RDP сессии - необходим для дальнейшей идентификации + :param inRDPTemplateDict: Конфигурационный словарь (dict) RDP подключения (см. функцию Orchestrator.RDPTemplateCreate) + :param inLoginStr: Логин учетной записи, на которую будет происходить вход по RDP. Обратная совместимость до версии v 1.1.20. Мы рекомендуем использовать inRDPTemplateDict (см. функцию Orchestrator.RDPTemplateCreate) + :param inPasswordStr: Пароль учетной записи, на которую будет происходить вход по RDP. !ВНИМАНИЕ! Пароль нигде не сохраняется - конфиденциальность обеспечена. Обратная совместимость до версии v 1.1.20. Мы рекомендуем использовать inRDPTemplateDict (см. функцию Orchestrator.RDPTemplateCreate) + :param inHostStr: Имя хоста, к которому планируется подключение по RDP. Пример "77.77.22.22". Обратная совместимость до версии v 1.1.20. Мы рекомендуем использовать inRDPTemplateDict (см. функцию Orchestrator.RDPTemplateCreate) + :param inPortInt: RDP порт, по которому будет происходить подключение. По умолчанию 3389 (стандартный порт RDP). Обратная совместимость до версии v 1.1.20. Мы рекомендуем использовать inRDPTemplateDict (см. функцию Orchestrator.RDPTemplateCreate) :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) - :param inRDPSessionKeyStr: RDP Session string key - need for the further identification - :param inRDPTemplateDict: RDP configuration dict with settings (see def Orchestrator.RDPTemplateCreate) - :param inHostStr: Backward compatibility from Orchestrator v 1.1.20. Use inRDPTemplateDict - :param inPortStr: Backward compatibility from Orchestrator v 1.1.20. Use inRDPTemplateDict - :param inLoginStr: Backward compatibility from Orchestrator v 1.1.20. Use inRDPTemplateDict - :param inPasswordStr: Backward compatibility from Orchestrator v 1.1.20. Use inRDPTemplateDict - :return: True every time :) + :param inRedirectClipboardBool: True - Синхронизировать буфер обмена между сессией Оркестратора и удаленной RDP сессией; False - Не синхронизировать буфер обмена. По умолчанию True (в целях обратной совместимости). !ВНИМАНИЕ! Для учетных записей роботов мы рекомендуем не синхронизировать буфер обмена, так как это может привести к ошибкам роботов, которые работают с клавиатурой и буфером обмена """ inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings # Check thread @@ -2269,11 +2253,11 @@ def RDPSessionConnect(inRDPSessionKeyStr, inRDPTemplateDict=None, inHostStr=None def RDPSessionDisconnect(inRDPSessionKeyStr, inBreakTriggerProcessWOExeList = None, inGSettings = None): """ - Disconnect the RDP session and stop monitoring it. + Выполнить отключение RDP сессии и прекратить мониторить его активность. .. code-block:: python - # USAGE + # ПРИМЕР from pyOpenRPA import Orchestrator Orchestrator.RDPSessionDisconnect( @@ -2281,14 +2265,9 @@ def RDPSessionDisconnect(inRDPSessionKeyStr, inBreakTriggerProcessWOExeList = No inRDPSessionKeyStr = "RDPKey") # Orchestrator will disconnect RDP session and will stop to monitoring current RDP + :param inRDPSessionKeyStr: Ключ RDP сессии - необходим для дальнейшей идентификации + :param inBreakTriggerProcessWOExeList: Список процессов, наличие которых в диспетчере задач приведет к прерыванию задачи по остановке RDP соединения. Пример ["notepad"] :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) - :param inRDPSessionKeyStr: RDP Session string key - need for the further identification - :param inBreakTriggerProcessWOExeList: List of the processes, which will stop the execution. Example ["notepad"] - - .. note:: - - Orchestrator look processes on the current machine - :return: True every time """ inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings if inBreakTriggerProcessWOExeList is None: inBreakTriggerProcessWOExeList = [] @@ -2317,11 +2296,11 @@ def RDPSessionDisconnect(inRDPSessionKeyStr, inBreakTriggerProcessWOExeList = No def RDPSessionReconnect(inRDPSessionKeyStr, inRDPTemplateDict=None, inGSettings = None): """ - Reconnect the RDP session + Выполнить переподключение RDP сессии и продолжить мониторить его активность. .. code-block:: python - # USAGE + # ПРИМЕР from pyOpenRPA import Orchestrator lRDPItemDict = Orchestrator.RDPTemplateCreate( @@ -2334,10 +2313,9 @@ def RDPSessionReconnect(inRDPSessionKeyStr, inRDPTemplateDict=None, inGSettings inRDPTemplateDict = inRDPTemplateDict) # Orchestrator will reconnect RDP session and will continue to monitoring current RDP + :param inRDPSessionKeyStr: Ключ RDP сессии - необходим для дальнейшей идентификации + :param inRDPTemplateDict: Конфигурационный словарь (dict) RDP подключения (см. функцию Orchestrator.RDPTemplateCreate) :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) - :param inRDPSessionKeyStr: RDP Session string key - need for the further identification - :param inRDPTemplateDict: RDP configuration dict with settings (see def Orchestrator.RDPTemplateCreate) - :return: """ inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings # Check thread @@ -2364,11 +2342,11 @@ def RDPSessionReconnect(inRDPSessionKeyStr, inRDPTemplateDict=None, inGSettings def RDPSessionMonitorStop(inRDPSessionKeyStr, inGSettings = None): """ - Stop monitoring the RDP session by the Orchestrator process. Current def don't kill RDP session - only stop to track it (it can give ) - + Прекратить мониторить активность RDP соединения со стороны Оркестратора. Данная функция не уничтожает активное RDP соединение. + .. code-block:: python - # USAGE + # ПРИМЕР from pyOpenRPA import Orchestrator Orchestrator.RDPSessionMonitorStop( @@ -2376,9 +2354,8 @@ def RDPSessionMonitorStop(inRDPSessionKeyStr, inGSettings = None): inRDPSessionKeyStr = "RDPKey") # Orchestrator will stop the RDP monitoring + :param inRDPSessionKeyStr: Ключ RDP сессии - необходим для дальнейшей идентификации :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) - :param inRDPSessionKeyStr: RDP Session string key - need for the further identification - :return: True every time :> """ inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings lResult = True @@ -2387,11 +2364,11 @@ def RDPSessionMonitorStop(inRDPSessionKeyStr, inGSettings = None): def RDPSessionLogoff(inRDPSessionKeyStr, inBreakTriggerProcessWOExeList = None, inGSettings = None): """ - Logoff the RDP session from the Orchestrator process (close all apps in session when logoff) + Выполнить отключение (logoff) на RDP сессии и прекратить мониторить активность со стороны Оркестратора. .. code-block:: python - # USAGE + # ПРИМЕР from pyOpenRPA import Orchestrator Orchestrator.RDPSessionLogoff( @@ -2400,10 +2377,11 @@ def RDPSessionLogoff(inRDPSessionKeyStr, inBreakTriggerProcessWOExeList = None, inBreakTriggerProcessWOExeList = ['Notepad']) # Orchestrator will logoff the RDP session + + :param inRDPSessionKeyStr: Ключ RDP сессии - необходим для дальнейшей идентификации + :param inBreakTriggerProcessWOExeList: Список процессов, наличие которых в диспетчере задач приведет к прерыванию задачи по остановке RDP соединения. Пример ["notepad"] :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) - :param inRDPSessionKeyStr: RDP Session string key - need for the further identification - :param inBreakTriggerProcessWOExeList: List of the processes, which will stop the execution. Example ["notepad"] - :return: True - logoff is successful + :return: True - Отключение прошло успешно; False - были зафиксированы ошибки при отключении. """ inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings if inBreakTriggerProcessWOExeList is None: inBreakTriggerProcessWOExeList = [] @@ -2434,13 +2412,6 @@ def RDPSessionLogoff(inRDPSessionKeyStr, inBreakTriggerProcessWOExeList = None, return lResult def RDPSessionResponsibilityCheck(inRDPSessionKeyStr, inGSettings = None): - """ - DEVELOPING, MAYBE NOT USEFUL Check RDP Session responsibility TODO NEED DEV + TEST - - :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) - :param inRDPSessionKeyStr: RDP Session string key - need for the further identification - :return: True every time - """ inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings # Check thread if not Core.IsProcessorThread(inGSettings=inGSettings): @@ -2479,11 +2450,13 @@ def RDPSessionResponsibilityCheck(inRDPSessionKeyStr, inGSettings = None): def RDPSessionProcessStartIfNotRunning(inRDPSessionKeyStr, inProcessNameWEXEStr, inFilePathStr, inFlagGetAbsPathBool=True, inGSettings = None): """ - Start process in RDP if it is not running (check by the arg inProcessNameWEXEStr) + Выполнить запуск процесса на RDP сессии через графические UI инструменты (без Агента). + + !ВНИМАНИЕ! Данная функция может работать нестабильно из-за использования графических элементов UI при работе с RDP. Мы рекомендуем использовать конструкцию взаимодействия Оркестратора с Агентом. .. code-block:: python - # USAGE + # ПРИМЕР from pyOpenRPA import Orchestrator Orchestrator.RDPSessionProcessStartIfNotRunning( @@ -2494,12 +2467,11 @@ def RDPSessionProcessStartIfNotRunning(inRDPSessionKeyStr, inProcessNameWEXEStr, inFlagGetAbsPathBool = True) # Orchestrator will start the process in RDP session + :param inRDPSessionKeyStr: Ключ RDP сессии - необходим для дальнейшей идентификации + :param inProcessNameWEXEStr: Наименование процесса с расширением .exe (WEXE - WITH EXE - С EXE). Параметр позволяет не допустить повторного запуска процесса, если он уже был запущен. Example: "Notepad.exe" + :param inFilePathStr: Путь к файлу запуска процесса на стороне RDP сессии + :param inFlagGetAbsPathBool: True - Преобразовать относительный путь inFilePathStr в абсолютный с учетом рабочей директории Оркестратора; False - Не выполнять преобразований :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) - :param inRDPSessionKeyStr: RDP Session string key - need for the further identification - :param inProcessNameWEXEStr: Process name with extension (.exe). This arg allow to check the process is running. Example: "Notepad.exe" - :param inFilePathStr: Path to run process if it is not running. - :param inFlagGetAbsPathBool: True - get abs path from the relative path in inFilePathStr. False - else case - :return: True every time :) """ inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings # Check thread @@ -2526,11 +2498,13 @@ def RDPSessionProcessStartIfNotRunning(inRDPSessionKeyStr, inProcessNameWEXEStr, def RDPSessionCMDRun(inRDPSessionKeyStr, inCMDStr, inModeStr="CROSSCHECK", inGSettings = None): """ - Send CMD command to the RDP session "RUN" window + Отправить CMD команду на удаленную сесиию через RDP окно (без Агента). + + !ВНИМАНИЕ! Данная функция может работать нестабильно из-за использования графических элементов UI при работе с RDP. Мы рекомендуем использовать конструкцию взаимодействия Оркестратора с Агентом. .. code-block:: python - # USAGE + # ПРИМЕР from pyOpenRPA import Orchestrator lResultDict = Orchestrator.RDPSessionCMDRun( @@ -2538,18 +2512,18 @@ def RDPSessionCMDRun(inRDPSessionKeyStr, inCMDStr, inModeStr="CROSSCHECK", inGSe inRDPSessionKeyStr = "RDPKey", inModeStr = 'LISTEN') # Orchestrator will send CMD to RDP and return the result (see return section) - + + :param inRDPSessionKeyStr: Ключ RDP сессии - необходим для дальнейшей идентификации + :param inCMDStr: Команда CMD, которую отправить на удаленную сессию + :param inModeStr: По умолчанию "CROSSCHECK". Варианты: + "LISTEN" - Получить результат выполнения операции. Внимание! необходим общий буфер обмена с сессией Оркестратора! + "CROSSCHECK" - Выполнить проверку, что операция была выполнена (без получения результата отработки CMD команды). Внимание! необходим общий буфер обмена с сессией Оркестратора! + "RUN" - Не получать результат и не выполнять проверку :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) - :param inRDPSessionKeyStr: RDP Session string key - need for the further identification - :param inCMDStr: Any CMD string - :param inModeStr: Variants: - "LISTEN" - Get result of the cmd command in result; - "CROSSCHECK" - Check if the command was successfully sent - "RUN" - Run without crosscheck and get clipboard - :return: # OLD > True - CMD was executed successfully + :return: Результат выполнения операции в соответсвии с параметрами инициализации функции. Выходная структура: { - "OutStr": <> # Result string - "IsResponsibleBool": True|False # Flag is RDP is responsible - works only when inModeStr = CROSSCHECK + "OutStr": <> # Результат выполнения CMD (если inModeStr = "LISTEN") + "IsResponsibleBool": True|False # True - RDP приняло команду; False - обратная связь не была получена (если inModeStr = "CROSSCHECK") } """ inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings @@ -2580,11 +2554,13 @@ def RDPSessionCMDRun(inRDPSessionKeyStr, inCMDStr, inModeStr="CROSSCHECK", inGSe def RDPSessionProcessStop(inRDPSessionKeyStr, inProcessNameWEXEStr, inFlagForceCloseBool, inGSettings = None): """ - Send CMD command to the RDP session "RUN" window. + Отправка CMD команды в RDP окне на остановку процесса (без Агента). + + !ВНИМАНИЕ! Данная функция может работать нестабильно из-за использования графических элементов UI при работе с RDP. Мы рекомендуем использовать конструкцию взаимодействия Оркестратора с Агентом. .. code-block:: python - # USAGE + # ПРИМЕР from pyOpenRPA import Orchestrator lResultDict = Orchestrator.RDPSessionProcessStop( @@ -2594,11 +2570,11 @@ def RDPSessionProcessStop(inRDPSessionKeyStr, inProcessNameWEXEStr, inFlagForceC inFlagForceCloseBool = True) # Orchestrator will send CMD to RDP and return the result (see return section) + + :param inRDPSessionKeyStr: Ключ RDP сессии - необходим для дальнейшей идентификации + :param inProcessNameWEXEStr: Наименование процесса, который требуется выключить с расширением .exe (WEXE - WITH EXE - С EXE). Пример: "Notepad.exe" + :param inFlagForceCloseBool: True - Принудительное отключение. False - Отправка сигнала на безопасное отключение (если процесс поддерживает) :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) - :param inRDPSessionKeyStr: RDP Session string key - need for the further identification - :param inProcessNameWEXEStr: Process name to kill. Example: 'notepad.exe' - :param inFlagForceCloseBool: True - force close the process. False - safe close the process - :return: True every time """ inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings # Check thread @@ -2626,11 +2602,15 @@ def RDPSessionProcessStop(inRDPSessionKeyStr, inProcessNameWEXEStr, inFlagForceC def RDPSessionFileStoredSend(inRDPSessionKeyStr, inHostFilePathStr, inRDPFilePathStr, inGSettings = None): """ - Send file from Orchestrator session to the RDP session using shared drive in RDP (see RDP Configuration Dict, Shared drive) + Отправка файла со стороны Оркестратора на сторону RDP сессии через UI инструменты RDP окна (без Агента). + + !ВНИМАНИЕ! Данная функция может работать нестабильно из-за использования графических элементов UI при работе с RDP. Мы рекомендуем использовать конструкцию взаимодействия Оркестратора с Агентом. + + !ВНИМАНИЕ! Для работы функции требуется открыть доступ по RDP к тем дискам, с которых будет производится копирование файла. .. code-block:: python - # USAGE + # ПРИМЕР from pyOpenRPA import Orchestrator lResultDict = Orchestrator.RDPSessionFileStoredSend( @@ -2640,11 +2620,10 @@ def RDPSessionFileStoredSend(inRDPSessionKeyStr, inHostFilePathStr, inRDPFilePat inRDPFilePathStr = "C:\\RPA\\TESTDIR\\Test.py") # Orchestrator will send CMD to RDP and return the result (see return section) + :param inRDPSessionKeyStr: Ключ RDP сессии - необходим для дальнейшей идентификации + :param inHostFilePathStr: Откуда взять файл. Относительный или абсолютный путь к файлу на стороне Оркестратора. Пример: "TESTDIR\\Test.py" + :param inRDPFilePathStr: Куда скопировать файл. !Абсолютный! путь на стороне RDP сессии. Пример: "C:\\RPA\\TESTDIR\\Test.py" :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) - :param inRDPSessionKeyStr: RDP Session string key - need for the further identification - :param inHostFilePathStr: Relative or absolute path to the file location on the Orchestrator side. Example: "TESTDIR\\Test.py" - :param inRDPFilePathStr: !Absolute! path to the destination file location on the RDP side. Example: "C:\\RPA\\TESTDIR\\Test.py" - :return: True every time """ inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings # Check thread @@ -2671,11 +2650,15 @@ def RDPSessionFileStoredSend(inRDPSessionKeyStr, inHostFilePathStr, inRDPFilePat def RDPSessionFileStoredRecieve(inRDPSessionKeyStr, inRDPFilePathStr, inHostFilePathStr, inGSettings = None): """ - Recieve file from RDP session to the Orchestrator session using shared drive in RDP (see RDP Configuration Dict, Shared drive) + Получение файла со стороны RDP сессии на сторону Оркестратора через UI инструменты RDP окна (без Агента). + + !ВНИМАНИЕ! Данная функция может работать нестабильно из-за использования графических элементов UI при работе с RDP. Мы рекомендуем использовать конструкцию взаимодействия Оркестратора с Агентом. + + !ВНИМАНИЕ! Для работы функции требуется открыть доступ по RDP к тем дискам, с которых будет производится копирование файла. .. code-block:: python - # USAGE + # ПРИМЕР from pyOpenRPA import Orchestrator lResultDict = Orchestrator.RDPSessionFileStoredRecieve( @@ -2685,11 +2668,10 @@ def RDPSessionFileStoredRecieve(inRDPSessionKeyStr, inRDPFilePathStr, inHostFile inRDPFilePathStr = "C:\\RPA\\TESTDIR\\Test.py") # Orchestrator will send CMD to RDP and return the result (see return section) + :param inRDPSessionKeyStr: Ключ RDP сессии - необходим для дальнейшей идентификации + :param inRDPFilePathStr: Откуда скопировать файл. !Абсолютный! путь на стороне RDP сессии. Пример: "C:\\RPA\\TESTDIR\\Test.py" + :param inHostFilePathStr: Куда скопировать файл. Относительный или абсолютный путь к файлу на стороне Оркестратора. Пример: "TESTDIR\\Test.py" :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) - :param inRDPSessionKeyStr: RDP Session string key - need for the further identification - :param inRDPFilePathStr: !Absolute! path to the destination file location on the RDP side. Example: "C:\\RPA\\TESTDIR\\Test.py" - :param inHostFilePathStr: Relative or absolute path to the file location on the Orchestrator side. Example: "TESTDIR\\Test.py" - :return: True every time """ inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings # Check thread @@ -2717,13 +2699,8 @@ def RDPSessionFileStoredRecieve(inRDPSessionKeyStr, inRDPFilePathStr, inHostFile # # # # # Start orchestrator # # # # # # # # # # # # # # # # # # # # # # # +#HIDDEN Interval gSettings auto cleaner def to clear some garbage. def GSettingsAutocleaner(inGSettings=None): - """ - HIDDEN Interval gSettings auto cleaner def to clear some garbage. - - :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) - :return: None - """ inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings while True: time.sleep(inGSettings["Autocleaner"]["IntervalSecFloat"]) # Wait for the next iteration @@ -2752,23 +2729,15 @@ def GSettingsAutocleaner(inGSettings=None): from .. import __version__ # Get version from the package def Start(inDumpRestoreBool = True, inRunAsAdministratorBool = True): - """ - Start the orchestrator threads execution - - :param inDumpRestoreBool: True - restore data from the dumo - :param inRunAsAdministratorBool: True - rerun as admin if not - :return: - """ Orchestrator(inDumpRestoreBool = True, inRunAsAdministratorBool = True) def Orchestrator(inGSettings=None, inDumpRestoreBool = True, inRunAsAdministratorBool = True): """ - Main def to start orchestrator + Инициализация ядра Оркестратора (всех потоков) :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) - :param inDumpRestoreBool: - :param inRunAsAdministratorBool: - :return: + :param inDumpRestoreBool: True - Восстановить информацию о RDP сессиях и StorageDict; False - не восстанавливать + :param inRunAsAdministratorBool: True - Проверить права администратратора и обеспечить их; False - Не обеспечивать права администратора """ lL = inGSettings["Logger"] # https://stackoverflow.com/questions/130763/request-uac-elevation-from-within-a-python-script @@ -2853,8 +2822,6 @@ def Orchestrator(inGSettings=None, inDumpRestoreBool = True, inRunAsAdministrato lRobotRDPActiveThread.start() # Start the thread execution. if lL: lL.info("Robot RDP active has been started") #Logging - - # Init autocleaner in another thread lAutocleanerThread = threading.Thread(target= GSettingsAutocleaner, kwargs={"inGSettings":gSettingsDict}) lAutocleanerThread.daemon = True # Run the thread in daemon mode.