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":{}
}
}