1. [+] Убрать префикс orchestrator так как он и так находится в папке Orchestrator/ OrchestratorMain > Orchestrator

2. [+] Консолидировать выполнение всех действий через orchestratorProcessor
3. [+] Свести в планарную структуру inConfiguration. Логи сейчас формируются за предалали этой структуры - возникает двойное трактование
4. [+] Рефакторинг конфигурации до конца вместе с консолидацией orchestratorProcessor
dev-linux
Ivan Maslov 5 years ago
parent 0997006ac3
commit 29a21f1ad7

@ -0,0 +1,3 @@
# Default ignored files
/workspace.xml

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TestRunnerService">
<option name="PROJECT_TEST_RUNNER" value="Unittests" />
</component>
</module>

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/Orchestrator.iml" filepath="$PROJECT_DIR$/.idea/Orchestrator.iml" />
</modules>
</component>
</project>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

@ -1,4 +1,4 @@
cd %~dp0 cd %~dp0
copy /Y ..\Resources\WPy32-3720\python-3.7.2\python.exe ..\Resources\WPy32-3720\python-3.7.2\OpenRPAOrchestrator.exe copy /Y ..\Resources\WPy32-3720\python-3.7.2\python.exe ..\Resources\WPy32-3720\python-3.7.2\OpenRPAOrchestrator.exe
.\..\Resources\WPy32-3720\python-3.7.2\OpenRPAOrchestrator.exe orchestratorMain.py .\..\Resources\WPy32-3720\python-3.7.2\OpenRPAOrchestrator.exe Orchestrator.py
pause >nul pause >nul

@ -1,4 +1,4 @@
cd %~dp0 cd %~dp0
copy /Y ..\Resources\WPy64-3720\python-3.7.2.amd64\python.exe ..\Resources\WPy64-3720\python-3.7.2.amd64\OpenRPAOrchestrator.exe copy /Y ..\Resources\WPy64-3720\python-3.7.2.amd64\python.exe ..\Resources\WPy64-3720\python-3.7.2.amd64\OpenRPAOrchestrator.exe
.\..\Resources\WPy64-3720\python-3.7.2.amd64\OpenRPAOrchestrator.exe orchestratorMain.py .\..\Resources\WPy64-3720\python-3.7.2.amd64\OpenRPAOrchestrator.exe Orchestrator.py
pause >nul pause >nul

@ -6,9 +6,9 @@ import codecs
import os import os
import signal import signal
import pdb import pdb
import orchestratorServer import Server
import orchestratorTimer import Timer
import orchestratorProcessor import Processor
import logging import logging
from Settings import Settings from Settings import Settings
@ -18,43 +18,29 @@ if not os.path.exists("Reports"):
os.makedirs("Reports") os.makedirs("Reports")
logging.basicConfig(filename="Reports\ReportRun_"+datetime.datetime.now().strftime("%Y_%m_%d__%H_%M_%S")+".log", level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s") logging.basicConfig(filename="Reports\ReportRun_"+datetime.datetime.now().strftime("%Y_%m_%d__%H_%M_%S")+".log", level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s")
lGlobalDict={}
#"JSONConfigurationDict":<JSON>
#"ActivityLog":[{""}]
#"ActivityLogSchedule"
lDaemonConfigurationObject=Settings.mDict
#Единый глобальный словарь (За основу взять из Settings.py) #Единый глобальный словарь (За основу взять из Settings.py)
global mGlobalDict global mGlobalDict
mGlobalDict = Settings.mDict mGlobalDict = Settings.mDict
orchestratorProcessor.mGlobalDict = mGlobalDict Processor.mGlobalDict = mGlobalDict
orchestratorTimer.mGlobalDict = mGlobalDict Timer.mGlobalDict = mGlobalDict
orchestratorServer.mGlobalDict = mGlobalDict Timer.Processor.mGlobalDict = mGlobalDict
orchestratorServer.orchestratorProcessor.mGlobalDict = mGlobalDict Server.mGlobalDict = mGlobalDict
Server.Processor.mGlobalDict = mGlobalDict
#Инициализация настроечных параметров #Инициализация настроечных параметров
lDaemonLoopSeconds=lDaemonConfigurationObject["Scheduler"]["ActivityTimeCheckLoopSeconds"] lDaemonLoopSeconds=mGlobalDict["Scheduler"]["ActivityTimeCheckLoopSeconds"]
lDaemonActivityLogDict={} #Словарь отработанных активностей, ключ - кортеж (<activityType>, <datetime>, <processPath || processName>, <processArgs>) lDaemonActivityLogDict={} #Словарь отработанных активностей, ключ - кортеж (<activityType>, <datetime>, <processPath || processName>, <processArgs>)
lDaemonStartDateTime=datetime.datetime.now() lDaemonStartDateTime=datetime.datetime.now()
#Инициализация globalDict
lGlobalDict["JSONConfigurationDict"]=lDaemonConfigurationObject
lGlobalDict["ActivityLogSchedule"]=lDaemonActivityLogDict
lGlobalDict["ActivityLogScheduleList"]=[]
lGlobalDict["GlobalDict"]=mGlobalDict
orchestratorServer.mActivityLogDict = lDaemonActivityLogDict
#Инициализация сервера #Инициализация сервера
lThreadServer = orchestratorServer.RobotDaemonServer("ServerThread",lGlobalDict) lThreadServer = Server.RobotDaemonServer("ServerThread", mGlobalDict)
lThreadServer.start() lThreadServer.start()
#Вечный цикл #Вечный цикл
while True: while True:
lCurrentDateTime=datetime.datetime.now() lCurrentDateTime=datetime.datetime.now()
#Циклический обход правил #Циклический обход правил
lFlagSearchActivityType=True lFlagSearchActivityType=True
for lIndex, lItem in enumerate(lDaemonConfigurationObject["Scheduler"]["ActivityTimeList"]): for lIndex, lItem in enumerate(mGlobalDict["Scheduler"]["ActivityTimeList"]):
#Проверка дней недели, в рамках которых можно запускать активность #Проверка дней недели, в рамках которых можно запускать активность
lItemWeekdayList=lItem.get("WeekdayList",[0,1,2,3,4,5,6]) lItemWeekdayList=lItem.get("WeekdayList",[0,1,2,3,4,5,6])
if lCurrentDateTime.weekday() in lItemWeekdayList: if lCurrentDateTime.weekday() in lItemWeekdayList:
@ -81,7 +67,7 @@ while True:
#Запись в массив отработанных активностей #Запись в массив отработанных активностей
lDaemonActivityLogDict[(lIndex,lActivityDateTime)]={"ActivityStartDateTime":lCurrentDateTime} lDaemonActivityLogDict[(lIndex,lActivityDateTime)]={"ActivityStartDateTime":lCurrentDateTime}
#Запустить процесс #Запустить процесс
orchestratorProcessor.ActivityListOrDict(lItem["Activity"]) Processor.ActivityListOrDict(lItem["Activity"])
####################################################################### #######################################################################
#Banch 2 - if TimeHH:MMStart, TimeHH:MMStop, ActivityIntervalSeconds #Banch 2 - if TimeHH:MMStart, TimeHH:MMStop, ActivityIntervalSeconds
####################################################################### #######################################################################
@ -100,6 +86,6 @@ while True:
#Запись в массив отработанных активностей #Запись в массив отработанных активностей
lDaemonActivityLogDict[(lIndex,lActivityDateTime)]={"ActivityStartDateTime":lCurrentDateTime} lDaemonActivityLogDict[(lIndex,lActivityDateTime)]={"ActivityStartDateTime":lCurrentDateTime}
#Запуск циклической процедуры #Запуск циклической процедуры
orchestratorTimer.activityLoopStart(lItem["ActivityIntervalSeconds"],lActivityTimeEndDateTime, lItem["Activity"]) Timer.activityLoopStart(lItem["ActivityIntervalSeconds"], lActivityTimeEndDateTime, lItem["Activity"])
#Уснуть до следующего прогона #Уснуть до следующего прогона
time.sleep(lDaemonLoopSeconds) time.sleep(lDaemonLoopSeconds)

@ -8,7 +8,7 @@ import os
import PIL import PIL
from PIL import ImageGrab from PIL import ImageGrab
from threading import Thread from threading import Thread
import orchestratorProcessor import Processor
import importlib import importlib
import pdb import pdb
import imp import imp
@ -26,46 +26,15 @@ def SaveScreenshot(inFilePath):
# save image file # save image file
#lScreenshot.save('screenshot.png') #lScreenshot.save('screenshot.png')
#Глобальные переменные
global mActivityLogDict
#inGlobalDict #inGlobalDict
# "JSONConfigurationDict":<JSON> # "JSONConfigurationDict":<JSON>
class RobotDaemonServer(Thread): class RobotDaemonServer(Thread):
def __init__(self,name,inGlobalDict): def __init__(self,name,inGlobalDict):
Thread.__init__(self) Thread.__init__(self)
self.name = name self.name = name
global mJSONConfigurationDict
mJSONConfigurationDict=inGlobalDict["JSONConfigurationDict"]
#Перенос переменной в orchestratorProcessor
orchestratorProcessor.mGlobalDict=inGlobalDict["GlobalDict"]
#Init other functions
#TODO do module init once when run
#lRenderFunctionsRobotList=mJSONConfigurationDict["ControlPanelDict"]["RobotList"]
#for lItem in lRenderFunctionsRobotList:
#lModuleImportName = lItem.get("RenderFunctionModuleSubfolderName","")
#f = None
#filename = None
#description = None
#if lModuleImportName!="":
# lModuleImportName = f'{lItem["RenderFunctionModuleSubfolderName"]}.{lItem["RenderFunctionModuleName"]}'
# f, filename, description = imp.find_module(lModuleImportName)
#else:
# lModuleImportName = lItem["RenderFunctionModuleName"]
# f, filename, description = imp.find_module(lModuleImportName)
#Подключить модуль для вызова
#importlib.import_module(lModuleImportName)
#pdb.set_trace()
#import imp
#f, filename, description = imp.find_module(lModuleImportName)
#example_package = imp.load_module(lModuleImportName, f, filename, description)
#print('Package:', example_package)
#f.close()
#print(globals())
#print(lModuleImportName)
def run(self): def run(self):
inServerAddress=""; inServerAddress="";
inPort = mJSONConfigurationDict["Server"]["ListenPort"]; inPort = mGlobalDict["Server"]["ListenPort"];
print('starting server..., port:'+str(inPort)+" inAddress:"+inServerAddress) print('starting server..., port:'+str(inPort)+" inAddress:"+inServerAddress)
# Server settings # Server settings
# Choose port 8080, for port 80, which is normally used for a http server, you need root access # Choose port 8080, for port 80, which is normally used for a http server, you need root access
@ -128,7 +97,7 @@ class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
self.send_header('Content-type','application/json') self.send_header('Content-type','application/json')
self.end_headers() self.end_headers()
# Send message back to client # Send message back to client
message = json.dumps(mJSONConfigurationDict) message = json.dumps(mGlobalDict)
# Write content as utf-8 data # Write content as utf-8 data
self.wfile.write(bytes(message, "utf8")) self.wfile.write(bytes(message, "utf8"))
if self.path == '/Monitor/ControlPanelDictGet': if self.path == '/Monitor/ControlPanelDictGet':
@ -139,7 +108,7 @@ class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
self.end_headers() self.end_headers()
#Create result JSON #Create result JSON
lResultJSON={"RenderRobotList":[]} lResultJSON={"RenderRobotList":[]}
lRenderFunctionsRobotList=mJSONConfigurationDict["ControlPanelDict"]["RobotList"] lRenderFunctionsRobotList=mGlobalDict["ControlPanelDict"]["RobotList"]
for lItem in lRenderFunctionsRobotList: for lItem in lRenderFunctionsRobotList:
#Подключить модуль для вызова #Подключить модуль для вызова
#print(globals()) #print(globals())
@ -152,11 +121,10 @@ class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
#Найти функцию #Найти функцию
lFunction=getattr(lModule,lItem["RenderFunctionName"]) lFunction=getattr(lModule,lItem["RenderFunctionName"])
#Выполнить вызов и записать результат #Выполнить вызов и записать результат
lItemResultDict=lFunction(mJSONConfigurationDict) lItemResultDict=lFunction(mGlobalDict)
#RunFunction #RunFunction
lResultJSON["RenderRobotList"].append(lItemResultDict) lResultJSON["RenderRobotList"].append(lItemResultDict)
# Send message back to client # Send message back to client
#print(mJSONConfigurationDict)
message = json.dumps(lResultJSON) message = json.dumps(lResultJSON)
# Write content as utf-8 data # Write content as utf-8 data
self.wfile.write(bytes(message, "utf8")) self.wfile.write(bytes(message, "utf8"))
@ -164,8 +132,8 @@ class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
if self.path.lower().startswith('/filemanager/'): if self.path.lower().startswith('/filemanager/'):
lFileURL=self.path[13:] lFileURL=self.path[13:]
# check if file in FileURL - File Path Mapping Dict # check if file in FileURL - File Path Mapping Dict
if lFileURL.lower() in mJSONConfigurationDict["FileManager"]["FileURLFilePathDict"]: if lFileURL.lower() in mGlobalDict["FileManager"]["FileURLFilePathDict"]:
self.SendResponseContentTypeFile('application/octet-stream',mJSONConfigurationDict["FileManager"]["FileURLFilePathDict"][lFileURL]) self.SendResponseContentTypeFile('application/octet-stream',mGlobalDict["FileManager"]["FileURLFilePathDict"][lFileURL])
# POST # POST
def do_POST(self): def do_POST(self):
#Централизованная функция получения запросов/отправки #Централизованная функция получения запросов/отправки
@ -183,7 +151,7 @@ class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
self.send_header('Content-type','application/json') self.send_header('Content-type','application/json')
self.end_headers() self.end_headers()
# Send message back to client # Send message back to client
message = json.dumps(orchestratorProcessor.ActivityListOrDict(lInputObject)) message = json.dumps(Processor.ActivityListOrDict(lInputObject))
# Write content as utf-8 data # Write content as utf-8 data
self.wfile.write(bytes(message, "utf8")) self.wfile.write(bytes(message, "utf8"))
return return

@ -3,7 +3,7 @@ import datetime
import subprocess import subprocess
import importlib import importlib
import logging import logging
import orchestratorProcessor import Processor
global mGlobalDict global mGlobalDict
@ -39,7 +39,7 @@ def activityLoopExecution(inLoopTimeEndDateTime, inActivity):
lResultGoLoop=True lResultGoLoop=True
lCurrentDateTime=datetime.datetime.now() lCurrentDateTime=datetime.datetime.now()
#Запустить актитвость через процессор (orchestratorProcessor) #Запустить актитвость через процессор (orchestratorProcessor)
orchestratorProcessor.ActivityListOrDict(inActivity) Processor.ActivityListOrDict(inActivity)
#Выключить таймер, если время наступило #Выключить таймер, если время наступило
if lCurrentDateTime>=inLoopTimeEndDateTime: if lCurrentDateTime>=inLoopTimeEndDateTime:
lResultGoLoop=False lResultGoLoop=False

@ -1,4 +1,4 @@
1. Убрать префикс orchestrator так как он и так находится в папке Orchestrator/ OrchestratorMain > Orchestrator 1. [+] Убрать префикс orchestrator так как он и так находится в папке Orchestrator/ OrchestratorMain > Orchestrator
2. Консолидировать выполнение всех действий через orchestratorProcessor 2. [+] Консолидировать выполнение всех действий через orchestratorProcessor
3. Свести в планарную структуру inConfiguration. Логи сейчас формируются за предалали этой структуры - возникает двойное трактование 3. [+] Свести в планарную структуру inConfiguration. Логи сейчас формируются за предалали этой структуры - возникает двойное трактование
4. Рефакторинг конфигурации до конца вместе с консолидацией orchestratorProcessor 4. [+] Рефакторинг конфигурации до конца вместе с консолидацией orchestratorProcessor

Loading…
Cancel
Save