import psutil import datetime def RenderRobotR01(inGlobalConfiguration): #Subheader Variants lSubheaderRunTrueText="Состояние: Работает" lSubheaderRunFalseText="Состояние: Не работает" #Run button #Такое большое количество слэшей связано с тем, что этот текст отправляется сначала в браузер, рендерится там, а потом отправляется на процессор оркестратора lOnClickRunButton="""mGlobal.Controller.CMDRunText("C:\\\\\\\\RPA\\\\\\\\R01_IntegrationOrderOut\\\\\\\\Sources\\\\\\\\R01_IntegrationOrderOut_64_Start.cmd");""" #Force close button lOnClickForceCloseButton="""mGlobal.Controller.CMDRunText("taskkill /F /im Robot_R01.exe");""" #Result template lResultDict={ "HeaderLeftText":"Автозагрузка заявок на расход", "HeaderRightText":"R01", "SubheaderText":lSubheaderRunFalseText, "BodyKeyValueList":[ #Дата запуска: 10:00:09 01.09.2019 {"Key":"Дата запуска","Value":"Не запущен"}, {"Key":"Текущий шаг","Value":"Не запущен"}, {"Key":"Время выполнения шага","Value":"--с."}, {"Key":"Отчет робота","Value":"Скачать"} ], "FooterText":"Дата изменения: 9:38:00 09.10.2019", "FooterButtonX2List":[ {"Text":"Ручной запуск", "Color":"green", "Link":"", "OnClick": lOnClickRunButton}, {"Text":"Безопасная остановка", "Color disabled":"orange", "Link":""} ], "FooterButtonX1List":[ {"Text":"Принудительная остановка", "Color":"red", "Link":"", "OnClick": lOnClickForceCloseButton} ] } #Check if process running if CheckIfProcessRunning("Robot_R01"): lResultDict["SubheaderText"]=lSubheaderRunTrueText #Fill robot info from Storage - R01 if "Robot_R01" in inGlobalConfiguration.get("Storage",{}): lItemDict=inGlobalConfiguration["Storage"]["Robot_R01"] #lResultDict["HeaderLeftText"]=lItemDict["Name"] #lResultDict["HeaderRightText"]=lItemDict["Code"] lResultDict["BodyKeyValueList"][0]["Value"]=lItemDict.get("RunDateTimeString","Не запущен") lResultDict["BodyKeyValueList"][1]["Value"]=lItemDict.get("StepCurrentName","Не запущен") lResultDict["BodyKeyValueList"][2]["Value"]=lItemDict.get("StepCurrentDuration","--с.") else: #Process not running lResultDict["FooterText"]=f'Дата изменения: {datetime.datetime.now().strftime("%H:%M:%S %d.%m.%Y")}' else: #Process not running lResultDict["FooterText"]=f'Дата изменения: {datetime.datetime.now().strftime("%H:%M:%S %d.%m.%Y")}' return lResultDict def CheckIfProcessRunning(processName): ''' Check if there is any running process that contains the given name processName. ''' #Iterate over the all the running process for proc in psutil.process_iter(): try: # Check if process name contains the given name string. if processName.lower() in proc.name().lower(): return True except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): pass return False; #Orchestrator settings mDict = { "Server":{ "ListenPort_":"Порт, по которому можно подключиться к демону", "ListenPort":8081, "ListenURLList":[ { "Description":"Local machine test", "URL_":"Сетевое расположение сервера демона", "URL":"http://127.0.0.1:8081" } ] }, "Scheduler":{ "ActivityTimeCheckLoopSeconds_":"Количество секунд, между циклами проверки действий", "ActivityTimeCheckLoopSeconds":5, "ActivityTimeList":[ { "description":"Запуск Python консоли", "__processCode":"Код процесса в openRPA daemon. Данные код может использоваться в дальнейшем для того, чтобы завершить именно тот процесс, который пораждался этой программой", "processCode":"PythonDebug", "__activityType":"processStart/processStop", "activityType":"processStart", "__time":"__Время запуска активности", "time":"22:57", "__timeZone":"Часовой пояс, в рамках которого указано время. По-умолчанию часовой пояс МСК (GMT+4). Формат UTC offset in the form ±HHMM[SS[.ffffff]] ", "timeZone":"+0400", "__processPath":"Полный путь/наименование процесса. Запуск производится через subprocess. Идентификатор процесса в дальнейшем сохраняется и его можно будет закрыть с помощью параметра processCode", "____processPath":"C:\\Abs\\Archive\\scopeSrcUL\\OpenRPA\\OpenRPA_32.cmd", "processPath":"C:\\Abs\\Archive\\scopeSrcUL\\OpenRPA\\Orchestrator\\RobotDaemon\\runProcessOpenRPARobotDaemon_x32.cmd", "__processArgs":"Аргументы, передаваемые при запуске процесса", "processArgs":"", "__weekdayNumList":"Список номеров дней недели, по которым выполнять инициализаци активности. Отсчет ведется от 0 до 6", "weekdayNumList":[1,2,3] }, { "description":"Запуск Python консоли", "__activityType":"processStart/processStop", "activityType":"processStart", "__time":"__Время запуска активности", "time":"23:24", "__timeZone":"Часовой пояс, в рамках которого указано время. По-умолчанию часовой пояс МСК (GMT+4). Формат UTC offset in the form ±HHMM[SS[.ffffff]] ", "timeZone":"+0400", "__processPath":"Полный путь/наименование процесса. Запуск производится через subprocess. Идентификатор процесса в дальнейшем сохраняется и его можно будет закрыть с помощью параметра processCode", "processPath":"notepad", "processArgs":"" }, { "description":"Остановка Python консоли", "activityType":"processStop", "time":"19:20", "timeZone":"4", "processName":"OpenRPARobotDaemon.exe", "_flagCloseForce":"Признак, что процесс нужно принудительно закрыть (если флага нет, то на процесс просто посылается команда terminate)", "flagCloseForce":True, "_flagCloseOnlyCurrentUser":"Признак, что процесс нужно закрыть только у текущего пользователя", "flagCloseOnlyCurrentUser":True }, { "activityType":"loopActivity", "loopSeconds":6, "loopTimeStart":"21:45", "loopTimeEnd":"21:46", "pythonPackageName":"CheckActivity", "pythonFunctionName":"test_activity", "pythonFunctionArgList":["TestArg1","TestArg2"], "processPath":"notepad", "processArgs":"" } ] }, "Processor":{ "LogList_":"Fill list when orchestrator is running", "TransactionList_":"List of processor activity, whick was executed", "TransactionList__":[ { "DateTimeStart":"2009-09-01T00:00:00.000Z", "DateTimeEnd":"2009-09-01T00:00:00.000Z", "ActivityList":[] } ], "TransactionList":[], "TransactionTrace_":" if Trace for command is selected for False, the tracing will be off for such activity type", "TransactionTrace_ActivityCMDRun":True, }, "ControlPanelDict":{ "RefreshSeconds": 5, "RobotList": [ { "RenderFunctionName":"RenderRobotR01", "RenderFunctionModuleName":"Settings", "RenderFunctionModuleSubfolderName":"Settings" } ] }, "FileManager": { "FileURLFilePathDict_help":"https://localhost:8081/filemanager/. All FileURL s must be set in lowercase", "FileURLFilePathDict":{ "r01/report.xlsx":"C:\\RPA\\R01_IntegrationOrderOut\\Data\\Reestr_otgruzok.xlsx" } }, "Storage":{ "Robot_R01_help":"Robot data storage in orchestrator env", "Robot_R01":{} } }