orc + agent: L+,W+ support, translate

dev-linux
robo-bo 2 years ago
parent 9efbcd78a5
commit b68d1afe2d

@ -1,3 +1,4 @@
from curses.ascii import CR
import threading, socket, getpass, sys, uuid, subprocess, base64, psutil, getpass, time import threading, socket, getpass, sys, uuid, subprocess, base64, psutil, getpass, time
from . import O2A, A2O # Data flow Orchestrator To Agent from . import O2A, A2O # Data flow Orchestrator To Agent
from . import Processor # Processor Queue from . import Processor # Processor Queue
@ -13,10 +14,10 @@ gSettings = None
# Create binary file by the base64 string (safe for JSON transmition) # Create binary file by the base64 string (safe for JSON transmition)
def OSFileBinaryDataBase64StrCreate(inFilePathStr, inFileDataBase64Str,inGSettings = None): def OSFileBinaryDataBase64StrCreate(inFilePathStr, inFileDataBase64Str,inGSettings = None):
""" """L+,W+: Создать бинарный файл на стороне Агента по полученной строке в формате base64 (формат безопасен для передачи по JSON протоколу)
Create binary file by the base64 string (safe for JSON transmition)
""" """
inFilePathStr = CrossOS.PathStr(inPathStr=inFilePathStr)
lFile = open(inFilePathStr, "wb") lFile = open(inFilePathStr, "wb")
lFile.write(base64.b64decode(inFileDataBase64Str)) lFile.write(base64.b64decode(inFileDataBase64Str))
lFile.close() lFile.close()
@ -27,10 +28,10 @@ def OSFileBinaryDataBase64StrCreate(inFilePathStr, inFileDataBase64Str,inGSettin
# Append binary file by the base64 string (safe for JSON transmition) # Append binary file by the base64 string (safe for JSON transmition)
def OSFileBinaryDataBase64StrAppend(inFilePathStr, inFileDataBase64Str,inGSettings = None): def OSFileBinaryDataBase64StrAppend(inFilePathStr, inFileDataBase64Str,inGSettings = None):
""" """L+,W+: Create binary file by the base64 string (safe for JSON transmition)
Create binary file by the base64 string (safe for JSON transmition)
""" """
inFilePathStr = CrossOS.PathStr(inPathStr=inFilePathStr)
lFile = open(inFilePathStr, "ab") lFile = open(inFilePathStr, "ab")
lFile.write(base64.b64decode(inFileDataBase64Str)) lFile.write(base64.b64decode(inFileDataBase64Str))
lFile.close() lFile.close()
@ -41,15 +42,15 @@ def OSFileBinaryDataBase64StrAppend(inFilePathStr, inFileDataBase64Str,inGSettin
# Create text file by the string # Create text file by the string
def OSFileTextDataStrCreate(inFilePathStr, inFileDataStr, inEncodingStr = "utf-8",inGSettings = None): def OSFileTextDataStrCreate(inFilePathStr, inFileDataStr, inEncodingStr = "utf-8",inGSettings = None):
""" """L+,W+:Создать текстовый файл на стороне Агента
Create text file in the agent GUI session
:param inFilePathStr: File abs path :param inFilePathStr: Абсолютный путь к создаваемому файлу
:param inFileDataStr: File data text content :param inFileDataStr: Текст, отправляемый в создаваемый файл
:param inEncodingStr: Write file encoding :param inEncodingStr: Кодировка создаваемого файла. По-умолчанию 'utf-8'
:param inGSettings: global settings of the Agent (singleton) :param inGSettings: Глобальный файл настроек
:return: :return:
""" """
inFilePathStr = CrossOS.PathStr(inPathStr=inFilePathStr)
lFile = open(inFilePathStr, "w", encoding=inEncodingStr) lFile = open(inFilePathStr, "w", encoding=inEncodingStr)
lFile.write(inFileDataStr) lFile.write(inFileDataStr)
lFile.close() lFile.close()
@ -59,13 +60,13 @@ def OSFileTextDataStrCreate(inFilePathStr, inFileDataStr, inEncodingStr = "utf-8
A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr]) A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr])
def OSFileBinaryDataBase64StrReceive(inFilePathStr, inGSettings=None): def OSFileBinaryDataBase64StrReceive(inFilePathStr, inGSettings=None):
""" """L+,W+: Прочитать бинарный файл на стороне агента и отправить на сторону оркестратора в формате base64 (формат безопасный для передачи в формате JSON)
Read binary file and encode in base64 to transmit (safe for JSON transmition)
:param inFilePathStr: File path to read :param inFilePathStr: Абсолютный путь к читаемому файлу
:param inGSettings: global settings of the Agent (singleton) :param inGSettings: Глобальный словарь настроек Агента (необязательный)
:return: File content in string base64 format (use base64.b64decode to decode data). Return None if file is not exist :return: Содержимое бинарного файле, преобразованное в формат base64 (используй base64.b64decode для декодирования в байты). Вернет None запрашиваемый файл не существует
""" """
inFilePathStr = CrossOS.PathStr(inPathStr=inFilePathStr)
lL = inGSettings.get("Logger", None) if type(inGSettings) is dict else None lL = inGSettings.get("Logger", None) if type(inGSettings) is dict else None
lFileDataBase64Str = None lFileDataBase64Str = None
if os.path.exists(inFilePathStr): if os.path.exists(inFilePathStr):
@ -73,39 +74,39 @@ def OSFileBinaryDataBase64StrReceive(inFilePathStr, inGSettings=None):
lFileDataBytes = lFile.read() lFileDataBytes = lFile.read()
lFile.close() lFile.close()
lFileDataBase64Str = base64.b64encode(lFileDataBytes).decode("utf-8") lFileDataBase64Str = base64.b64encode(lFileDataBytes).decode("utf-8")
lMessageStr = f"OSFileBinaryDataBase64StrReceive: file {inFilePathStr} has been read" lMessageStr = f"Функция OSFileBinaryDataBase64StrReceive: файл {inFilePathStr} прочитан успешно"
if lL: lL.debug(lMessageStr) if lL: lL.debug(lMessageStr)
#A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr]) #A2O.LogListSend(inGSettings=inGSettings, inLogList=[lMessageStr])
else: else:
if lL: lL.debug(f"OSFileBinaryDataBase64StrReceive: file {inFilePathStr} is not exists - return None") if lL: lL.debug(f"Функция OSFileBinaryDataBase64StrReceive: файл {inFilePathStr} не существует - отправить None")
return lFileDataBase64Str return lFileDataBase64Str
def OSFileMTimeGet(inFilePathStr: str) -> float or None: def OSFileMTimeGet(inFilePathStr: str) -> float or None:
""" """L+,W+: Read file modification time timestamp format (float)
Read file modification time timestamp format (float)
:param inFilePathStr: File path to read :param inFilePathStr: Абсолютный путь к файлу, дату которого требуется получить
:return: timestamp (float) Return None if file is not exist :return: Временной слепок (timestamp) в формате float. Вернет None, если запрашиваемый файл не существует
""" """
inFilePathStr = CrossOS.PathStr(inPathStr=inFilePathStr)
global gSettings global gSettings
lL = gSettings.get("Logger", None) if type(gSettings) is dict else None lL = gSettings.get("Logger", None) if type(gSettings) is dict else None
lFileMTimeFloat = None lFileMTimeFloat = None
if os.path.exists(inFilePathStr): if os.path.exists(inFilePathStr):
lFileMTimeFloat = os.path.getmtime(inFilePathStr) lFileMTimeFloat = os.path.getmtime(inFilePathStr)
if lL: lL.debug(f"OSFileMTimeGet: file {inFilePathStr} has been read") if lL: lL.debug(f"Функция OSFileMTimeGet: файл {inFilePathStr} прочитан успешно")
else: else:
if lL: lL.debug(f"OSFileMTimeGet: file {inFilePathStr} is not exists - return None") if lL: lL.debug(f"Функция OSFileMTimeGet: file {inFilePathStr} не существует - вернуть None")
return lFileMTimeFloat return lFileMTimeFloat
def OSFileTextDataStrReceive(inFilePathStr, inEncodingStr="utf-8", inGSettings=None): def OSFileTextDataStrReceive(inFilePathStr, inEncodingStr="utf-8", inGSettings=None):
""" """L+,W+: Прочитать текстовый файл на стороне агента и отправить на сторону оркестратора
Read text file in the agent GUI session
:param inFilePathStr: File abs path :param inFilePathStr: Абсолютный путь к читаемому файлу
:param inEncodingStr: Read file encoding. Default utf-8 :param inEncodingStr: Кодировка создаваемого файла. По-умолчанию 'utf-8'
:param inGSettings: global settings of the Agent (singleton) :param inGSettings: Глобальный словарь настроек
:return: File text content in string format (use base64.b64decode to decode data). Return None if file is not exist :return: Строка - содержимое текстового файла. Возвращает None, если файл не существует
""" """
inFilePathStr = CrossOS.PathStr(inPathStr=inFilePathStr)
lFileDataStr = None lFileDataStr = None
lL = inGSettings.get("Logger", None) if type(inGSettings) is dict else None lL = inGSettings.get("Logger", None) if type(inGSettings) is dict else None
if os.path.exists(inFilePathStr): if os.path.exists(inFilePathStr):
@ -121,8 +122,7 @@ def OSFileTextDataStrReceive(inFilePathStr, inEncodingStr="utf-8", inGSettings=N
# Send CMD to OS. Result return to log + Orchestrator by the A2O connection # Send CMD to OS. Result return to log + Orchestrator by the A2O connection
def OSCMD(inCMDStr, inRunAsyncBool=True, inGSettings = None, inSendOutputToOrchestratorLogsBool = True, inCMDEncodingStr = "cp1251", inCaptureBool = True): def OSCMD(inCMDStr, inRunAsyncBool=True, inGSettings = None, inSendOutputToOrchestratorLogsBool = True, inCMDEncodingStr = "cp1251", inCaptureBool = True):
""" """L-,W+: Execute CMD on the Agent daemonic process
Execute CMD on the Agent daemonic process
:param inCMDStr: command to execute on the Agent session :param inCMDStr: command to execute on the Agent session
:param inRunAsyncBool: True - Agent processor don't wait execution; False - Agent processor wait cmd execution :param inRunAsyncBool: True - Agent processor don't wait execution; False - Agent processor wait cmd execution
@ -197,11 +197,9 @@ def OSCMD(inCMDStr, inRunAsyncBool=True, inGSettings = None, inSendOutputToOrche
def ProcessWOExeUpperUserListGet(): def ProcessWOExeUpperUserListGet():
""" """L-,W+: Вернуть список процессов, запущенных под пользователем на стороне агента
Return the process list only for the current user (where Agent is running) without .EXE in upper case. Can use in ActivityItem from Orchestrator to Agent
:param inProcessNameWOExeList: :return: Список процессов в формате: ["NOTEPAD","..."] (без постфикса .exe и в верхнем регистре)
:return: list of the agent user process in upper case without .EXE. Example ["NOTEPAD","..."],
""" """
lUserNameStr = getpass.getuser() lUserNameStr = getpass.getuser()
@ -253,4 +251,4 @@ def Agent(inGSettings):
# Send log that Agent has been started # Send log that Agent has been started
A2O.LogListSend(inGSettings=inGSettings, inLogList=[f'Host: {inGSettings["AgentDict"]["HostNameUpperStr"]}, User: {inGSettings["AgentDict"]["UserUpperStr"]}, Agent has been started.']) A2O.LogListSend(inGSettings=inGSettings, inLogList=[f'Хост: {inGSettings["AgentDict"]["HostNameUpperStr"]}, Логин: {inGSettings["AgentDict"]["UserUpperStr"]}, Агент инициализирован успешно'])

@ -1,3 +1,4 @@
from re import I
import subprocess, json, psutil, time, os import subprocess, json, psutil, time, os
from pyOpenRPA.Tools import CrossOS from pyOpenRPA.Tools import CrossOS
if CrossOS.IS_WINDOWS_BOOL: import win32security #CrossOS if CrossOS.IS_WINDOWS_BOOL: import win32security #CrossOS
@ -46,8 +47,7 @@ gSettingsDict = None
# AGENT DEFS # AGENT DEFS
def AgentActivityItemAdd(inHostNameStr, inUserStr, inActivityItemDict, inGSettings=None): def AgentActivityItemAdd(inHostNameStr, inUserStr, inActivityItemDict, inGSettings=None):
""" """L+,W+: Добавить активность в словарь активностей выбранного Агента
Добавить активность в словарь активностей выбранного Агента
:param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон)
:param inHostNameStr: Наименование хоста, на котором запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления :param inHostNameStr: Наименование хоста, на котором запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления
@ -77,8 +77,7 @@ def AgentActivityItemAdd(inHostNameStr, inUserStr, inActivityItemDict, inGSettin
def AgentActivityItemExists(inHostNameStr, inUserStr, inGUIDStr, inGSettings = None): def AgentActivityItemExists(inHostNameStr, inUserStr, inGUIDStr, inGSettings = None):
""" """L+,W+: Выполнить проверку, что активность (ActivityItem) была отправлена на сторону Агента.
Выполнить проверку, что активность (ActivityItem) была отправлена на сторону Агента.
:param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон)
:param inGUIDStr: ГУИД (GUID) активности (ActivityItem) :param inGUIDStr: ГУИД (GUID) активности (ActivityItem)
@ -97,8 +96,7 @@ def AgentActivityItemExists(inHostNameStr, inUserStr, inGUIDStr, inGSettings = N
return lResultBool return lResultBool
def AgentActivityItemReturnExists(inGUIDStr, inGSettings = None): def AgentActivityItemReturnExists(inGUIDStr, inGSettings = None):
""" """L+,W+: Выполнить проверку, что активность (ActivityItem) была выполнена на стороне Агента и результат был получен на стороне Оркестратора.
Выполнить проверку, что активность (ActivityItem) была выполнена на стороне Агента и результат был получен на стороне Оркестратора.
:param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон)
:param inGUIDStr: ГУИД (GUID) активности (ActivityItem) :param inGUIDStr: ГУИД (GUID) активности (ActivityItem)
@ -111,8 +109,7 @@ def AgentActivityItemReturnExists(inGUIDStr, inGSettings = None):
def AgentActivityItemReturnGet(inGUIDStr, inCheckIntervalSecFloat = 0.5, inGSettings=None): def AgentActivityItemReturnGet(inGUIDStr, inCheckIntervalSecFloat = 0.5, inGSettings=None):
""" """L+,W+: Ожидает появления результата по активности (ActivityItem). Возвращает результат выполнения активности.
Ожидает появления результата по активности (ActivityItem). Возвращает результат выполнения активности.
!ВНИМАНИЕ! Замораживает поток, пока не будет получен результат. !ВНИМАНИЕ! Замораживает поток, пока не будет получен результат.
!ВНИМАНИЕ! Запускать следует после того как будет инициализировано ядро Оркестратора (см. функцию OrchestratorInitWait), иначе будет инициирована ошибка. !ВНИМАНИЕ! Запускать следует после того как будет инициализировано ядро Оркестратора (см. функцию OrchestratorInitWait), иначе будет инициирована ошибка.
@ -134,8 +131,7 @@ def AgentActivityItemReturnGet(inGUIDStr, inCheckIntervalSecFloat = 0.5, inGSett
raise Exception(f"__Orchestrator__.AgentActivityItemReturnGet !ATTENTION! Use this function only after Orchestrator initialization! Before orchestrator init exception will be raised.") raise Exception(f"__Orchestrator__.AgentActivityItemReturnGet !ATTENTION! Use this function only after Orchestrator initialization! Before orchestrator init exception will be raised.")
def AgentOSCMD(inHostNameStr, inUserStr, inCMDStr, inRunAsyncBool=True, inSendOutputToOrchestratorLogsBool=True, inCMDEncodingStr="cp1251", inGSettings=None, inCaptureBool=True): def AgentOSCMD(inHostNameStr, inUserStr, inCMDStr, inRunAsyncBool=True, inSendOutputToOrchestratorLogsBool=True, inCMDEncodingStr="cp1251", inGSettings=None, inCaptureBool=True):
""" """L+,W+: Отправка команды командной строки на сессию, где работает pyOpenRPA.Agent. Результат выполнения команды можно выводить в лог оркестратора.
Отправка команды командной строки на сессию, где работает pyOpenRPA.Agent. Результат выполнения команды можно выводить в лог оркестратора.
:param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон)
:param inHostNameStr: Наименование хоста, на котором запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления :param inHostNameStr: Наименование хоста, на котором запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления
@ -159,8 +155,7 @@ def AgentOSCMD(inHostNameStr, inUserStr, inCMDStr, inRunAsyncBool=True, inSendOu
return AgentActivityItemAdd(inGSettings=inGSettings, inHostNameStr=inHostNameStr, inUserStr=inUserStr, inActivityItemDict=lActivityItemDict) return AgentActivityItemAdd(inGSettings=inGSettings, inHostNameStr=inHostNameStr, inUserStr=inUserStr, inActivityItemDict=lActivityItemDict)
def AgentOSLogoff(inHostNameStr, inUserStr): def AgentOSLogoff(inHostNameStr, inUserStr):
""" """L+,W+: Выполнить операцию logoff на стороне пользователя.
Выполнить операцию logoff на стороне пользователя.
:param inHostNameStr: Наименование хоста, на котором запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления :param inHostNameStr: Наименование хоста, на котором запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления
:param inUserStr: Наименование пользователя, на графической сессии которого запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления :param inUserStr: Наименование пользователя, на графической сессии которого запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления
@ -168,6 +163,7 @@ def AgentOSLogoff(inHostNameStr, inUserStr):
""" """
inGSettings = GSettingsGet() # Set the global settings inGSettings = GSettingsGet() # Set the global settings
lCMDStr = "shutdown /l" lCMDStr = "shutdown /l"
if CrossOS.IS_LINUX_BOOL: lCMDStr="logout"
lActivityItemDict = { lActivityItemDict = {
"Def":"OSCMD", # def alias (look pyOpeRPA.Agent gSettings["ProcessorDict"]["AliasDefDict"]) "Def":"OSCMD", # def alias (look pyOpeRPA.Agent gSettings["ProcessorDict"]["AliasDefDict"])
"ArgList":[], # Args list "ArgList":[], # Args list
@ -179,8 +175,7 @@ def AgentOSLogoff(inHostNameStr, inUserStr):
return AgentActivityItemAdd(inGSettings=inGSettings, inHostNameStr=inHostNameStr, inUserStr=inUserStr, inActivityItemDict=lActivityItemDict) return AgentActivityItemAdd(inGSettings=inGSettings, inHostNameStr=inHostNameStr, inUserStr=inUserStr, inActivityItemDict=lActivityItemDict)
def AgentOSFileSend(inHostNameStr, inUserStr, inOrchestratorFilePathStr, inAgentFilePathStr, inGSettings = None): def AgentOSFileSend(inHostNameStr, inUserStr, inOrchestratorFilePathStr, inAgentFilePathStr, inGSettings = None):
""" """L+,W+: Отправить файл по адресу inOrchestratorFilePathStr со стороны Оркестратора и сохранить по адресу inAgentFilePathStr на стороне Агента.
Отправить файл по адресу inOrchestratorFilePathStr со стороны Оркестратора и сохранить по адресу inAgentFilePathStr на стороне Агента.
Поддерживает передачу крупных файлов (более 2-х Гб.). Функция является синхронной - не закончит свое выполнение, пока файл не будет передан полностью. Поддерживает передачу крупных файлов (более 2-х Гб.). Функция является синхронной - не закончит свое выполнение, пока файл не будет передан полностью.
!ВНИМАНИЕ - ПОТОКОБЕЗОПАСНАЯ! Вы можете вызвать эту функцию до инициализации ядра Оркестратора. Оркестратор добавит эту функцию в процессорную очередь на исполение. Если вам нужен результат функции, то необходимо сначала убедиться в том, что ядро Оркестратора было инициализированно (см. функцию OrchestratorInitWait). !ВНИМАНИЕ - ПОТОКОБЕЗОПАСНАЯ! Вы можете вызвать эту функцию до инициализации ядра Оркестратора. Оркестратор добавит эту функцию в процессорную очередь на исполение. Если вам нужен результат функции, то необходимо сначала убедиться в том, что ядро Оркестратора было инициализированно (см. функцию OrchestratorInitWait).
@ -246,8 +241,7 @@ def AgentOSFileSend(inHostNameStr, inUserStr, inOrchestratorFilePathStr, inAgent
lFile.close() lFile.close()
def AgentOSFileBinaryDataBytesCreate(inHostNameStr, inUserStr, inFilePathStr, inFileDataBytes, inGSettings=None): def AgentOSFileBinaryDataBytesCreate(inHostNameStr, inUserStr, inFilePathStr, inFileDataBytes, inGSettings=None):
""" """L+,W+: Создать бинарный файл, который будет расположен по адресу inFilePathStr на стороне Агента с содержимым inFileDataBytes
Создать бинарный файл, который будет расположен по адресу inFilePathStr на стороне Агента с содержимым inFileDataBytes
:param inHostNameStr: Наименование хоста, на котором запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления :param inHostNameStr: Наименование хоста, на котором запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления
:param inUserStr: Наименование пользователя, на графической сессии которого запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления :param inUserStr: Наименование пользователя, на графической сессии которого запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления
@ -270,8 +264,7 @@ def AgentOSFileBinaryDataBytesCreate(inHostNameStr, inUserStr, inFilePathStr, in
def AgentOSFileBinaryDataBase64StrCreate(inHostNameStr, inUserStr, inFilePathStr, inFileDataBase64Str, inGSettings=None): def AgentOSFileBinaryDataBase64StrCreate(inHostNameStr, inUserStr, inFilePathStr, inFileDataBase64Str, inGSettings=None):
""" """L+,W+: Создать бинарный файл, который будет расположен по адресу inFilePathStr на стороне Агента с содержимым, декодированным с формата base64: inFileDataBase64Str
Создать бинарный файл, который будет расположен по адресу inFilePathStr на стороне Агента с содержимым, декодированным с формата base64: inFileDataBase64Str
:param inHostNameStr: Наименование хоста, на котором запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления :param inHostNameStr: Наименование хоста, на котором запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления
:param inUserStr: Наименование пользователя, на графической сессии которого запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления :param inUserStr: Наименование пользователя, на графической сессии которого запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления
@ -293,8 +286,7 @@ def AgentOSFileBinaryDataBase64StrCreate(inHostNameStr, inUserStr, inFilePathStr
def AgentOSFileBinaryDataBase64StrAppend(inHostNameStr, inUserStr, inFilePathStr, inFileDataBase64Str, inGSettings = None): def AgentOSFileBinaryDataBase64StrAppend(inHostNameStr, inUserStr, inFilePathStr, inFileDataBase64Str, inGSettings = None):
""" """L+,W+: Добавить бинарную информацию в существующий бинарный файл, который будет расположен по адресу inFilePathStr на стороне Агента с содержимым, декодированным с формата base64: inFileDataBase64Str
Добавить бинарную информацию в существующий бинарный файл, который будет расположен по адресу inFilePathStr на стороне Агента с содержимым, декодированным с формата base64: inFileDataBase64Str
:param inHostNameStr: Наименование хоста, на котором запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления :param inHostNameStr: Наименование хоста, на котором запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления
:param inUserStr: Наименование пользователя, на графической сессии которого запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления :param inUserStr: Наименование пользователя, на графической сессии которого запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления
@ -317,8 +309,7 @@ def AgentOSFileBinaryDataBase64StrAppend(inHostNameStr, inUserStr, inFilePathStr
# Send text file to Agent (string) # Send text file to Agent (string)
def AgentOSFileTextDataStrCreate(inHostNameStr, inUserStr, inFilePathStr, inFileDataStr, inEncodingStr = "utf-8",inGSettings=None): def AgentOSFileTextDataStrCreate(inHostNameStr, inUserStr, inFilePathStr, inFileDataStr, inEncodingStr = "utf-8",inGSettings=None):
""" """L+,W+: Создать текстовый файл, который будет расположен по адресу inFilePathStr на стороне Агента с содержимым inFileDataStr в кодировке inEncodingStr
Создать текстовый файл, который будет расположен по адресу inFilePathStr на стороне Агента с содержимым inFileDataStr в кодировке inEncodingStr
:param inHostNameStr: Наименование хоста, на котором запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления :param inHostNameStr: Наименование хоста, на котором запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления
:param inUserStr: Наименование пользователя, на графической сессии которого запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления :param inUserStr: Наименование пользователя, на графической сессии которого запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления
@ -340,8 +331,7 @@ def AgentOSFileTextDataStrCreate(inHostNameStr, inUserStr, inFilePathStr, inFile
return AgentActivityItemAdd(inGSettings=inGSettings, inHostNameStr=inHostNameStr, inUserStr=inUserStr, inActivityItemDict=lActivityItemDict) return AgentActivityItemAdd(inGSettings=inGSettings, inHostNameStr=inHostNameStr, inUserStr=inUserStr, inActivityItemDict=lActivityItemDict)
def AgentOSFileBinaryDataBase64StrReceive(inHostNameStr, inUserStr, inFilePathStr, inGSettings = None): def AgentOSFileBinaryDataBase64StrReceive(inHostNameStr, inUserStr, inFilePathStr, inGSettings = None):
""" """L+,W+: Выполнить чтение бинарного файла и получить содержимое в формате base64 (строка)
Выполнить чтение бинарного файла и получить содержимое в формате base64 (строка)
:param inHostNameStr: Наименование хоста, на котором запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления :param inHostNameStr: Наименование хоста, на котором запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления
:param inUserStr: Наименование пользователя, на графической сессии которого запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления :param inUserStr: Наименование пользователя, на графической сессии которого запущен Агент. Наименования подключенных агентов доступно для просмотра в панели управления
@ -362,8 +352,7 @@ def AgentOSFileBinaryDataBase64StrReceive(inHostNameStr, inUserStr, inFilePathSt
def AgentOSFileBinaryDataReceive(inHostNameStr, inUserStr, inFilePathStr): def AgentOSFileBinaryDataReceive(inHostNameStr, inUserStr, inFilePathStr):
""" """L+,W+: Чтение бинарного файла на стороне Агента по адресу inFilePathStr.
Чтение бинарного файла на стороне Агента по адресу inFilePathStr.
!ВНИМАНИЕ - СИНХРОННАЯ! Функция не завершится, пока не будет получен результат чтения на стороне Агента. !ВНИМАНИЕ - СИНХРОННАЯ! Функция не завершится, пока не будет получен результат чтения на стороне Агента.
@ -401,8 +390,7 @@ def AgentOSFileBinaryDataReceive(inHostNameStr, inUserStr, inFilePathStr):
return lFileDataBytes return lFileDataBytes
def AgentOSFileTextDataStrReceive(inHostNameStr, inUserStr, inFilePathStr, inEncodingStr="utf-8", inGSettings = None): def AgentOSFileTextDataStrReceive(inHostNameStr, inUserStr, inFilePathStr, inEncodingStr="utf-8", inGSettings = None):
""" """L+,W+: Чтение текстового файла на стороне Агента по адресу inFilePathStr. По ГИУД с помощью функции AgentActivityItemReturnGet можно будет получить текстовую строку данных, которые были расположены в файле.
Чтение текстового файла на стороне Агента по адресу inFilePathStr. По ГИУД с помощью функции AgentActivityItemReturnGet можно будет получить текстовую строку данных, которые были расположены в файле.
!ВНИМАНИЕ - АСИНХРОННАЯ! Функция завершится сразу, не дожидаясь окончания выполнения операции на стороне Агента. !ВНИМАНИЕ - АСИНХРОННАЯ! Функция завершится сразу, не дожидаясь окончания выполнения операции на стороне Агента.
@ -425,8 +413,7 @@ def AgentOSFileTextDataStrReceive(inHostNameStr, inUserStr, inFilePathStr, inEnc
return AgentActivityItemAdd(inGSettings=inGSettings, inHostNameStr=inHostNameStr, inUserStr=inUserStr, inActivityItemDict=lActivityItemDict) return AgentActivityItemAdd(inGSettings=inGSettings, inHostNameStr=inHostNameStr, inUserStr=inUserStr, inActivityItemDict=lActivityItemDict)
def AgentProcessWOExeUpperUserListGet(inHostNameStr, inUserStr, inGSettings = None): def AgentProcessWOExeUpperUserListGet(inHostNameStr, inUserStr, inGSettings = None):
""" """L-,W+: Получить список процессов, которые выполняется на сессии Агента. Все процессы фиксируются без постфикса .exe, а также в верхнем регистре.
Получить список процессов, которые выполняется на сессии Агента. Все процессы фиксируются без постфикса .exe, а также в верхнем регистре.
ПРИМЕР РЕЗУЛЬТАТА, КОТОРЫЙ МОЖНО ПОЛУЧИТЬ ПО ГУИД ЧЕРЕЗ ФУНКЦИЮ AgentActivityItemReturnGet: ["ORCHESTRATOR", "AGENT", "CHROME", "EXPLORER", ...] ПРИМЕР РЕЗУЛЬТАТА, КОТОРЫЙ МОЖНО ПОЛУЧИТЬ ПО ГУИД ЧЕРЕЗ ФУНКЦИЮ AgentActivityItemReturnGet: ["ORCHESTRATOR", "AGENT", "CHROME", "EXPLORER", ...]
@ -448,16 +435,15 @@ def AgentProcessWOExeUpperUserListGet(inHostNameStr, inUserStr, inGSettings = No
# OS DEFS # OS DEFS
def OSLogoff(): def OSLogoff():
""" """L+,W+: Выполнить отключение сессии, на которой выполняется Оркестратор.
Выполнить отключение сессии, на которой выполняется Оркестратор.
:return: :return:
""" """
os.system("shutdown /l") if CrossOS.IS_WINDOWS_BOOL: os.system("shutdown /l")
elif CrossOS.IS_LINUX_BOOL: os.system("logout")
def OSCredentialsVerify(inUserStr, inPasswordStr, inDomainStr=""): ## def OSCredentialsVerify(inUserStr, inPasswordStr, inDomainStr=""): ##
""" """L+,W+: Выполнить верификацию доменного (локального) пользователя по паре логин/пароль
Выполнить верификацию доменного (локального) пользователя по паре логин/пароль
:param inUserStr: Наименование пользователя :param inUserStr: Наименование пользователя
:param inPasswordStr: Пароль :param inPasswordStr: Пароль
@ -478,8 +464,7 @@ def OSCredentialsVerify(inUserStr, inPasswordStr, inDomainStr=""): ##
return authenticate(inUserStr, inPasswordStr, service='login', encoding='utf-8', resetcred=True) return authenticate(inUserStr, inPasswordStr, service='login', encoding='utf-8', resetcred=True)
def OSRemotePCRestart(inHostStr, inForceBool=True, inLogger = None): def OSRemotePCRestart(inHostStr, inForceBool=True, inLogger = None):
""" """L-,W+: Отправить сигнал на удаленную перезагрузку операционной системы.
Отправить сигнал на удаленную перезагрузку операционной системы.
!ВНИМАНИЕ! Перезапуск будет принят, если учетная запись имеет полномочия на перезапуск на соответсвующей машине. !ВНИМАНИЕ! Перезапуск будет принят, если учетная запись имеет полномочия на перезапуск на соответсвующей машине.
@ -512,10 +497,7 @@ def OSRestart(inForceBool=True, inLogger = None):
OSCMD(inCMDStr=lCMDStr,inLogger=inLogger) OSCMD(inCMDStr=lCMDStr,inLogger=inLogger)
def OSCMD(inCMDStr, inRunAsyncBool=True, inLogger = None): def OSCMD(inCMDStr, inRunAsyncBool=True, inLogger = None):
""" """L-,W+: Отправить команду на выполнение на сессию, где выполняется Оркестратор.
Отправить команду на выполнение на сессию, где выполняется Оркестратор.
Поддерживается: Windows: +, Linux: +
:param inCMDStr: Команда на отправку :param inCMDStr: Команда на отправку
:param inRunAsyncBool: True - выполнить команду в асинхронном режиме (не дожидаться окончания выполнения программы и не захватывать результат выполнения); False - Ждать окончания выполнения и захватывать результат :param inRunAsyncBool: True - выполнить команду в асинхронном режиме (не дожидаться окончания выполнения программы и не захватывать результат выполнения); False - Ждать окончания выполнения и захватывать результат
@ -561,8 +543,7 @@ def OSCMD(inCMDStr, inRunAsyncBool=True, inLogger = None):
return lResultStr return lResultStr
def OrchestratorRestart(inGSettings=None): def OrchestratorRestart(inGSettings=None):
""" """L+,W+: Перезапуск Оркестратора с сохранением информации о запущенных RDP сессиях.
Перезапуск Оркестратора с сохранением информации о запущенных RDP сессиях.
:param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон)
""" """
@ -577,8 +558,7 @@ def OrchestratorRestart(inGSettings=None):
sys.exit(0) sys.exit(0)
def OrchestratorLoggerGet() -> logging.Logger: def OrchestratorLoggerGet() -> logging.Logger:
""" """L+,W+: Получить логгер Оркестратора
Получить логгер Оркестратора
:return: Логгер :return: Логгер
""" """
@ -586,8 +566,7 @@ def OrchestratorLoggerGet() -> logging.Logger:
def OrchestratorScheduleGet() -> schedule: def OrchestratorScheduleGet() -> schedule:
""" """L+,W+: Базовый объект расписания, который можно использовать для запуска / остановки роботов.
Базовый объект расписания, который можно использовать для запуска / остановки роботов.
Подробнее про объект schedule и его примеры использования см. по адресу: schedule.readthedocs.io Подробнее про объект schedule и его примеры использования см. по адресу: schedule.readthedocs.io
.. code-block:: python .. code-block:: python
@ -605,8 +584,7 @@ def OrchestratorScheduleGet() -> schedule:
return GSettingsGet().get("SchedulerDict",{}).get("Schedule",None) return GSettingsGet().get("SchedulerDict",{}).get("Schedule",None)
def OrchestratorThreadStart(inDef, *inArgList, **inArgDict): def OrchestratorThreadStart(inDef, *inArgList, **inArgDict):
""" """L+,W+: Запустить функцию в отдельном потоке. В таком случае получить результат выполнения функции можно только через общие переменные. (Например через GSettings)
Запустить функцию в отдельном потоке. В таком случае получить результат выполнения функции можно только через общие переменные. (Например через GSettings)
:param inDef: Python функция :param inDef: Python функция
:param inArgList: Список неименованных аргументов функции inDef :param inArgList: Список неименованных аргументов функции inDef
@ -618,8 +596,7 @@ def OrchestratorThreadStart(inDef, *inArgList, **inArgDict):
return lDefThread return lDefThread
def OrchestratorIsAdmin(): def OrchestratorIsAdmin():
""" """L+,W+: Проверить, запущен ли Оркестратор с правами администратора. Права администратора нужны Оркестратору только для контроля графической сессии, на которой он запущен. Если эти права выделить индивидуально, то права администратора будут необязательны.
Проверить, запущен ли Оркестратор с правами администратора. Права администратора нужны Оркестратору только для контроля графической сессии, на которой он запущен. Если эти права выделить индивидуально, то права администратора будут необязательны.
:return: True - Запущен с правами администратора; False - Не запущен с правами администратора :return: True - Запущен с правами администратора; False - Не запущен с правами администратора
""" """
@ -628,11 +605,11 @@ def OrchestratorIsAdmin():
return ctypes.windll.shell32.IsUserAnAdmin() return ctypes.windll.shell32.IsUserAnAdmin()
except: except:
return False return False
elif CrossOS.IS_LINUX_BOOL: return os.getuid()==0
else: return True else: return True
def OrchestratorIsInited() -> bool: def OrchestratorIsInited() -> bool:
""" """L+,W+: Проверить, было ли проинициализировано ядро Оркестратора
Проверить, было ли проинициализировано ядро Оркестратора
:return: True - Ядро Оркестратора было проинициализировано; False - Требуется время на инициализацию :return: True - Ядро Оркестратора было проинициализировано; False - Требуется время на инициализацию
:rtype: bool :rtype: bool
@ -641,8 +618,7 @@ def OrchestratorIsInited() -> bool:
return Core.IsOrchestratorInitialized(inGSettings=GSettingsGet()) return Core.IsOrchestratorInitialized(inGSettings=GSettingsGet())
def OrchestratorInitWait() -> None: def OrchestratorInitWait() -> None:
""" """L+,W+: Ожидать инициализацию ядра Оркестратора
Ожидать инициализацию ядра Оркестратора
!ВНИМАНИЕ!: НИ В КОЕМ СЛУЧАЕ НЕ ЗАПУСКАТЬ ЭТУ ФУНКЦИЮ В ОСНОВНОМ ПОТОКЕ, ГДЕ ПРОИСХОДИТ ИНИЦИАЛИЗАЦИЯ ЯДРА ОРКЕСТРАТОРА - ВОЗНИКНЕТ ВЕЧНЫЙ ЦИКЛ !ВНИМАНИЕ!: НИ В КОЕМ СЛУЧАЕ НЕ ЗАПУСКАТЬ ЭТУ ФУНКЦИЮ В ОСНОВНОМ ПОТОКЕ, ГДЕ ПРОИСХОДИТ ИНИЦИАЛИЗАЦИЯ ЯДРА ОРКЕСТРАТОРА - ВОЗНИКНЕТ ВЕЧНЫЙ ЦИКЛ
""" """
@ -652,8 +628,7 @@ def OrchestratorInitWait() -> None:
def OrchestratorRerunAsAdmin(): def OrchestratorRerunAsAdmin():
""" """L-,W+: Перезапустить Оркестратор с правами локального администратора. Права администратора нужны Оркестратору только для контроля графической сессии, на которой он запущен. Если эти права выделить индивидуально, то права администратора будут необязательны.
Перезапустить Оркестратор с правами локального администратора. Права администратора нужны Оркестратору только для контроля графической сессии, на которой он запущен. Если эти права выделить индивидуально, то права администратора будут необязательны.
:return: True - Запущен с правами администратора; False - Не запущен с правами администратора :return: True - Запущен с правами администратора; False - Не запущен с правами администратора
""" """
@ -661,11 +636,10 @@ def OrchestratorRerunAsAdmin():
# Re-run the program with admin rights # Re-run the program with admin rights
ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, " ".join(sys.argv), None, 1) ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, " ".join(sys.argv), None, 1)
else: else:
print(f"!SKIPPED! Already run as administrator!") print(f"Уже запущено с правами администратора!")
def OrchestratorPySearchInit(inGlobPatternStr, inDefStr = None, inDefArgNameGSettingsStr = None, inAsyncInitBool = False): def OrchestratorPySearchInit(inGlobPatternStr, inDefStr = None, inDefArgNameGSettingsStr = None, inAsyncInitBool = False):
""" """L+,W+: Выполнить поиск и инициализацию пользовательских .py файлов в Оркестраторе (например панелей управления роботов)
Выполнить поиск и инициализацию пользовательских .py файлов в Оркестраторе (например панелей управления роботов)
Добавляет инициализированный модуль в пространство sys.modules как imported (имя модуля = имя файла без расширения). Добавляет инициализированный модуль в пространство sys.modules как imported (имя модуля = имя файла без расширения).
@ -721,7 +695,7 @@ def OrchestratorPySearchInit(inGlobPatternStr, inDefStr = None, inDefArgNameGSet
# # # # # # # # # # # # # # # #
lResultDict = {} lResultDict = {}
inGlobPatternStr = CrossOS.PathStr(inPathStr=inGlobPatternStr)
lPyPathStrList = glob.glob(inGlobPatternStr) # get the file list lPyPathStrList = glob.glob(inGlobPatternStr) # get the file list
lL = OrchestratorLoggerGet() # get the logger lL = OrchestratorLoggerGet() # get the logger
for lPyPathItemStr in lPyPathStrList: for lPyPathItemStr in lPyPathStrList:
@ -737,8 +711,7 @@ def OrchestratorPySearchInit(inGlobPatternStr, inDefStr = None, inDefArgNameGSet
return lResultDict return lResultDict
def OrchestratorSessionSave(inGSettings=None): def OrchestratorSessionSave(inGSettings=None):
""" """L+,W+: Сохранить состояние Оркестратора (для дальнейшего восстановления в случае перезапуска):
Сохранить состояние Оркестратора (для дальнейшего восстановления в случае перезапуска):
- RDP сессий, которые контролирует Оркестратор - RDP сессий, которые контролирует Оркестратор
- Хранилища DataStorage в глобальном словаре настроек GSettings. DataStorage поддерживает хранение объектов Python - Хранилища DataStorage в глобальном словаре настроек GSettings. DataStorage поддерживает хранение объектов Python
@ -782,8 +755,7 @@ def OrchestratorSessionSave(inGSettings=None):
return True return True
def OrchestratorSessionRestore(inGSettings=None): def OrchestratorSessionRestore(inGSettings=None):
""" """L+,W+: Восстановить состояние Оркестратора, если ранее состояние Оркестратора было сохранено с помощью функции OrchestratorSessionSave:
Восстановить состояние Оркестратора, если ранее состояние Оркестратора было сохранено с помощью функции OrchestratorSessionSave:
- RDP сессий, которые контролирует Оркестратор - RDP сессий, которые контролирует Оркестратор
- Хранилища DataStorage в глобальном словаре настроек GSettings. DataStorage поддерживает хранение объектов Python - Хранилища DataStorage в глобальном словаре настроек GSettings. DataStorage поддерживает хранение объектов Python
@ -806,7 +778,7 @@ def OrchestratorSessionRestore(inGSettings=None):
lFile.close() # Close the file lFile.close() # Close the file
os.remove("_SessionLast_RDPList.json") # remove the temp file os.remove("_SessionLast_RDPList.json") # remove the temp file
inGSettings["RobotRDPActive"]["RDPList"] = lSessionLastRDPList # Set the last session dict inGSettings["RobotRDPActive"]["RDPList"] = lSessionLastRDPList # Set the last session dict
if lL: lL.warning(f"RDP Session List was restored from previous Orchestrator session") if lL: lL.warning(f"Список РДП был восстановлен из прошлой сессии оркестратора")
# _SessionLast_StorageDict.pickle (binary) # _SessionLast_StorageDict.pickle (binary)
if os.path.exists("_SessionLast_StorageDict.pickle"): if os.path.exists("_SessionLast_StorageDict.pickle"):
if "StorageDict" not in inGSettings: if "StorageDict" not in inGSettings:
@ -815,7 +787,7 @@ def OrchestratorSessionRestore(inGSettings=None):
lStorageDictDumpDict = pickle.load(lFile) lStorageDictDumpDict = pickle.load(lFile)
Server.__ComplexDictMerge2to1Overwrite__(in1Dict=inGSettings["StorageDict"], Server.__ComplexDictMerge2to1Overwrite__(in1Dict=inGSettings["StorageDict"],
in2Dict=lStorageDictDumpDict) # Merge dict 2 into dict 1 in2Dict=lStorageDictDumpDict) # Merge dict 2 into dict 1
if lL: lL.warning(f"StorageDict was restored from previous Orchestrator session") if lL: lL.warning(f"Словарь StorageDict был восстановлен из прошлой сессии оркестратора")
os.remove("_SessionLast_StorageDict.pickle") # remove the temp file os.remove("_SessionLast_StorageDict.pickle") # remove the temp file
# _SessionLast_Gsettings.pickle (binary) # _SessionLast_Gsettings.pickle (binary)
if os.path.exists("_SessionLast_GSettings.pickle"): if os.path.exists("_SessionLast_GSettings.pickle"):
@ -827,12 +799,11 @@ def OrchestratorSessionRestore(inGSettings=None):
lStorageDictDumpDict = pickle.load(lFile) lStorageDictDumpDict = pickle.load(lFile)
Server.__ComplexDictMerge2to1Overwrite__(in1Dict=inGSettings, Server.__ComplexDictMerge2to1Overwrite__(in1Dict=inGSettings,
in2Dict=lStorageDictDumpDict) # Merge dict 2 into dict 1 in2Dict=lStorageDictDumpDict) # Merge dict 2 into dict 1
if lL: lL.warning(f"GSettings was restored from previous Orchestrator session") if lL: lL.warning(f"Словарь GSettings был восстановлен из прошлой сессии оркестратора")
os.remove("_SessionLast_GSettings.pickle") # remove the temp file os.remove("_SessionLast_GSettings.pickle") # remove the temp file
def UACKeyListCheck(inRequest, inRoleKeyList) -> bool: def UACKeyListCheck(inRequest, inRoleKeyList) -> bool:
""" """L+,W+: Проверить права доступа для пользователя запроса по списку ключей до права.
Проверить права доступа для пользователя запроса по списку ключей до права.
.. code-block:: python .. code-block:: python
@ -847,8 +818,7 @@ def UACKeyListCheck(inRequest, inRoleKeyList) -> bool:
return inRequest.UACClientCheck(inRoleKeyList=inRoleKeyList) return inRequest.UACClientCheck(inRoleKeyList=inRoleKeyList)
def UACUserDictGet(inRequest) -> dict: def UACUserDictGet(inRequest) -> dict:
""" """L+,W+: Вернуть UAC (User Access Control) словарь доступов для пользователя, который отправил запрос. Пустой словарь - супердоступ (доступ ко всему)
Вернуть UAC (User Access Control) словарб доступов для пользователя, который отправил запрос. Пустой словарь - супердоступ (доступ ко всему)
:param inRequest: Экземпляр request (from http.server import BaseHTTPRequestHandler) :param inRequest: Экземпляр request (from http.server import BaseHTTPRequestHandler)
:return: Словарь доступов пользователя. Пустой словарь - супердоступ (доступ ко всему) :return: Словарь доступов пользователя. Пустой словарь - супердоступ (доступ ко всему)
@ -856,8 +826,7 @@ def UACUserDictGet(inRequest) -> dict:
return inRequest.UserRoleHierarchyGet() # get the Hierarchy return inRequest.UserRoleHierarchyGet() # get the Hierarchy
def UACUpdate(inADLoginStr, inADStr="", inADIsDefaultBool=True, inURLList=None, inRoleHierarchyAllowedDict=None, inGSettings = None): def UACUpdate(inADLoginStr, inADStr="", inADIsDefaultBool=True, inURLList=None, inRoleHierarchyAllowedDict=None, inGSettings = None):
""" """L+,W+: Дообогащение словаря доступа UAC пользователя inADStr\\inADLoginStr. Если ранее словарь не устанавливался, то по умолчанию он {}. Далее идет дообогащение теми ключами, которые присутствуют в inRoleHierarchyAllowedDict
Дообогащение словаря доступа UAC пользователя inADStr\\inADLoginStr. Если ранее словарь не устанавливался, то по умолчанию он {}. Далее идет дообогащение теми ключами, которые присутствуют в inRoleHierarchyAllowedDict
:param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон)
:param inADLoginStr: Логин пользователя :param inADLoginStr: Логин пользователя
@ -900,8 +869,7 @@ def UACUpdate(inADLoginStr, inADStr="", inADIsDefaultBool=True, inURLList=None,
inGSettings["ServerDict"]["AccessUsers"]["RuleDomainUserDict"].update({("",inADLoginStr.upper()):lRuleDomainUserDict}) inGSettings["ServerDict"]["AccessUsers"]["RuleDomainUserDict"].update({("",inADLoginStr.upper()):lRuleDomainUserDict})
def UACSuperTokenUpdate(inSuperTokenStr, inGSettings=None): def UACSuperTokenUpdate(inSuperTokenStr, inGSettings=None):
""" """L+,W+: Добавить супертокен (полный доступ). Супертокены используются для подключения к Оркестратору по API
Добавить супертокен (полный доступ). Супертокены используются для подключения к Оркестратору по API
:param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон)
:param inSuperTokenStr: Кодовая строковая комбинация, которая будет предоставлять доступ роботу / агенту для взаимодействия с Оркестратором по API :param inSuperTokenStr: Кодовая строковая комбинация, которая будет предоставлять доступ роботу / агенту для взаимодействия с Оркестратором по API
@ -917,8 +885,7 @@ def UACSuperTokenUpdate(inSuperTokenStr, inGSettings=None):
# OrchestratorWeb defs # OrchestratorWeb defs
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
def WebURLIndexChange(inURLIndexStr:str ="/"): def WebURLIndexChange(inURLIndexStr:str ="/"):
""" """L+,W+: Изменить адрес главной страницы Оркестратора. По умолчанию '/'
Изменить адрес главной страницы Оркестратора. По умолчанию '/'
:param inURLIndexStr: Новый адрес главной страницы Оркестратора. :param inURLIndexStr: Новый адрес главной страницы Оркестратора.
:type inURLIndexStr: str, опционально :type inURLIndexStr: str, опционально
@ -926,8 +893,7 @@ def WebURLIndexChange(inURLIndexStr:str ="/"):
GSettingsGet()["ServerDict"]["URLIndexStr"] = inURLIndexStr GSettingsGet()["ServerDict"]["URLIndexStr"] = inURLIndexStr
def WebURLConnectDef(inMethodStr, inURLStr, inMatchTypeStr, inDef, inContentTypeStr="application/octet-stream", inGSettings = None, inUACBool = None): def WebURLConnectDef(inMethodStr, inURLStr, inMatchTypeStr, inDef, inContentTypeStr="application/octet-stream", inGSettings = None, inUACBool = None):
""" """L+,W+: Подключить функцию Python к URL.
Подключить функцию Python к URL.
:param inMethodStr: Метод доступа по URL "GET" || "POST" :param inMethodStr: Метод доступа по URL "GET" || "POST"
:param inURLStr: URL адрес. Пример "/index" :param inURLStr: URL адрес. Пример "/index"
@ -953,8 +919,7 @@ def WebURLConnectDef(inMethodStr, inURLStr, inMatchTypeStr, inDef, inContentType
def WebURLConnectFolder(inMethodStr, inURLStr, inMatchTypeStr, inFolderPathStr, inGSettings = None, inUACBool = None, inUseCacheBool= False): def WebURLConnectFolder(inMethodStr, inURLStr, inMatchTypeStr, inFolderPathStr, inGSettings = None, inUACBool = None, inUseCacheBool= False):
""" """L+,W+: Подключить папку к URL.
Подключить папку к URL.
:param inMethodStr: Метод доступа по URL "GET" || "POST" :param inMethodStr: Метод доступа по URL "GET" || "POST"
:param inURLStr: URL адрес. Пример "/index" :param inURLStr: URL адрес. Пример "/index"
@ -984,9 +949,7 @@ def WebURLConnectFolder(inMethodStr, inURLStr, inMatchTypeStr, inFolderPathStr,
def WebURLConnectFile(inMethodStr, inURLStr, inMatchTypeStr, inFilePathStr, inContentTypeStr=None, inGSettings = None, inUACBool = None, inUseCacheBool = False): def WebURLConnectFile(inMethodStr, inURLStr, inMatchTypeStr, inFilePathStr, inContentTypeStr=None, inGSettings = None, inUACBool = None, inUseCacheBool = False):
""" """L+,W+: Подключить файл к URL.
Подключить файл к URL.
:param inMethodStr: Метод доступа по URL "GET" || "POST" :param inMethodStr: Метод доступа по URL "GET" || "POST"
:param inURLStr: URL адрес. Пример "/index" :param inURLStr: URL адрес. Пример "/index"
@ -1013,8 +976,7 @@ def WebURLConnectFile(inMethodStr, inURLStr, inMatchTypeStr, inFilePathStr, inCo
inGSettings["ServerDict"]["URLList"].append(lURLItemDict) inGSettings["ServerDict"]["URLList"].append(lURLItemDict)
def WebListenCreate(inServerKeyStr="Default", inAddressStr="", inPortInt=80, inCertFilePEMPathStr=None, inKeyFilePathStr=None, inGSettings = None): def WebListenCreate(inServerKeyStr="Default", inAddressStr="", inPortInt=80, inCertFilePEMPathStr=None, inKeyFilePathStr=None, inGSettings = None):
""" """L+,W+: Настроить веб-сервер Оркестратора.
Настроить веб-сервер Оркестратора.
:param inAddressStr: IP адрес для прослушивания. Если "", то прослушивать запросы со всех сетевых карт. Если "127.0.0.1", то слушать запросы только с той ОС, на которой работает Оркестратор :param inAddressStr: IP адрес для прослушивания. Если "", то прослушивать запросы со всех сетевых карт. Если "127.0.0.1", то слушать запросы только с той ОС, на которой работает Оркестратор
:param inPortInt: Номер порта для прослушивания. Если HTTP - 80; Если HTTPS - 443. По умолчанию 80. Допускается установка других портов :param inPortInt: Номер порта для прослушивания. Если HTTP - 80; Если HTTPS - 443. По умолчанию 80. Допускается установка других портов
@ -1023,6 +985,8 @@ def WebListenCreate(inServerKeyStr="Default", inAddressStr="", inPortInt=80, inC
:param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон)
:return: :return:
""" """
inCertFilePEMPathStr=CrossOS.PathStr(inPathStr=inCertFilePEMPathStr)
inKeyFilePathStr=CrossOS.PathStr(inPathStr=inKeyFilePathStr)
inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings inGSettings = GSettingsGet(inGSettings=inGSettings) # Set the global settings
inGSettings["ServerDict"]["ListenDict"][inServerKeyStr]={ inGSettings["ServerDict"]["ListenDict"][inServerKeyStr]={
"AddressStr":inAddressStr, "AddressStr":inAddressStr,
@ -1034,8 +998,7 @@ def WebListenCreate(inServerKeyStr="Default", inAddressStr="", inPortInt=80, inC
def WebCPUpdate(inCPKeyStr, inHTMLRenderDef=None, inJSONGeneratorDef=None, inJSInitGeneratorDef=None, inGSettings = None): def WebCPUpdate(inCPKeyStr, inHTMLRenderDef=None, inJSONGeneratorDef=None, inJSInitGeneratorDef=None, inGSettings = None):
""" """L+,W+: Добавить панель управления робота в Оркестратор. Для панели управления открыт доступ для использования функции-генератора HTML, генератора JSON данных, генератора JS кода.
Добавить панель управления робота в Оркестратор. Для панели управления открыт доступ для использования функции-генератора HTML, генератора JSON данных, генератора JS кода.
:param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон)
:param inCPKeyStr: Текстовый ключ панели управления. Ключ для каждой панели управления должен быть уникальным! :param inCPKeyStr: Текстовый ключ панели управления. Ключ для каждой панели управления должен быть уникальным!
@ -1053,8 +1016,7 @@ def WebCPUpdate(inCPKeyStr, inHTMLRenderDef=None, inJSONGeneratorDef=None, inJSI
def WebAuditMessageCreate(inRequest=None, inOperationCodeStr="-", inMessageStr="-"): def WebAuditMessageCreate(inRequest=None, inOperationCodeStr="-", inMessageStr="-"):
""" """L+,W+: Создание сообщения ИТ аудита с такими сведениями как (Домен, IP, логин и тд.). Данная функция особенно актуальна в том случае, если требуется реализовать дополнительные меры контроля ИТ системы.
Создание сообщения ИТ аудита с такими сведениями как (Домен, IP, логин и тд.). Данная функция особенно актуальна в том случае, если требуется реализовать дополнительные меры контроля ИТ системы.
.. code-block:: python .. code-block:: python
@ -1087,8 +1049,7 @@ def WebAuditMessageCreate(inRequest=None, inOperationCodeStr="-", inMessageStr="
return lResultStr return lResultStr
def WebRequestParseBodyBytes(inRequest=None): def WebRequestParseBodyBytes(inRequest=None):
""" """L+,W+: Извлечь данные в байт виде из тела (body) HTTP запроса.
Извлечь данные в байт виде из тела (body) HTTP запроса.
:param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя :param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя
:return: Строка байт b'' или None (если тело запроса было пустым) :return: Строка байт b'' или None (если тело запроса было пустым)
@ -1101,8 +1062,7 @@ def WebRequestParseBodyBytes(inRequest=None):
return lBodyBytes return lBodyBytes
def WebRequestParseBodyStr(inRequest=None): def WebRequestParseBodyStr(inRequest=None):
""" """L+,W+: Извлечь данные в виде строки из тела (body) HTTP запроса.
Извлечь данные в виде строки из тела (body) HTTP запроса.
:param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя :param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя
:return: Текстовая строка '' или None (если тело запроса было пустым) :return: Текстовая строка '' или None (если тело запроса было пустым)
@ -1111,8 +1071,7 @@ def WebRequestParseBodyStr(inRequest=None):
return WebRequestParseBodyBytes(inRequest=inRequest).decode('utf-8') return WebRequestParseBodyBytes(inRequest=inRequest).decode('utf-8')
def WebRequestParseBodyJSON(inRequest=None): def WebRequestParseBodyJSON(inRequest=None):
""" """L+,W+: Извлечь из тела (body) запроса HTTP JSON данные и преобразовать в Dict / List структуры языка Python.
Извлечь из тела (body) запроса HTTP JSON данные и преобразовать в Dict / List структуры языка Python.
:param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя :param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя
:return: Словарь (dict), список (list) или None (если тело запроса было пустым) :return: Словарь (dict), список (list) или None (если тело запроса было пустым)
@ -1121,8 +1080,7 @@ def WebRequestParseBodyJSON(inRequest=None):
return json.loads(WebRequestParseBodyStr(inRequest=inRequest)) return json.loads(WebRequestParseBodyStr(inRequest=inRequest))
def WebRequestParsePath(inRequest=None): def WebRequestParsePath(inRequest=None):
""" """L+,W+: Извлечь декодированный URL путь из HTTP запроса пользователя в формате строки.
Извлечь декодированный URL путь из HTTP запроса пользователя в формате строки.
:param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя :param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя
:return: str, пример: /pyOpenRPA/Debugging/DefHelper :return: str, пример: /pyOpenRPA/Debugging/DefHelper
@ -1131,8 +1089,7 @@ def WebRequestParsePath(inRequest=None):
return urllib.parse.unquote(inRequest.path) return urllib.parse.unquote(inRequest.path)
def WebRequestParseFile(inRequest=None): def WebRequestParseFile(inRequest=None):
""" """L+,W+: Извлечь файл (наименование + содержимое в виде строки байт b'') из HTTP запроса пользователя.
Извлечь файл (наименование + содержимое в виде строки байт b'') из HTTP запроса пользователя.
:param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя :param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя
:return: Кортеж формата (FileNameStr, FileBodyBytes) or (None, None), если файл не был обнаружен :return: Кортеж формата (FileNameStr, FileBodyBytes) or (None, None), если файл не был обнаружен
@ -1158,8 +1115,7 @@ def WebRequestParseFile(inRequest=None):
return lResultTurple return lResultTurple
def WebRequestResponseSend(inResponeStr, inRequest=None, inContentTypeStr: str = None, inHeadersDict: dict = None): def WebRequestResponseSend(inResponeStr, inRequest=None, inContentTypeStr: str = None, inHeadersDict: dict = None):
""" """L+,W+: Установить ответ на HTTP запрос пользователя.
Установить ответ на HTTP запрос пользователя.
:param inResponeStr: Тело ответа (строка) :param inResponeStr: Тело ответа (строка)
:param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя :param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя
@ -1175,16 +1131,14 @@ def WebRequestResponseSend(inResponeStr, inRequest=None, inContentTypeStr: str =
def WebRequestGet(): def WebRequestGet():
""" """L+,W+: Вернуть экземпляр HTTP запроса, если функция вызвана в потоке, который был порожден для отработки HTTP запроса пользователя.
Вернуть экземпляр HTTP запроса, если функция вызвана в потоке, который был порожден для отработки HTTP запроса пользователя.
""" """
lCurrentThread = threading.current_thread() lCurrentThread = threading.current_thread()
if hasattr(lCurrentThread, "request"): if hasattr(lCurrentThread, "request"):
return lCurrentThread.request return lCurrentThread.request
def WebUserInfoGet(inRequest=None): def WebUserInfoGet(inRequest=None):
""" """L+,W+: Информация о пользователе, который отправил HTTP запрос.
Информация о пользователе, который отправил HTTP запрос.
:param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя :param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя
:return: Сведения в формате {"DomainUpperStr": "PYOPENRPA", "UserNameUpperStr": "IVAN.MASLOV"} :return: Сведения в формате {"DomainUpperStr": "PYOPENRPA", "UserNameUpperStr": "IVAN.MASLOV"}
@ -1195,8 +1149,7 @@ def WebUserInfoGet(inRequest=None):
return {"DomainUpperStr": lDomainUpperStr, "UserNameUpperStr": lUserUpperStr} return {"DomainUpperStr": lDomainUpperStr, "UserNameUpperStr": lUserUpperStr}
def WebUserIsSuperToken(inRequest = None, inGSettings = None): def WebUserIsSuperToken(inRequest = None, inGSettings = None):
""" """L+,W+: Проверить, авторизован ли HTTP запрос с помощью супер токена (токен, который не истекает).
Проверить, авторизован ли HTTP запрос с помощью супер токена (токен, который не истекает).
:param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя :param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя
:param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон)
@ -1210,8 +1163,7 @@ def WebUserIsSuperToken(inRequest = None, inGSettings = None):
return lIsSuperTokenBool return lIsSuperTokenBool
def WebUserUACHierarchyGet(inRequest = None): def WebUserUACHierarchyGet(inRequest = None):
""" """L+,W+: Вернуть словарь доступа UAC в отношении пользователя, который выполнил HTTP запрос inRequest
Вернуть словарь доступа UAC в отношении пользователя, который выполнил HTTP запрос inRequest
:param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя :param inRequest: Экземпляр HTTP request. Опционален, если сообщение фиксируется из под потока, который был инициирован запросом пользователя
:return: UAC словарь доступа или {}, что означает полный доступ :return: UAC словарь доступа или {}, что означает полный доступ
@ -1233,8 +1185,7 @@ if __name__ == "pyOpenRPA.Orchestrator.__Orchestrator__" and "pyOpenRPA.Orchestr
sys.modules["pyOpenRPA.Orchestrator"] = lCurrentModule sys.modules["pyOpenRPA.Orchestrator"] = lCurrentModule
def GSettingsGet(inGSettings=None): def GSettingsGet(inGSettings=None):
""" """L+,W+: Вернуть глобальный словарь настроек Оркестратора. Во время выполнения программы глобальный словарь настроек существует в единственном экземпляре (синглтон)
Вернуть глобальный словарь настроек Оркестратора. Во время выполнения программы глобальный словарь настроек существует в единственном экземпляре (синглтон)
:param inGSettings: Дополнительный словарь настроек, который необходимо добавить в основной глобальный словарь настроек Оркестратора (синглтон) :param inGSettings: Дополнительный словарь настроек, который необходимо добавить в основной глобальный словарь настроек Оркестратора (синглтон)
:return: Глобальный словарь настроек GSettings :return: Глобальный словарь настроек GSettings
@ -1246,8 +1197,7 @@ def GSettingsGet(inGSettings=None):
return GSettings # Return the result return GSettings # Return the result
def GSettingsKeyListValueSet(inValue, inKeyList=None, inGSettings = None): def GSettingsKeyListValueSet(inValue, inKeyList=None, inGSettings = None):
""" """L+,W+: Установить значение из глобального словаря настроек Оркестратора GSettings по списку ключей.
Установить значение из глобального словаря настроек Оркестратора GSettings по списку ключей.
Пример: Для того, чтобы установить значение для ключа car в словаре {"complex":{"car":"green"}, "simple":"HELLO"}, необходимо передать список ключей: ["complex", "car"] Пример: Для того, чтобы установить значение для ключа car в словаре {"complex":{"car":"green"}, "simple":"HELLO"}, необходимо передать список ключей: ["complex", "car"]
@ -1269,8 +1219,7 @@ def GSettingsKeyListValueSet(inValue, inKeyList=None, inGSettings = None):
return True return True
def GSettingsKeyListValueGet(inKeyList=None, inGSettings = None): def GSettingsKeyListValueGet(inKeyList=None, inGSettings = None):
""" """L+,W+: Получить значение из глобального словаря настроек Оркестратора GSettings по списку ключей.
Получить значение из глобального словаря настроек Оркестратора GSettings по списку ключей.
:param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон)
:param inKeyList: Список ключей, по адресу которого получить значение из GSettings :param inKeyList: Список ключей, по адресу которого получить значение из GSettings
@ -1289,8 +1238,7 @@ def GSettingsKeyListValueGet(inKeyList=None, inGSettings = None):
return lDict.get(inKeyList[-1],None) return lDict.get(inKeyList[-1],None)
def GSettingsKeyListValueAppend(inValue, inKeyList=None, inGSettings = None): def GSettingsKeyListValueAppend(inValue, inKeyList=None, inGSettings = None):
""" """L+,W+: Применить операцию .append к обьекту, расположенному по адресу списка ключей inKeyList в глобальном словаре настроек Оркестратора GSettings. Пример: Добавить значение в конец списка (list).
Применить операцию .append к обьекту, расположенному по адресу списка ключей inKeyList в глобальном словаре настроек Оркестратора GSettings. Пример: Добавить значение в конец списка (list).
.. code-block:: python .. code-block:: python
@ -1328,8 +1276,7 @@ def GSettingsKeyListValueAppend(inValue, inKeyList=None, inGSettings = None):
return True return True
def GSettingsKeyListValueOperatorPlus(inValue, inKeyList=None, inGSettings = None): def GSettingsKeyListValueOperatorPlus(inValue, inKeyList=None, inGSettings = None):
""" """L+,W+: Применить оператор сложения (+) к обьекту, расположенному по адресу списка ключей inKeyList в глобальном словаре настроек Оркестратора GSettings. Пример: соединить 2 списка (list).
Применить оператор сложения (+) к обьекту, расположенному по адресу списка ключей inKeyList в глобальном словаре настроек Оркестратора GSettings. Пример: соединить 2 списка (list).
.. code-block:: python .. code-block:: python
@ -1370,8 +1317,7 @@ def GSettingsKeyListValueOperatorPlus(inValue, inKeyList=None, inGSettings = Non
return True return True
def StorageRobotExists(inRobotNameStr): def StorageRobotExists(inRobotNameStr):
""" """L+,W+: Проверить, существует ли ключ inRobotNameStr в хранилище пользовательской информации StorageDict (GSettings > StarageDict)
Проверить, существует ли ключ inRobotNameStr в хранилище пользовательской информации StorageDict (GSettings > StarageDict)
:param inRobotNameStr: Наименование (ключ) робота. !ВНИМАНИЕ! Наименование чувствительно к регистру :param inRobotNameStr: Наименование (ключ) робота. !ВНИМАНИЕ! Наименование чувствительно к регистру
:return: True - ключ робота присутствует в хранилище; False - отсутствует :return: True - ключ робота присутствует в хранилище; False - отсутствует
@ -1379,8 +1325,7 @@ def StorageRobotExists(inRobotNameStr):
return inRobotNameStr in GSettingsGet()["StorageDict"] return inRobotNameStr in GSettingsGet()["StorageDict"]
def StorageRobotGet(inRobotNameStr): def StorageRobotGet(inRobotNameStr):
""" """L+,W+: Получить содержимое по ключу робота inRobotNameStr в хранилище пользовательской информации StorageDict (GSettings > StarageDict)
Получить содержимое по ключу робота inRobotNameStr в хранилище пользовательской информации StorageDict (GSettings > StarageDict)
:param inRobotNameStr: Наименование (ключ) робота. !ВНИМАНИЕ! Наименование чувствительно к регистру :param inRobotNameStr: Наименование (ключ) робота. !ВНИМАНИЕ! Наименование чувствительно к регистру
:return: Значение или структура, которая расположена по адресу (GSettings > StarageDict > inRobotNameStr) :return: Значение или структура, которая расположена по адресу (GSettings > StarageDict > inRobotNameStr)
@ -1390,8 +1335,7 @@ def StorageRobotGet(inRobotNameStr):
return GSettingsGet()["StorageDict"][inRobotNameStr] return GSettingsGet()["StorageDict"][inRobotNameStr]
def ProcessorAliasDefCreate(inDef, inAliasStr=None, inGSettings = None): def ProcessorAliasDefCreate(inDef, inAliasStr=None, inGSettings = None):
""" """L+,W+: Создать синоним (текстовый ключ) для инициации выполнения функции в том случае, если запрос на выполнения пришел из вне (передача функций невозможна).
Создать синоним (текстовый ключ) для инициации выполнения функции в том случае, если запрос на выполнения пришел из вне (передача функций невозможна).
Старая версия. Новую версию см. ActivityItemDefAliasCreate Старая версия. Новую версию см. ActivityItemDefAliasCreate
@ -1417,8 +1361,7 @@ def ProcessorAliasDefCreate(inDef, inAliasStr=None, inGSettings = None):
return ActivityItemDefAliasCreate(inDef=inDef, inAliasStr=inAliasStr, inGSettings = inGSettings) return ActivityItemDefAliasCreate(inDef=inDef, inAliasStr=inAliasStr, inGSettings = inGSettings)
def ProcessorAliasDefUpdate(inDef, inAliasStr, inGSettings = None): def ProcessorAliasDefUpdate(inDef, inAliasStr, inGSettings = None):
""" """L+,W+: Обновить синоним (текстовый ключ) для инициации выполнения функции в том случае, если запрос на выполнения пришел из вне (передача функций невозможна).
Обновить синоним (текстовый ключ) для инициации выполнения функции в том случае, если запрос на выполнения пришел из вне (передача функций невозможна).
Старая версия. Новую версию см. ActivityItemDefAliasUpdate Старая версия. Новую версию см. ActivityItemDefAliasUpdate
@ -1444,8 +1387,7 @@ def ProcessorAliasDefUpdate(inDef, inAliasStr, inGSettings = None):
# ActivityItem defs # ActivityItem defs
def ActivityItemHelperDefList(inDefQueryStr=None): def ActivityItemHelperDefList(inDefQueryStr=None):
""" """L+,W+: Получить список синонимов (текстовых ключей), доступных для использования в Активностях (ActivityItem).
Получить список синонимов (текстовых ключей), доступных для использования в Активностях (ActivityItem).
:param inDefStr: Часть текстового ключ (начало / середина / конец) :param inDefStr: Часть текстового ключ (начало / середина / конец)
:return: Список доступных ключей в формате: ["ActivityItemDefAliasUpdate", "ActivityItemDefAliasCreate", etc...] :return: Список доступных ключей в формате: ["ActivityItemDefAliasUpdate", "ActivityItemDefAliasCreate", etc...]
@ -1461,8 +1403,7 @@ def ActivityItemHelperDefList(inDefQueryStr=None):
return lResultList return lResultList
def ActivityItemHelperDefAutofill(inDef): def ActivityItemHelperDefAutofill(inDef):
""" """L+,W+: Анализ аргументов функции по синониму (текстовому ключу).
Анализ аргументов функции по синониму (текстовому ключу).
:param inDef: Часть текстового ключ (начало / середина / конец) :param inDef: Часть текстового ключ (начало / середина / конец)
:return: Преднастроенная структура активности (ActivityItem) :return: Преднастроенная структура активности (ActivityItem)
@ -1500,8 +1441,7 @@ def ActivityItemHelperDefAutofill(inDef):
return lResultDict return lResultDict
def ActivityItemCreate(inDef, inArgList=None, inArgDict=None, inArgGSettingsStr=None, inArgLoggerStr=None, inGUIDStr = None, inThreadBool = False): def ActivityItemCreate(inDef, inArgList=None, inArgDict=None, inArgGSettingsStr=None, inArgLoggerStr=None, inGUIDStr = None, inThreadBool = False):
""" """L+,W+: Создать Активность (ActivityItem). Активность можно использовать в ProcessorActivityItemAppend или в Processor.ActivityListExecute или в функциях работы с Агентами.
Создать Активность (ActivityItem). Активность можно использовать в ProcessorActivityItemAppend или в Processor.ActivityListExecute или в функциях работы с Агентами.
.. code-block:: python .. code-block:: python
@ -1584,8 +1524,7 @@ def ActivityItemCreate(inDef, inArgList=None, inArgDict=None, inArgGSettingsStr=
def ActivityItemDefAliasCreate(inDef, inAliasStr=None, inGSettings = None): def ActivityItemDefAliasCreate(inDef, inAliasStr=None, inGSettings = None):
""" """L+,W+: Создать синоним (текстовый ключ) для инициации выполнения функции в том случае, если запрос на выполнения пришел из вне (передача функций невозможна).
Создать синоним (текстовый ключ) для инициации выполнения функции в том случае, если запрос на выполнения пришел из вне (передача функций невозможна).
.. code-block:: python .. code-block:: python
@ -1617,8 +1556,7 @@ def ActivityItemDefAliasCreate(inDef, inAliasStr=None, inGSettings = None):
return inAliasStr return inAliasStr
def ActivityItemDefAliasModulesLoad(): def ActivityItemDefAliasModulesLoad():
""" """L+,W+: Загрузить все функции из импортированных модулей sys.modules в ActivityItem синонимы - полезно для отладки со стороны панели управления.
Загрузить все функции из импортированных модулей sys.modules в ActivityItem синонимы - полезно для отладки со стороны панели управления.
""" """
lL = OrchestratorLoggerGet() lL = OrchestratorLoggerGet()
lL.info(f"Синонимы функций: старт инициализации sys.modules") lL.info(f"Синонимы функций: старт инициализации sys.modules")
@ -1635,8 +1573,7 @@ def ActivityItemDefAliasModulesLoad():
lL.info(f"Синонимы функций: окончание инициализации sys.modules") lL.info(f"Синонимы функций: окончание инициализации sys.modules")
def ActivityItemDefAliasUpdate(inDef, inAliasStr, inGSettings = None): def ActivityItemDefAliasUpdate(inDef, inAliasStr, inGSettings = None):
""" """L+,W+: Обновить синоним (текстовый ключ) для инициации выполнения функции в том случае, если запрос на выполнения пришел из вне (передача функций невозможна).
Обновить синоним (текстовый ключ) для инициации выполнения функции в том случае, если запрос на выполнения пришел из вне (передача функций невозможна).
.. code-block:: python .. code-block:: python
@ -1664,8 +1601,7 @@ def ActivityItemDefAliasUpdate(inDef, inAliasStr, inGSettings = None):
def ProcessorActivityItemCreate(inDef, inArgList=None, inArgDict=None, inArgGSettingsStr=None, inArgLoggerStr=None, inGUIDStr = None, inThreadBool = False): def ProcessorActivityItemCreate(inDef, inArgList=None, inArgDict=None, inArgGSettingsStr=None, inArgLoggerStr=None, inGUIDStr = None, inThreadBool = False):
""" """L+,W+: Создать Активность (ActivityItem). Активность можно использовать в ProcessorActivityItemAppend или в Processor.ActivityListExecute или в функциях работы с Агентами.
Создать Активность (ActivityItem). Активность можно использовать в ProcessorActivityItemAppend или в Processor.ActivityListExecute или в функциях работы с Агентами.
Старая версия. Новую версию см. в ActivityItemCreate Старая версия. Новую версию см. в ActivityItemCreate
@ -1736,8 +1672,7 @@ def ProcessorActivityItemCreate(inDef, inArgList=None, inArgDict=None, inArgGSet
inGUIDStr=inGUIDStr, inThreadBool=inThreadBool) inGUIDStr=inGUIDStr, inThreadBool=inThreadBool)
def ProcessorActivityItemAppend(inGSettings = None, inDef=None, inArgList=None, inArgDict=None, inArgGSettingsStr=None, inArgLoggerStr=None, inActivityItemDict=None): def ProcessorActivityItemAppend(inGSettings = None, inDef=None, inArgList=None, inArgDict=None, inArgGSettingsStr=None, inArgLoggerStr=None, inActivityItemDict=None):
""" """L+,W+: Добавить активность (ActivityItem) в процессорную очередь.
Добавить активность (ActivityItem) в процессорную очередь.
.. code-block:: python .. code-block:: python
@ -1814,8 +1749,7 @@ def ProcessorActivityItemAppend(inGSettings = None, inDef=None, inArgList=None,
## Process defs ## Process defs
def ProcessIsStarted(inProcessNameWOExeStr): # Check if process is started def ProcessIsStarted(inProcessNameWOExeStr): # Check if process is started
""" """L-,W+: Проверить, запущен ли процесс, который в наименовании содержит inProcessNameWOExeStr.
Проверить, запущен ли процесс, который в наименовании содержит inProcessNameWOExeStr.
!ВНИМАНИЕ! ПРОВЕРЯЕТ ВСЕ ПРОЦЕССЫ ОПЕРАЦИОННОЙ СИСТЕМЫ. И ДРУГИХ ПОЛЬЗОВАТЕЛЬСКИХ СЕССИЙ, ЕСЛИ ОНИ ЗАПУЩЕНЫ НА ЭТОЙ МАШИНЕ. !ВНИМАНИЕ! ПРОВЕРЯЕТ ВСЕ ПРОЦЕССЫ ОПЕРАЦИОННОЙ СИСТЕМЫ. И ДРУГИХ ПОЛЬЗОВАТЕЛЬСКИХ СЕССИЙ, ЕСЛИ ОНИ ЗАПУЩЕНЫ НА ЭТОЙ МАШИНЕ.
@ -1841,8 +1775,7 @@ def ProcessIsStarted(inProcessNameWOExeStr): # Check if process is started
return False return False
def ProcessStart(inPathStr, inArgList, inStopProcessNameWOExeStr=None): def ProcessStart(inPathStr, inArgList, inStopProcessNameWOExeStr=None):
""" """L-,W+: Запуск процесса на сессии Оркестратора, если на ОС не запущен процесс inStopProcessNameWOExeStr.
Запуск процесса на сессии Оркестратора, если на ОС не запущен процесс inStopProcessNameWOExeStr.
!ВНИМАНИЕ! ПРИ ПРОВЕРКЕ РАНЕЕ ЗАПУЩЕННЫХ ПРОЦЕССОВ ПРОВЕРЯЕТ ВСЕ ПРОЦЕССЫ ОПЕРАЦИОННОЙ СИСТЕМЫ. И ДРУГИХ ПОЛЬЗОВАТЕЛЬСКИХ СЕССИЙ, ЕСЛИ ОНИ ЗАПУЩЕНЫ НА ЭТОЙ МАШИНЕ. !ВНИМАНИЕ! ПРИ ПРОВЕРКЕ РАНЕЕ ЗАПУЩЕННЫХ ПРОЦЕССОВ ПРОВЕРЯЕТ ВСЕ ПРОЦЕССЫ ОПЕРАЦИОННОЙ СИСТЕМЫ. И ДРУГИХ ПОЛЬЗОВАТЕЛЬСКИХ СЕССИЙ, ЕСЛИ ОНИ ЗАПУЩЕНЫ НА ЭТОЙ МАШИНЕ.
@ -1879,8 +1812,7 @@ def ProcessStart(inPathStr, inArgList, inStopProcessNameWOExeStr=None):
subprocess.Popen(lItemArgs,shell=True) subprocess.Popen(lItemArgs,shell=True)
def ProcessStop(inProcessNameWOExeStr, inCloseForceBool, inUserNameStr = "%username%"): def ProcessStop(inProcessNameWOExeStr, inCloseForceBool, inUserNameStr = "%username%"):
""" """L-,W+: Остановить процесс на ОС, где работает Оркестратор, под учетной записью inUserNameStr.
Остановить процесс на ОС, где работает Оркестратор, под учетной записью inUserNameStr.
.. code-block:: python .. code-block:: python
@ -1915,8 +1847,7 @@ def ProcessStop(inProcessNameWOExeStr, inCloseForceBool, inUserNameStr = "%usern
os.system(lActivityCloseCommand) os.system(lActivityCloseCommand)
def ProcessListGet(inProcessNameWOExeList=None): def ProcessListGet(inProcessNameWOExeList=None):
""" """L-,W+: Вернуть список процессов, запущенных на ОС, где работает Оркестратор. В списке отсортировать процессы по количеству используемой оперативной памяти. Также можно указать перечень процессов, которые интересуют - функция будет показывать активные из них.
Вернуть список процессов, запущенных на ОС, где работает Оркестратор. В списке отсортировать процессы по количеству используемой оперативной памяти. Также можно указать перечень процессов, которые интересуют - функция будет показывать активные из них.
!ВНИМАНИЕ! ДЛЯ ПОЛУЧЕНИЯ СПИСКА ВСЕХ ПРОЦЕССОВ ОС НЕОБХОДИМО ЗАПУСКАТЬ ОРКЕСТРАТОР С ПРАВАМИ АДМИНИСТРАТОРА. !ВНИМАНИЕ! ДЛЯ ПОЛУЧЕНИЯ СПИСКА ВСЕХ ПРОЦЕССОВ ОС НЕОБХОДИМО ЗАПУСКАТЬ ОРКЕСТРАТОР С ПРАВАМИ АДМИНИСТРАТОРА.
@ -1975,8 +1906,7 @@ def ProcessListGet(inProcessNameWOExeList=None):
def ProcessDefIntervalCall(inDef, inIntervalSecFloat, inIntervalAsyncBool=False, inDefArgList=None, inDefArgDict=None, inDefArgGSettingsNameStr=None, inDefArgLoggerNameStr=None, inExecuteInNewThreadBool=True, inLogger=None, inGSettings = None): def ProcessDefIntervalCall(inDef, inIntervalSecFloat, inIntervalAsyncBool=False, inDefArgList=None, inDefArgDict=None, inDefArgGSettingsNameStr=None, inDefArgLoggerNameStr=None, inExecuteInNewThreadBool=True, inLogger=None, inGSettings = None):
""" """L+,W+: Периодический вызов функции Python.
Периодический вызов функции Python.
:param inDef: Функция Python, которую потребуется периодически вызывать :param inDef: Функция Python, которую потребуется периодически вызывать
:param inIntervalSecFloat: Интервал между вызовами функции в сек. :param inIntervalSecFloat: Интервал между вызовами функции в сек.
@ -1998,11 +1928,11 @@ def ProcessDefIntervalCall(inDef, inIntervalSecFloat, inIntervalAsyncBool=False,
if inDefArgLoggerNameStr=="": inDefArgLoggerNameStr=None if inDefArgLoggerNameStr=="": inDefArgLoggerNameStr=None
if inDefArgGSettingsNameStr=="": inDefArgGSettingsNameStr=None if inDefArgGSettingsNameStr=="": inDefArgGSettingsNameStr=None
if inDefArgLoggerNameStr is not None and not inLogger: if inDefArgLoggerNameStr is not None and not inLogger:
raise Exception(f"!ERROR! ProcessDefIntervalCall - You need to send logger in def because your def is require logger. Raise error!") raise Exception(f"__Orchestrator__.ProcessDefIntervalCall: Вызываемая функция требует передачи логгера, а он не указан")
# Check thread # Check thread
if not Core.IsProcessorThread(inGSettings=inGSettings): if not Core.IsProcessorThread(inGSettings=inGSettings):
if inGSettings["Logger"]: inGSettings["Logger"].warning(f"__Orchestrator__.ProcessDefIntervalCall def was called not from processor queue - activity will be append in the processor queue.") if inGSettings["Logger"]: inGSettings["Logger"].warning(f"__Orchestrator__.ProcessDefIntervalCall: функция вызвана не из процессорной очереди - активность будет перемещена в процессорную очередь")
lProcessorActivityDict = { lProcessorActivityDict = {
"Def": ProcessDefIntervalCall, # def link or def alias (look gSettings["Processor"]["AliasDefDict"]) "Def": ProcessDefIntervalCall, # def link or def alias (look gSettings["Processor"]["AliasDefDict"])
"ArgList": [], # Args list "ArgList": [], # Args list
@ -2055,8 +1985,7 @@ def ProcessDefIntervalCall(inDef, inIntervalSecFloat, inIntervalAsyncBool=False,
# Python def - start module function # Python def - start module function
def PythonStart(inModulePathStr, inDefNameStr, inArgList=None, inArgDict=None, inLogger = None): def PythonStart(inModulePathStr, inDefNameStr, inArgList=None, inArgDict=None, inLogger = None):
""" """L+,W+: Импорт модуля и выполнение функции в процессе Оркестратора.
Импорт модуля и выполнение функции в процессе Оркестратора.
.. note:: .. note::
@ -2078,6 +2007,7 @@ def PythonStart(inModulePathStr, inDefNameStr, inArgList=None, inArgDict=None, i
:param inArgDict: Словарь (dict) именованных аргументов для передачи в функцию. По умолчанию None :param inArgDict: Словарь (dict) именованных аргументов для передачи в функцию. По умолчанию None
:param inLogger: Логгер для фиксации сообщений выполнения функции (опционально) :param inLogger: Логгер для фиксации сообщений выполнения функции (опционально)
""" """
inModulePathStr=CrossOS.PathStr(inPathStr=inModulePathStr)
if inLogger is None: inLogger = OrchestratorLoggerGet() if inLogger is None: inLogger = OrchestratorLoggerGet()
if inArgList is None: inArgList=[] if inArgList is None: inArgList=[]
if inArgDict is None: inArgDict={} if inArgDict is None: inArgDict={}
@ -2092,8 +2022,7 @@ def PythonStart(inModulePathStr, inDefNameStr, inArgList=None, inArgDict=None, i
# Scheduler # Scheduler
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
def SchedulerActivityTimeAddWeekly(inTimeHHMMStr="23:55:", inWeekdayList=None, inActivityList=None, inGSettings = None): def SchedulerActivityTimeAddWeekly(inTimeHHMMStr="23:55:", inWeekdayList=None, inActivityList=None, inGSettings = None):
""" """L+,W+: Добавить активность по расписанию. Допускается указание времени и дней недели, в которые производить запуск.
Добавить активность по расписанию. Допускается указание времени и дней недели, в которые производить запуск.
.. code-block:: python .. code-block:: python
@ -2139,8 +2068,7 @@ def SchedulerActivityTimeAddWeekly(inTimeHHMMStr="23:55:", inWeekdayList=None, i
def RDPTemplateCreate(inLoginStr, inPasswordStr, inHostStr="127.0.0.1", inPortInt = 3389, inWidthPXInt = 1680, inHeightPXInt = 1050, def RDPTemplateCreate(inLoginStr, inPasswordStr, inHostStr="127.0.0.1", inPortInt = 3389, inWidthPXInt = 1680, inHeightPXInt = 1050,
inUseBothMonitorBool = False, inDepthBitInt = 32, inSharedDriveList=None, inRedirectClipboardBool=True): inUseBothMonitorBool = False, inDepthBitInt = 32, inSharedDriveList=None, inRedirectClipboardBool=True):
""" """L-,W+: Создать шаблон подключения RDP (dict). Данный шаблон далее можно использовать в Orchestrator.RDPSessionConnect
Создать шаблон подключения RDP (dict). Данный шаблон далее можно использовать в Orchestrator.RDPSessionConnect
.. code-block:: python .. code-block:: python
@ -2226,8 +2154,7 @@ def RDPSessionDublicatesResolve(inGSettings):
# lItemDict = inGSettings["RobotRDPActive"]["RDPList"][lItemKeyStr] # lItemDict = inGSettings["RobotRDPActive"]["RDPList"][lItemKeyStr]
def RDPSessionConnect(inRDPSessionKeyStr, inRDPTemplateDict=None, inHostStr=None, inPortStr=None, inLoginStr=None, inPasswordStr=None, inGSettings = None, inRedirectClipboardBool=True): def RDPSessionConnect(inRDPSessionKeyStr, inRDPTemplateDict=None, inHostStr=None, inPortStr=None, inLoginStr=None, inPasswordStr=None, inGSettings = None, inRedirectClipboardBool=True):
""" """L-,W+: Выполнить подключение к RDP и следить за стабильностью соединения со стороны Оркестратора.
Выполнить подключение к RDP и следить за стабильностью соединения со стороны Оркестратора.
!ВНИМАНИЕ! - Подключение будет проигнорировано, если соединение по таком RDP ключу уже было инициализировано ранее. !ВНИМАНИЕ! - Подключение будет проигнорировано, если соединение по таком RDP ключу уже было инициализировано ранее.
2 способа использования функции: 2 способа использования функции:
@ -2288,8 +2215,7 @@ def RDPSessionConnect(inRDPSessionKeyStr, inRDPTemplateDict=None, inHostStr=None
return True return True
def RDPSessionDisconnect(inRDPSessionKeyStr, inBreakTriggerProcessWOExeList = None, inGSettings = None): def RDPSessionDisconnect(inRDPSessionKeyStr, inBreakTriggerProcessWOExeList = None, inGSettings = None):
""" """L-,W+: Выполнить отключение RDP сессии и прекратить мониторить его активность.
Выполнить отключение RDP сессии и прекратить мониторить его активность.
.. code-block:: python .. code-block:: python
@ -2331,8 +2257,7 @@ def RDPSessionDisconnect(inRDPSessionKeyStr, inBreakTriggerProcessWOExeList = No
return True return True
def RDPSessionReconnect(inRDPSessionKeyStr, inRDPTemplateDict=None, inGSettings = None): def RDPSessionReconnect(inRDPSessionKeyStr, inRDPTemplateDict=None, inGSettings = None):
""" """L-,W+: Выполнить переподключение RDP сессии и продолжить мониторить его активность.
Выполнить переподключение RDP сессии и продолжить мониторить его активность.
.. code-block:: python .. code-block:: python
@ -2377,8 +2302,7 @@ def RDPSessionReconnect(inRDPSessionKeyStr, inRDPTemplateDict=None, inGSettings
return True return True
def RDPSessionMonitorStop(inRDPSessionKeyStr, inGSettings = None): def RDPSessionMonitorStop(inRDPSessionKeyStr, inGSettings = None):
""" """L-,W+: Прекратить мониторить активность RDP соединения со стороны Оркестратора. Данная функция не уничтожает активное RDP соединение.
Прекратить мониторить активность RDP соединения со стороны Оркестратора. Данная функция не уничтожает активное RDP соединение.
.. code-block:: python .. code-block:: python
@ -2399,8 +2323,7 @@ def RDPSessionMonitorStop(inRDPSessionKeyStr, inGSettings = None):
return lResult return lResult
def RDPSessionLogoff(inRDPSessionKeyStr, inBreakTriggerProcessWOExeList = None, inGSettings = None): def RDPSessionLogoff(inRDPSessionKeyStr, inBreakTriggerProcessWOExeList = None, inGSettings = None):
""" """L-,W+: Выполнить отключение (logoff) на RDP сессии и прекратить мониторить активность со стороны Оркестратора.
Выполнить отключение (logoff) на RDP сессии и прекратить мониторить активность со стороны Оркестратора.
.. code-block:: python .. code-block:: python
@ -2485,8 +2408,7 @@ def RDPSessionResponsibilityCheck(inRDPSessionKeyStr, inGSettings = None):
return True return True
def RDPSessionProcessStartIfNotRunning(inRDPSessionKeyStr, inProcessNameWEXEStr, inFilePathStr, inFlagGetAbsPathBool=True, inGSettings = None): def RDPSessionProcessStartIfNotRunning(inRDPSessionKeyStr, inProcessNameWEXEStr, inFilePathStr, inFlagGetAbsPathBool=True, inGSettings = None):
""" """L-,W+: Выполнить запуск процесса на RDP сессии через графические UI инструменты (без Агента).
Выполнить запуск процесса на RDP сессии через графические UI инструменты (без Агента).
!ВНИМАНИЕ! Данная функция может работать нестабильно из-за использования графических элементов UI при работе с RDP. Мы рекомендуем использовать конструкцию взаимодействия Оркестратора с Агентом. !ВНИМАНИЕ! Данная функция может работать нестабильно из-за использования графических элементов UI при работе с RDP. Мы рекомендуем использовать конструкцию взаимодействия Оркестратора с Агентом.
@ -2533,8 +2455,7 @@ def RDPSessionProcessStartIfNotRunning(inRDPSessionKeyStr, inProcessNameWEXEStr,
return lResult return lResult
def RDPSessionCMDRun(inRDPSessionKeyStr, inCMDStr, inModeStr="CROSSCHECK", inGSettings = None): def RDPSessionCMDRun(inRDPSessionKeyStr, inCMDStr, inModeStr="CROSSCHECK", inGSettings = None):
""" """L-,W+: Отправить CMD команду на удаленную сесиию через RDP окно (без Агента).
Отправить CMD команду на удаленную сесиию через RDP окно (без Агента).
!ВНИМАНИЕ! Данная функция может работать нестабильно из-за использования графических элементов UI при работе с RDP. Мы рекомендуем использовать конструкцию взаимодействия Оркестратора с Агентом. !ВНИМАНИЕ! Данная функция может работать нестабильно из-за использования графических элементов UI при работе с RDP. Мы рекомендуем использовать конструкцию взаимодействия Оркестратора с Агентом.
@ -2589,8 +2510,7 @@ def RDPSessionCMDRun(inRDPSessionKeyStr, inCMDStr, inModeStr="CROSSCHECK", inGSe
return lResult return lResult
def RDPSessionProcessStop(inRDPSessionKeyStr, inProcessNameWEXEStr, inFlagForceCloseBool, inGSettings = None): def RDPSessionProcessStop(inRDPSessionKeyStr, inProcessNameWEXEStr, inFlagForceCloseBool, inGSettings = None):
""" """L-,W+: Отправка CMD команды в RDP окне на остановку процесса (без Агента).
Отправка CMD команды в RDP окне на остановку процесса (без Агента).
!ВНИМАНИЕ! Данная функция может работать нестабильно из-за использования графических элементов UI при работе с RDP. Мы рекомендуем использовать конструкцию взаимодействия Оркестратора с Агентом. !ВНИМАНИЕ! Данная функция может работать нестабильно из-за использования графических элементов UI при работе с RDP. Мы рекомендуем использовать конструкцию взаимодействия Оркестратора с Агентом.
@ -2637,8 +2557,7 @@ def RDPSessionProcessStop(inRDPSessionKeyStr, inProcessNameWEXEStr, inFlagForceC
return lResult return lResult
def RDPSessionFileStoredSend(inRDPSessionKeyStr, inHostFilePathStr, inRDPFilePathStr, inGSettings = None): def RDPSessionFileStoredSend(inRDPSessionKeyStr, inHostFilePathStr, inRDPFilePathStr, inGSettings = None):
""" """L-,W+: Отправка файла со стороны Оркестратора на сторону RDP сессии через UI инструменты RDP окна (без Агента).
Отправка файла со стороны Оркестратора на сторону RDP сессии через UI инструменты RDP окна (без Агента).
!ВНИМАНИЕ! Данная функция может работать нестабильно из-за использования графических элементов UI при работе с RDP. Мы рекомендуем использовать конструкцию взаимодействия Оркестратора с Агентом. !ВНИМАНИЕ! Данная функция может работать нестабильно из-за использования графических элементов UI при работе с RDP. Мы рекомендуем использовать конструкцию взаимодействия Оркестратора с Агентом.
@ -2685,8 +2604,7 @@ def RDPSessionFileStoredSend(inRDPSessionKeyStr, inHostFilePathStr, inRDPFilePat
return lResult return lResult
def RDPSessionFileStoredRecieve(inRDPSessionKeyStr, inRDPFilePathStr, inHostFilePathStr, inGSettings = None): def RDPSessionFileStoredRecieve(inRDPSessionKeyStr, inRDPFilePathStr, inHostFilePathStr, inGSettings = None):
""" """L-,W+: Получение файла со стороны RDP сессии на сторону Оркестратора через UI инструменты RDP окна (без Агента).
Получение файла со стороны RDP сессии на сторону Оркестратора через UI инструменты RDP окна (без Агента).
!ВНИМАНИЕ! Данная функция может работать нестабильно из-за использования графических элементов UI при работе с RDP. Мы рекомендуем использовать конструкцию взаимодействия Оркестратора с Агентом. !ВНИМАНИЕ! Данная функция может работать нестабильно из-за использования графических элементов UI при работе с RDP. Мы рекомендуем использовать конструкцию взаимодействия Оркестратора с Агентом.
@ -2768,8 +2686,7 @@ def Start(inDumpRestoreBool = True, inRunAsAdministratorBool = True):
Orchestrator(inDumpRestoreBool = True, inRunAsAdministratorBool = True) Orchestrator(inDumpRestoreBool = True, inRunAsAdministratorBool = True)
def Orchestrator(inGSettings=None, inDumpRestoreBool = True, inRunAsAdministratorBool = True): def Orchestrator(inGSettings=None, inDumpRestoreBool = True, inRunAsAdministratorBool = True):
""" """L+,W+: Инициализация ядра Оркестратора (всех потоков)
Инициализация ядра Оркестратора (всех потоков)
:param inGSettings: Глобальный словарь настроек Оркестратора (синглтон) :param inGSettings: Глобальный словарь настроек Оркестратора (синглтон)
:param inDumpRestoreBool: True - Восстановить информацию о RDP сессиях и StorageDict; False - не восстанавливать :param inDumpRestoreBool: True - Восстановить информацию о RDP сессиях и StorageDict; False - не восстанавливать

Loading…
Cancel
Save