From bea1a402ef16697ca06fc31750870201bf636e59 Mon Sep 17 00:00:00 2001 From: Ivan Maslov Date: Sun, 14 Apr 2019 09:24:07 +0300 Subject: [PATCH] #RobotDaemonPrototype --- Orchestrator/RobotDaemon/HowToUse.txt | 2 + Orchestrator/RobotDaemon/robotDaemon.py | 41 +++++++++++-------- .../robotDaemonConfiguration - Copy.json | 29 ------------- .../RobotDaemon/robotDaemonConfiguration.json | 24 ++++++++--- .../runProcessOpenRPARobotDaemon_x32.cmd | 3 ++ 5 files changed, 47 insertions(+), 52 deletions(-) create mode 100644 Orchestrator/RobotDaemon/HowToUse.txt delete mode 100644 Orchestrator/RobotDaemon/robotDaemonConfiguration - Copy.json create mode 100644 Orchestrator/RobotDaemon/runProcessOpenRPARobotDaemon_x32.cmd diff --git a/Orchestrator/RobotDaemon/HowToUse.txt b/Orchestrator/RobotDaemon/HowToUse.txt new file mode 100644 index 00000000..ed2833d1 --- /dev/null +++ b/Orchestrator/RobotDaemon/HowToUse.txt @@ -0,0 +1,2 @@ +1. / robotDaemonConfiguration.json +2. runProcessOpenRPARobotDaemon_x32.cmd \ No newline at end of file diff --git a/Orchestrator/RobotDaemon/robotDaemon.py b/Orchestrator/RobotDaemon/robotDaemon.py index 88382661..f123618d 100644 --- a/Orchestrator/RobotDaemon/robotDaemon.py +++ b/Orchestrator/RobotDaemon/robotDaemon.py @@ -5,6 +5,7 @@ import time import codecs import os import signal +import pdb #Чтение конфигурации lDaemonConfigurationFile = codecs.open("robotDaemonConfiguration.json", "r","utf_8_sig") @@ -16,10 +17,11 @@ lDaemonConfigurationObject=json.loads(lDaemonConfigurationJSONString) #Инициализация настроечных параметров lDaemonLoopSeconds=lDaemonConfigurationObject["loopSeconds"] -lDaemonProcessCodeProcessDict={} -lCurrentDateTime=datetime.datetime.now() +lDaemonActivityLogDict={} #Словарь отработанных активностей, ключ - кортеж (, , , ) +lDaemonStartDateTime=datetime.datetime.now() #Вечный цикл while True: + lCurrentDateTime=datetime.datetime.now() #Циклический обход правил lFlagSearchActivityType=True for lItem in lDaemonConfigurationObject["activityList"]: @@ -30,30 +32,35 @@ while True: #Сформировать временной штамп, относительно которого надо будет проверять время #часовой пояс пока не учитываем lActivityDateTime=datetime.datetime.strptime(lItem["time"],"%H:%M") - lActivityDateTime.replace(year=lCurrentDateTime.year,month=lCurrentDateTime.month,day=lCurrentDateTime.day) + lActivityDateTime=lActivityDateTime.replace(year=lCurrentDateTime.year,month=lCurrentDateTime.month,day=lCurrentDateTime.day) #Убедиться в том, что время наступило - if lCurrentDateTime>=lActivityDateTime and lItem["processCode"] not in lDaemonProcessCodeProcessDict: + if ( + lActivityDateTime>=lDaemonStartDateTime and + lCurrentDateTime>=lActivityDateTime and + (lItem["activityType"],lActivityDateTime,lItem["processPath"],lItem["processArgs"]) not in lDaemonActivityLogDict): #Выполнить операцию print("ProcessStart:"+lItem["processPath"]) - lFlagSearchActivityType=False - lDaemonProcessCodeProcessDict[lItem["processCode"]]=subprocess.Popen([lItem["processPath"],lItem["processArgs"]],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE) + #Запись в массив отработанных активностей + lDaemonActivityLogDict[(lItem["activityType"],lActivityDateTime,lItem["processPath"],lItem["processArgs"])]={"ActivityStartDateTime":lCurrentDateTime} + #Запустить процесс + subprocess.Popen([lItem["processPath"],lItem["processArgs"]],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE) #Определить вид активности - if lItem["activityType"]=="processEnd": + if lItem["activityType"]=="processStop": #Вид активности - остановка процесса #Сформировать временной штамп, относительно которого надо будет проверять время #часовой пояс пока не учитываем lActivityDateTime=datetime.datetime.strptime(lItem["time"],"%H:%M") - lActivityDateTime.replace(year=lCurrentDateTime.year,month=lCurrentDateTime.month,day=lCurrentDateTime.day) + lActivityDateTime=lActivityDateTime.replace(year=lCurrentDateTime.year,month=lCurrentDateTime.month,day=lCurrentDateTime.day) #Убедиться в том, что время наступило - if lCurrentDateTime>=lActivityDateTime and lItem["processCode"] in lDaemonProcessCodeProcessDict: - print() - #Выполнить операцию - lProcess=lDaemonProcessCodeProcessDict[lItem["processCode"]] - lProcess.kill() - #os.kill(lProcess.pid, signal.SIGTERM) # Send the signal to all the process groups - lFlagSearchActivityType=False - #Очистить словарь - del lDaemonProcessCodeProcessDict[lItem["processCode"]] + if ( + lActivityDateTime>=lDaemonStartDateTime and + lCurrentDateTime>=lActivityDateTime and + (lItem["activityType"],lActivityDateTime,lItem["processName"]) not in lDaemonActivityLogDict): + #Запись в массив отработанных активностей + lDaemonActivityLogDict[(lItem["activityType"],lActivityDateTime,lItem["processName"])]={"ActivityStartDateTime":lCurrentDateTime} + #Завершить процесс + os.system('taskkill /f /im '+lItem["processName"]) + print("ProcessStop "+lItem["processName"]) #Уснуть до следующего прогона time.sleep(lDaemonLoopSeconds) diff --git a/Orchestrator/RobotDaemon/robotDaemonConfiguration - Copy.json b/Orchestrator/RobotDaemon/robotDaemonConfiguration - Copy.json deleted file mode 100644 index 02ceb10f..00000000 --- a/Orchestrator/RobotDaemon/robotDaemonConfiguration - Copy.json +++ /dev/null @@ -1,29 +0,0 @@ -{ "__loopSeconds":"Количество секунд, между циклами проверки действий", - "loopSeconds":5, - "activityList":[ - { - "description":"Запуск Python консоли", - "__processCode":"Код процесса в openRPA daemon. Данные код может использоваться в дальнейшем для того, чтобы завершить именно тот процесс, который пораждался этой программой", - "processCode":"PythonDebug", - "__activityType":"processStart/processEnd", - "activityType":"processStart", - "__time":"__Время запуска активности", - "time":"09:25", - "__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\\WPy32-3720\\IDLE (Python GUI).exe", - "__processArgs":"Аргументы, передаваемые при запуске процесса", - "processArgs":"" - }, - { - "description":"Остановка Python консоли", - "activityType":"processEnd", - "time":"18:26", - "timeZone":"4", - "processCode":"PythonDebug" - } - - ] -} \ No newline at end of file diff --git a/Orchestrator/RobotDaemon/robotDaemonConfiguration.json b/Orchestrator/RobotDaemon/robotDaemonConfiguration.json index e92fdcf9..902fdc52 100644 --- a/Orchestrator/RobotDaemon/robotDaemonConfiguration.json +++ b/Orchestrator/RobotDaemon/robotDaemonConfiguration.json @@ -5,24 +5,36 @@ "description":"Запуск Python консоли", "__processCode":"Код процесса в openRPA daemon. Данные код может использоваться в дальнейшем для того, чтобы завершить именно тот процесс, который пораждался этой программой", "processCode":"PythonDebug", - "__activityType":"processStart/processEnd", + "__activityType":"processStart/processStop", "activityType":"processStart", "__time":"__Время запуска активности", - "time":"09:25", + "time":"09:18", "__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\\WPy32-3720\\IDLE (Python GUI).exe", + "processPath":"C:\\Abs\\Archive\\scopeSrcUL\\OpenRPA\\Orchestrator\\RobotDaemon\\runProcessOpenRPARobotDaemon_x32.cmd", "__processArgs":"Аргументы, передаваемые при запуске процесса", "processArgs":"" }, + { + "description":"Запуск Python консоли", + "__activityType":"processStart/processStop", + "activityType":"processStart", + "__time":"__Время запуска активности", + "time":"09:19", + "__timeZone":"Часовой пояс, в рамках которого указано время. По-умолчанию часовой пояс МСК (GMT+4). Формат UTC offset in the form ±HHMM[SS[.ffffff]] ", + "timeZone":"+0400", + "__processPath":"Полный путь/наименование процесса. Запуск производится через subprocess. Идентификатор процесса в дальнейшем сохраняется и его можно будет закрыть с помощью параметра processCode", + "processPath":"notepad", + "processArgs":"" + }, { "description":"Остановка Python консоли", - "activityType":"processEnd", - "time":"22:22", + "activityType":"processStop", + "time":"9:20", "timeZone":"4", - "processCode":"PythonDebug" + "processName":"OpenRPARobotDaemon.exe" } ] diff --git a/Orchestrator/RobotDaemon/runProcessOpenRPARobotDaemon_x32.cmd b/Orchestrator/RobotDaemon/runProcessOpenRPARobotDaemon_x32.cmd new file mode 100644 index 00000000..661f7a85 --- /dev/null +++ b/Orchestrator/RobotDaemon/runProcessOpenRPARobotDaemon_x32.cmd @@ -0,0 +1,3 @@ +cd %~dp0 +copy /Y ..\..\WPy32-3720\python-3.7.2\python.exe ..\..\WPy32-3720\python-3.7.2\OpenRPARobotDaemon.exe +.\..\..\WPy32-3720\python-3.7.2\OpenRPARobotDaemon.exe robotDaemon.py \ No newline at end of file