@ -106,14 +106,15 @@ def AgentActivityItemReturnExists(inGUIDStr, inGSettings = None):
def AgentActivityItemReturnGet ( inGUIDStr , inCheckIntervalSecFloat = 0.5 , inGSettings = None ) :
"""
Work synchroniously ! Wait while result will be recieved . Get the result of the ActivityItem execution on the Agent side . Before this please check by the def AgentActivityItemReturnExists that result has come to the Orchestrator
Ожидает появления результата по активности ( ActivityItem ) . Возвращает результат выполнения активности .
! ATTENTION ! Use only after Orchestrator initialization ! Before orchestrator init exception will be raised .
! ВНИМАНИЕ ! Замораживает поток , пока не будет получен результат .
! ВНИМАНИЕ ! Запускать следует после того как будет инициализировано ядро Оркестратора ( см . функцию OrchestratorInitWait ) , иначе будет инициирована ошибка .
: param inGSettings : Глобальный словарь настроек Оркестратора ( синглтон )
: param inGUIDStr : ГУИД ( GUID ) активности ( ActivityItem )
: param inCheckIntervalSecFloat : Interval in sec of the check Activity Item result
: return : Result of the ActivityItem executed on the Agent side anr transmitted to the Orchestrator . IMPORTANT ! ONLY JSON ENABLED Types CAN BE TRANSMITTED TO ORCHESTRATOR !
: param inCheckIntervalSecFloat : Интервал в секундах , с какой частотой выполнять проверку результата . По умолчанию 0.5
: return : Результат выполнения активности . ! ВНИМАНИЕ ! Возвращаются только то результаты , которые могут быть интерпретированы в JSON формате .
"""
inGSettings = GSettingsGet ( inGSettings = inGSettings ) # Set the global settings
#Check if Orchestrator has been initialized - else raise exception
@ -128,17 +129,17 @@ def AgentActivityItemReturnGet(inGUIDStr, inCheckIntervalSecFloat = 0.5, inGSett
def AgentOSCMD ( inHostNameStr , inUserStr , inCMDStr , inRunAsyncBool = True , inSendOutputToOrchestratorLogsBool = True , inCMDEncodingStr = " cp1251 " , inGSettings = None , inCaptureBool = True ) :
"""
Send CMD to OS thought the pyOpenRPA . Agent daemon . Result return to log + Orchestrator by the A2O connection
Отправка команды командной строки на сессию , где работает pyOpenRPA . Agent . Результат выполнения команды можно выводить в лог оркестратора .
: param inGSettings : Глобальный словарь настроек Оркестратора ( синглтон )
: param inHostNameStr : Наименование хоста , на котором запущен Агент . Наименования подключенных агентов доступно для просмотра в панели управления
: param inUserStr : Наименование пользователя , на графической сессии которого запущен Агент . Наименования подключенных агентов доступно для просмотра в панели управления
: 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 inSendOutputToOrchestratorLogsBool : True - catch cmd execution output and send it to the Orchestrator logs ; Flase - else case ; Default True
: param inCMDEncodingStr : Set the encoding of the DOS window on the Agent server session . Windows is beautiful : ) . Default is " cp1251 " early was " cp866 " - need test
: param inCaptureBool : ! ATTENTION ! If you need to start absolutely encapsulated app - set this flag as False . If you set True - the app output will come to Agent
: return : GUID String of the ActivityItem - you can wait ( sync or async ) result by this guid !
: param inCMDStr : Команда для исполнения на стороне сессии Агента
: param inRunAsyncBool : True - Агент не ожидает окончания выполнения команды . ! ВНИМАНИЕ ! Логирование в такой ситуации будет невозможно ; False - Агент ожидает окончания выполнения операции .
: param inSendOutputToOrchestratorLogsBool : True - отправлять весь вывод от команды в логи Оркестратора ; Flase - Н е отправлять ; Default True
: param inCMDEncodingStr : Кодировка DOS среды , в которой исполняется команда . Если некорректно установить кодировку - русские символы будут испорчены . По умолчанию установлена " cp1251 "
: param inCaptureBool : True - не запускать приложение как отдельное . Результат выполнения команды будет выводиться в окне Агента ( если окно Агента присутствует на экране ) . False - команда будет запущена в отдельном DOS окне .
: return : ГУИД ( GUID ) строка Активности ( ActivityItem ) . Далее можно ожидать результат этой функции по ГУИД с помощью функции AgentActivityItemReturnGet
"""
inGSettings = GSettingsGet ( inGSettings = inGSettings ) # Set the global settings
lActivityItemDict = {
@ -153,9 +154,11 @@ def AgentOSCMD(inHostNameStr, inUserStr, inCMDStr, inRunAsyncBool=True, inSendOu
def AgentOSLogoff ( inHostNameStr , inUserStr ) :
"""
Logoff the agent user session
Выполнить операцию logoff на стороне пользователя .
: return : GUID String of the ActivityItem - you can wait ( sync or async ) result by this guid !
: param inHostNameStr : Наименование хоста , на котором запущен Агент . Наименования подключенных агентов доступно для просмотра в панели управления
: param inUserStr : Наименование пользователя , на графической сессии которого запущен Агент . Наименования подключенных агентов доступно для просмотра в панели управления
: return : ГУИД ( GUID ) строка Активности ( ActivityItem ) . Далее можно ожидать результат этой функции по ГУИД с помощью функции AgentActivityItemReturnGet
"""
inGSettings = GSettingsGet ( ) # Set the global settings
lCMDStr = " shutdown /l "
@ -171,16 +174,17 @@ def AgentOSLogoff(inHostNameStr, inUserStr):
def AgentOSFileSend ( inHostNameStr , inUserStr , inOrchestratorFilePathStr , inAgentFilePathStr , inGSettings = None ) :
"""
Send the file from the Orchestrator to Agent ( synchroniously ) pyOpenRPA . Agent daemon process ( safe for JSON transmition ) .
Work safety with big files
Thread safe - you can call def even if you dont init the orchestrator - def will be executed later
Отправить файл по адресу inOrchestratorFilePathStr с о стороны Оркестратора и сохранить по адресу inAgentFilePathStr на стороне Агента .
Поддерживает передачу крупных файлов ( более 2 - х Гб . ) . Функция является синхронной - не закончит свое выполнение , пока файл не будет передан полностью .
! ВНИМАНИЕ - ПОТОКОБЕЗОПАСНАЯ ! Вы можете вызвать эту функцию до инициализации ядра Оркестратора . Оркестратор добавит эту функцию в процессорную очередь на исполение . Если вам нужен результат функции , то необходимо сначала убедиться в том , что ядро Оркестратора было инициализированно ( см . функцию OrchestratorInitWait ) .
: param inGSettings : Глобальный словарь настроек Оркестратора ( синглтон )
: param inHostNameStr : Наименование хоста , на котором запущен Агент . Наименования подключенных агентов доступно для просмотра в панели управления
: param inUserStr : Наименование пользователя , на графической сессии которого запущен Агент . Наименования подключенных агентов доступно для просмотра в панели управления
: param inFilePathStr :
: param inFileDataBytes :
: return : GUID String of the ActivityItem - you can wait ( sync or async ) result by this guid !
: param inOrchestratorFilePathStr : Полный путь к передаваемому файлу на стороне Оркестратора .
: param inAgentFilePathStr : Полный путь к локации , в которую требуется сохранить передаваемый файл .
: param inGSettings : Глобальный словарь настроек Оркестратора ( синглтон )
: return : ГУИД ( GUID ) строка Активности ( ActivityItem ) . Далее можно ожидать результат этой функции по ГУИД с помощью функции AgentActivityItemReturnGet
"""
inGSettings = GSettingsGet ( inGSettings = inGSettings ) # Set the global settings
@ -237,14 +241,14 @@ def AgentOSFileSend(inHostNameStr, inUserStr, inOrchestratorFilePathStr, inAgent
def AgentOSFileBinaryDataBytesCreate ( inHostNameStr , inUserStr , inFilePathStr , inFileDataBytes , inGSettings = None ) :
"""
Create binary file by the base64 string by the pyOpenRPA . Agent daemon process ( safe for JSON transmition )
Создать бинарный файл , который будет расположен по адресу inFilePathStr на стороне Агента с содержимым inFileDataBytes
: param inGSettings : Глобальный словарь настроек Оркестратора ( синглтон )
: param inHostNameStr : Наименование хоста , на котором запущен Агент . Наименования подключенных агентов доступно для просмотра в панели управления
: param inUserStr : Наименование пользователя , на графической сессии которого запущен Агент . Наименования подключенных агентов доступно для просмотра в панели управления
: param inFilePathStr :
: param inFileDataBytes :
: return : GUID String of the ActivityItem - you can wait ( sync or async ) result by this guid !
: param inFilePathStr : Полный путь к сохраняемому файлу на стороне Агента .
: param inFileDataBytes : Строка байт ( b ' ' ) для отправки в создаваемый файл на стороне Агента .
: param inGSettings : Глобальный словарь настроек Оркестратора ( синглтон )
: return : ГУИД ( GUID ) строка Активности ( ActivityItem ) . Далее можно ожидать результат этой функции по ГУИД с помощью функции AgentActivityItemReturnGet
"""
inGSettings = GSettingsGet ( inGSettings = inGSettings ) # Set the global settings
lFileDataBase64Str = base64 . b64encode ( inFileDataBytes ) . decode ( " utf-8 " )
@ -261,14 +265,14 @@ def AgentOSFileBinaryDataBytesCreate(inHostNameStr, inUserStr, inFilePathStr, in
def AgentOSFileBinaryDataBase64StrCreate ( inHostNameStr , inUserStr , inFilePathStr , inFileDataBase64Str , inGSettings = None ) :
"""
Create binary file by the base64 string by the pyOpenRPA . Agent daemon process ( safe for JSON transmission )
Создать бинарный файл , который будет расположен по адресу inFilePathStr на стороне Агента с содержимым , декодированным с формата base64 : inFileDataBase64Str
: param inGSettings : Глобальный словарь настроек Оркестратора ( синглтон )
: param inHostNameStr : Наименование хоста , на котором запущен Агент . Наименования подключенных агентов доступно для просмотра в панели управления
: param inUserStr : Наименование пользователя , на графической сессии которого запущен Агент . Наименования подключенных агентов доступно для просмотра в панели управления
: param inFilePathStr :
: param inFileDataBase64Str :
: return : GUID String of the ActivityItem - you can wait ( sync or async ) result by this guid !
: param inFilePathStr : Полный путь к сохраняемому файлу на стороне Агента .
: param inFileDataBase64Str : Строка в формате base64 для отправки в создаваемый файл на стороне Агента .
: param inGSettings : Глобальный словарь настроек Оркестратора ( синглтон )
: return : ГУИД ( GUID ) строка Активности ( ActivityItem ) . Далее можно ожидать результат этой функции по ГУИД с помощью функции AgentActivityItemReturnGet
"""
inGSettings = GSettingsGet ( inGSettings = inGSettings ) # Set the global settings
lActivityItemDict = {
@ -284,14 +288,14 @@ def AgentOSFileBinaryDataBase64StrCreate(inHostNameStr, inUserStr, inFilePathStr
def AgentOSFileBinaryDataBase64StrAppend ( inHostNameStr , inUserStr , inFilePathStr , inFileDataBase64Str , inGSettings = None ) :
"""
Append binary file by the base64 string by the pyOpenRPA . Agent daemon process ( safe for JSON transmission )
Добавить бинарную информацию в существующий бинарный файл , который будет расположен по адресу inFilePathStr на стороне Агента с содержимым , декодированным с формата base64 : inFileDataBase64Str
: param inGSettings : Глобальный словарь настроек Оркестратора ( синглтон )
: param inHostNameStr : Наименование хоста , на котором запущен Агент . Наименования подключенных агентов доступно для просмотра в панели управления
: param inUserStr : Наименование пользователя , на графической сессии которого запущен Агент . Наименования подключенных агентов доступно для просмотра в панели управления
: param inFilePathStr :
: param inFileDataBase64Str :
: return : GUID String of the ActivityItem - you can wait ( sync or async ) result by this guid !
: param inFilePathStr : Полный путь к сохраняемому файлу на стороне Агента .
: param inFileDataBase64Str : Строка в формате base64 для отправки в создаваемый файл на стороне Агента .
: param inGSettings : Глобальный словарь настроек Оркестратора ( синглтон )
: return : ГУИД ( GUID ) строка Активности ( ActivityItem ) . Далее можно ожидать результат этой функции по ГУИД с помощью функции AgentActivityItemReturnGet
"""
inGSettings = GSettingsGet ( inGSettings = inGSettings ) # Set the global settings
lActivityItemDict = {
@ -308,15 +312,15 @@ def AgentOSFileBinaryDataBase64StrAppend(inHostNameStr, inUserStr, inFilePathStr
# Send text file to Agent (string)
def AgentOSFileTextDataStrCreate ( inHostNameStr , inUserStr , inFilePathStr , inFileDataStr , inEncodingStr = " utf-8 " , inGSettings = None ) :
"""
Create text file by the string by the pyOpenRPA . Agent daemon process
Создать текстовый файл , который будет расположен по адресу inFilePathStr на стороне Агента с содержимым inFileDataStr в кодировке inEncodingStr
: param inGSettings : Глобальный словарь настроек Оркестратора ( синглтон )
: param inHostNameStr : Наименование хоста , на котором запущен Агент . Наименования подключенных агентов доступно для просмотра в панели управления
: param inUserStr : Наименование пользователя , на графической сессии которого запущен Агент . Наименования подключенных агентов доступно для просмотра в панели управления
: param inFilePathStr :
: param inFileDataStr :
: param inEncodingStr :
: return : GUID String of the ActivityItem - you can wait ( sync or async ) result by this guid !
: param inFilePathStr : Полный путь к сохраняемому файлу на стороне Агента .
: param inFileDataStr : Строка для отправки в создаваемый файл на стороне Агента .
: param inEncodingStr : Кодировка текстового файла . По умолчанию utf - 8
: param inGSettings : Глобальный словарь настроек Оркестратора ( синглтон )
: return : ГУИД ( GUID ) строка Активности ( ActivityItem ) . Далее можно ожидать результат этой функции по ГУИД с помощью функции AgentActivityItemReturnGet
"""
inGSettings = GSettingsGet ( inGSettings = inGSettings ) # Set the global settings
lActivityItemDict = {
@ -331,13 +335,13 @@ def AgentOSFileTextDataStrCreate(inHostNameStr, inUserStr, inFilePathStr, inFile
def AgentOSFileBinaryDataBase64StrReceive ( inHostNameStr , inUserStr , inFilePathStr , inGSettings = None ) :
"""
Read binary file and encode in base64 to transmit ( safe for JSON transmition )
Выполнить чтение бинарного файла и получить содержимое в формате base64 ( строка )
: param inGSettings : Глобальный словарь настроек Оркестратора ( синглтон )
: param inHostNameStr : Наименование хоста , на котором запущен Агент . Наименования подключенных агентов доступно для просмотра в панели управления
: param inUserStr : Наименование пользователя , на графической сессии которого запущен Агент . Наименования подключенных агентов доступно для просмотра в панели управления
: param inFilePathStr : File path to read
: return : GUID String of the ActivityItem - you can wait ( sync or async ) result by this guid !
: param inFilePathStr : Путь к бинарному файлу на чтение на стороне Агента
: param inGSettings : Глобальный словарь настроек Оркестратора ( синглтон )
: return : ГУИД ( GUID ) строка Активности ( ActivityItem ) . Далее можно ожидать результат этой функции по ГУИД с помощью функции AgentActivityItemReturnGet
"""
inGSettings = GSettingsGet ( inGSettings = inGSettings ) # Set the global settings
lActivityItemDict = {
@ -353,13 +357,14 @@ def AgentOSFileBinaryDataBase64StrReceive(inHostNameStr, inUserStr, inFilePathSt
def AgentOSFileBinaryDataReceive ( inHostNameStr , inUserStr , inFilePathStr ) :
"""
Read binary file from agent ( synchronious )
Чтение бинарного файла на стороне Агента по адресу inFilePathStr .
! ВНИМАНИЕ - СИНХРОННАЯ ! Функция не завершится , пока не будет получен результат чтения на стороне Агента .
: param inGSettings : Глобальный словарь настроек Оркестратора ( синглтон )
: param inHostNameStr : Наименование хоста , на котором запущен Агент . Наименования подключенных агентов доступно для просмотра в панели управления
: param inUserStr : Наименование пользователя , на графической сессии которого запущен Агент . Наименования подключенных агентов доступно для просмотра в панели управления
: param inFilePathStr : File path to read
: return : file data bytes
: param inFilePathStr : Путь к бинарному файлу , который требуется прочитать на стороне Агента
: return : Строка байт ( b ' ' ) - содержимое бинарного файла
"""
lFileDataBytes = None
inGSettings = GSettingsGet ( ) # Set the global settings
@ -391,14 +396,16 @@ def AgentOSFileBinaryDataReceive(inHostNameStr, inUserStr, inFilePathStr):
def AgentOSFileTextDataStrReceive ( inHostNameStr , inUserStr , inFilePathStr , inEncodingStr = " utf-8 " , inGSettings = None ) :
"""
Read text file in the agent GUI session
Чтение текстового файла на стороне Агента по адресу inFilePathStr . По ГИУД с помощью функции AgentActivityItemReturnGet можно будет получить текстовую строку данных , которые были расположены в файле .
! ВНИМАНИЕ - АСИНХРОННАЯ ! Функция завершится сразу , не дожидаясь окончания выполнения операции на стороне Агента .
: param inGSettings : Глобальный словарь настроек Оркестратора ( синглтон )
: param inHostNameStr : Наименование хоста , на котором запущен Агент . Наименования подключенных агентов доступно для просмотра в панели управления
: param inUserStr : Наименование пользователя , на графической сессии которого запущен Агент . Наименования подключенных агентов доступно для просмотра в панели управления
: param inFilePathStr : File path to read
: param inEncodingStr : Text file encoding . Default ' utf-8 '
: return : GUID String of the ActivityItem - you can wait ( sync or async ) result by this guid !
: param inFilePathStr : Путь к бинарному файлу , который требуется прочитать на стороне Агента
: param inEncodingStr : Кодировка текстового файла . По умолчанию utf - 8
: param inGSettings : Глобальный словарь настроек Оркестратора ( синглтон )
: return : ГУИД ( GUID ) строка Активности ( ActivityItem ) . Далее можно ожидать результат этой функции по ГУИД с помощью функции AgentActivityItemReturnGet
"""
inGSettings = GSettingsGet ( inGSettings = inGSettings ) # Set the global settings
lActivityItemDict = {
@ -413,12 +420,14 @@ def AgentOSFileTextDataStrReceive(inHostNameStr, inUserStr, inFilePathStr, inEnc
def AgentProcessWOExeUpperUserListGet ( inHostNameStr , inUserStr , inGSettings = None ) :
"""
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
Получить список процессов , которые выполняется на сессии Агента . В с е процессы фиксируются без постфикса . exe , а также в верхнем регистре .
ПРИМЕР РЕЗУЛЬТАТА , КОТОРЫЙ МОЖНО ПОЛУЧИТЬ ПО ГУИД ЧЕРЕЗ ФУНКЦИЮ AgentActivityItemReturnGet : [ " ORCHESTRATOR " , " AGENT " , " CHROME " , " EXPLORER " , . . . ]
: param inGSettings : Глобальный словарь настроек Оркестратора ( синглтон )
: param inHostNameStr : Наименование хоста , на котором запущен Агент . Наименования подключенных агентов доступно для просмотра в панели управления
: param inUserStr : Наименование пользователя , на графической сессии которого запущен Агент . Наименования подключенных агентов доступно для просмотра в панели управления
: return : GUID String of the ActivityItem - you can wait ( sync or async ) result by this guid !
: return : ГУИД ( GUID ) строка Активности ( ActivityItem ) . Далее можно ожидать результат этой функции по ГУИД с помощью функции AgentActivityItemReturnGet
"""
inGSettings = GSettingsGet ( inGSettings = inGSettings ) # Set the global settings
lActivityItemDict = {
@ -432,10 +441,10 @@ def AgentProcessWOExeUpperUserListGet(inHostNameStr, inUserStr, inGSettings = No
return AgentActivityItemAdd ( inGSettings = inGSettings , inHostNameStr = inHostNameStr , inUserStr = inUserStr , inActivityItemDict = lActivityItemDict )
# OS DEFS
def OSLogoff ( ) :
"""
Logoff the current orchestrator session
Выполнить отключение сессии , на которой выполняется Оркестратор .
: return :
"""
os . system ( " shutdown /l " )
@ -447,7 +456,7 @@ def OSCredentialsVerify(inUserStr, inPasswordStr, inDomainStr=""): ##
: param inUserStr : Наименование пользователя
: param inPasswordStr : Пароль
: param inDomainStr : Домен . Если домена нет - не указывать или " "
: return : True - Credentials are actual ; False - Credentials are not actual
: return : True - Учетные данные верны ; False - Учетные данные представлены некорректно
"""
try :
hUser = win32security . LogonUser (
@ -461,12 +470,13 @@ def OSCredentialsVerify(inUserStr, inPasswordStr, inDomainStr=""): ##
def OSRemotePCRestart ( inHostStr , inForceBool = True , inLogger = None ) :
"""
Send signal via power shell to restart remote PC
ATTENTION : Orchestrator user need to have restart right on the Remote machine to restart PC .
Отправить сигнал на удаленную перезагрузку операционной системы .
: param inLogger : logger to log powershell result in logs
: param inHostStr : PC hostname which you need to restart .
: param inForceBool : True - send signal to force retart PC ; False - else case
! ВНИМАНИЕ ! Перезапуск будет принят , если учетная запись имеет полномочия на перезапуск на соответсвующей машине .
: param inHostStr : Имя хоста , который требуется перезагрузить
: param inForceBool : True - принудительная перезагрузка ; False - мягкая перезагрузка ( дождаться окончания выполнения всех операций ) . По умолчанию True
: param inLogger : Логгер , в который отправлять информацию о результате выполнения команды
: return :
"""
if inLogger is None : inLogger = OrchestratorLoggerGet ( )
@ -476,12 +486,12 @@ def OSRemotePCRestart(inHostStr, inForceBool=True, inLogger = None):
def OSCMD ( inCMDStr , inRunAsyncBool = True , inLogger = None ) :
"""
OS send command in shell locally
Отправить команду на выполнение на сессию , где выполняется Оркестратор .
: param inCMDStr :
: param inRunAsyncBool :
: param inLogger :
: return : CMD result string
: param inCMDStr : Команда на отправку
: param inRunAsyncBool : True - выполнить команду в асинхронном режиме ( не дожидаться окончания выполнения программы и не захватывать результат выполнения ) ; False - Ждать окончания выполнения и захватывать результат
: param inLogger : Логгер , в который отправлять информацию о результате выполнения команды
: return : Строка результата выполнения команды . Если inRunAsyncBool = False
"""
if inLogger is None : inLogger = OrchestratorLoggerGet ( )
lResultStr = " "
@ -521,7 +531,7 @@ def OSCMD(inCMDStr, inRunAsyncBool=True, inLogger = None):
def OrchestratorRestart ( inGSettings = None ) :
"""
Orchestrator restart
Перезапуск Оркестратора с сохранением информации о запущенных RDP сессиях .
: param inGSettings : Глобальный словарь настроек Оркестратора ( синглтон )
"""
@ -536,27 +546,27 @@ def OrchestratorRestart(inGSettings=None):
def OrchestratorLoggerGet ( ) - > logging . Logger :
"""
Get the logger from the Orchestrator
Получить логгер Оркестратора
: return :
: return : Логгер
"""
return GSettingsGet ( ) . get ( " Logger " , None )
def OrchestratorScheduleGet ( ) - > schedule :
"""
Get the schedule ( schedule . readthedocs . io ) from the Orchestrator
For example you can use :
Базовый объект расписания , который можно использовать для запуска / остановки роботов .
Подробнее про объект schedule и е г о примеры использования см . по адресу : schedule . readthedocs . io
. . code - block : : python
# One schedule threaded
# Однопоточный schedule
Orchestrator . OrchestratorScheduleGet ( ) . every ( 5 ) . seconds . do ( lProcess . StatusCheckStart )
# New schedule thread # See def description Orchestrator.OrchestratorThreadStart
# Многопоточный schedule. См. описание Orchestrator.OrchestratorThreadStart
Orchestrator . OrchestratorScheduleGet ( ) . every ( 5 ) . seconds . do ( Orchestrator . OrchestratorThreadStart , lProcess . StatusCheckStart )
: return : schedule module. Example see here https : / / schedule . readthedocs . io / en / stable / examples . html
: return : schedule объект
"""
if GSettingsGet ( ) . get ( " SchedulerDict " , { } ) . get ( " Schedule " , None ) is None :
GSettingsGet ( ) [ " SchedulerDict " ] [ " Schedule " ] = schedule