You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ORPA-pyOpenRPA/Orchestrator/RobotDaemon/robotDaemon.py

84 lines
5.0 KiB

import subprocess
import json
import datetime
import time
import codecs
import os
import signal
import pdb
import robotDaemonServer
#Чтение конфигурации
lDaemonConfigurationFile = codecs.open("robotDaemonConfiguration.json", "r","utf_8_sig")
lDaemonConfigurationJSONString = lDaemonConfigurationFile.read()
#Закрыть файловый объект
lDaemonConfigurationFile.close()
#Преобразование в JSON
lDaemonConfigurationObject=json.loads(lDaemonConfigurationJSONString)
#Инициализация настроечных параметров
lDaemonLoopSeconds=lDaemonConfigurationObject["loopSeconds"]
lDaemonActivityLogDict={} #Словарь отработанных активностей, ключ - кортеж (<activityType>, <datetime>, <processPath || processName>, <processArgs>)
lDaemonStartDateTime=datetime.datetime.now()
#Инициализация сервера
lThreadServer = robotDaemonServer.RobotDaemonServer("ServerThread",lDaemonConfigurationObject)
lThreadServer.start()
#Вечный цикл
while True:
lCurrentDateTime=datetime.datetime.now()
#Циклический обход правил
lFlagSearchActivityType=True
for lItem in lDaemonConfigurationObject["activityList"]:
if lFlagSearchActivityType:
#Определить вид активности
if lItem["activityType"]=="processStart":
#Вид активности - запуск процесса
#Сформировать временной штамп, относительно которого надо будет проверять время
#часовой пояс пока не учитываем
lActivityDateTime=datetime.datetime.strptime(lItem["time"],"%H:%M")
lActivityDateTime=lActivityDateTime.replace(year=lCurrentDateTime.year,month=lCurrentDateTime.month,day=lCurrentDateTime.day)
#Убедиться в том, что время наступило
if (
lActivityDateTime>=lDaemonStartDateTime and
lCurrentDateTime>=lActivityDateTime and
(lItem["activityType"],lActivityDateTime,lItem["processPath"]) not in lDaemonActivityLogDict):
#Выполнить операцию
print("ProcessStart:"+lItem["processPath"])
#Запись в массив отработанных активностей
lDaemonActivityLogDict[(lItem["activityType"],lActivityDateTime,lItem["processPath"])]={"ActivityStartDateTime":lCurrentDateTime}
#Запустить процесс
lItemArgs=[lItem["processPath"]]
lItemArgs.extend(lItem["processArgs"])
subprocess.Popen(lItemArgs,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
#Определить вид активности
if lItem["activityType"]=="processStop":
#Вид активности - остановка процесса
#Сформировать временной штамп, относительно которого надо будет проверять время
#часовой пояс пока не учитываем
lActivityDateTime=datetime.datetime.strptime(lItem["time"],"%H:%M")
lActivityDateTime=lActivityDateTime.replace(year=lCurrentDateTime.year,month=lCurrentDateTime.month,day=lCurrentDateTime.day)
#Убедиться в том, что время наступило
if (
lActivityDateTime>=lDaemonStartDateTime and
lCurrentDateTime>=lActivityDateTime and
(lItem["activityType"],lActivityDateTime,lItem["processName"]) not in lDaemonActivityLogDict):
#Запись в массив отработанных активностей
lDaemonActivityLogDict[(lItem["activityType"],lActivityDateTime,lItem["processName"])]={"ActivityStartDateTime":lCurrentDateTime}
#Сформировать команду на завершение
lActivityCloseCommand='taskkill /im '+lItem["processName"]
#TODO Сделать безопасную обработку,если параметра нет в конфигурации
if lItem['flagCloseForce']:
lActivityCloseCommand+=" /F"
#Завершить процессы только текущего пользоваиеля
if lItem['flagCloseOnlyCurrentUser']:
lActivityCloseCommand+=' /fi "username eq %username%"'
#Завершить процесс
os.system(lActivityCloseCommand)
print("ProcessStop "+lItem["processName"])
#Уснуть до следующего прогона
time.sleep(lDaemonLoopSeconds)