import subprocess import json import datetime import time import codecs import os import signal import pdb import orchestratorServer import orchestratorTimer import orchestratorProcessor import logging from Settings import Settings #Создать файл логирования # add filemode="w" to overwrite if not os.path.exists("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") lGlobalDict={} #"JSONConfigurationDict": #"ActivityLog":[{""}] #"ActivityLogSchedule" lDaemonConfigurationObject=Settings.mDict #Единый глобальный словарь (За основу взять из Settings.py) global mGlobalDict mGlobalDict = Settings.mDict orchestratorProcessor.mGlobalDict = mGlobalDict orchestratorTimer.mGlobalDict = mGlobalDict orchestratorServer.mGlobalDict = mGlobalDict orchestratorServer.orchestratorProcessor.mGlobalDict = mGlobalDict #Инициализация настроечных параметров lDaemonLoopSeconds=lDaemonConfigurationObject["Scheduler"]["ActivityTimeCheckLoopSeconds"] lDaemonActivityLogDict={} #Словарь отработанных активностей, ключ - кортеж (, , , ) 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.start() #Вечный цикл while True: lCurrentDateTime=datetime.datetime.now() #Циклический обход правил lFlagSearchActivityType=True for lIndex, lItem in enumerate(lDaemonConfigurationObject["Scheduler"]["ActivityTimeList"]): #Проверка дней недели, в рамках которых можно запускать активность lItemWeekdayList=lItem.get("WeekdayList",[0,1,2,3,4,5,6]) if lCurrentDateTime.weekday() in lItemWeekdayList: if lFlagSearchActivityType: #Лог lItemCopy = copy.deepcopy(lItem) lItemCopy["DateTimeUTCStringStart"]=datetime.datetime.strftime(datetime.datetime.now(),"%Y-%m-%dT%H:%M:%S.%f") mGlobalDict["Scheduler"]["LogList"].append(lItemCopy) ####################################################################### #Branch 1 - if has TimeHH:MM ####################################################################### if "TimeHH:MM" in lItem: #Вид активности - запуск процесса #Сформировать временной штамп, относительно которого надо будет проверять время #часовой пояс пока не учитываем lActivityDateTime=datetime.datetime.strptime(lItem["TimeHH:MM"],"%H:%M") lActivityDateTime=lActivityDateTime.replace(year=lCurrentDateTime.year,month=lCurrentDateTime.month,day=lCurrentDateTime.day) #Убедиться в том, что время наступило if ( lActivityDateTime>=lDaemonStartDateTime and lCurrentDateTime>=lActivityDateTime and (lIndex,lActivityDateTime) not in lDaemonActivityLogDict): #Выполнить операцию #Запись в массив отработанных активностей lDaemonActivityLogDict[(lIndex,lActivityDateTime)]={"ActivityStartDateTime":lCurrentDateTime} #Запустить процесс orchestratorProcessor.ActivityListOrDict(lItem["Activity"]) ####################################################################### #Banch 2 - if TimeHH:MMStart, TimeHH:MMStop, ActivityIntervalSeconds ####################################################################### if "TimeHH:MMStart" in lItem and "TimeHH:MMStop" in lItem and "ActivityIntervalSeconds" in lItem: #Сформировать временной штамп, относительно которого надо будет проверять время #часовой пояс пока не учитываем lActivityDateTime=datetime.datetime.strptime(lItem["TimeHH:MMStart"],"%H:%M") lActivityDateTime=lActivityDateTime.replace(year=lCurrentDateTime.year,month=lCurrentDateTime.month,day=lCurrentDateTime.day) lActivityTimeEndDateTime=datetime.datetime.strptime(lItem["TimeHH:MMStop"],"%H:%M") lActivityTimeEndDateTime=lActivityTimeEndDateTime.replace(year=lCurrentDateTime.year,month=lCurrentDateTime.month,day=lCurrentDateTime.day) #Убедиться в том, что время наступило if ( lCurrentDateTime=lActivityDateTime and (lIndex,lActivityDateTime) not in lDaemonActivityLogDict): #Запись в массив отработанных активностей lDaemonActivityLogDict[(lIndex,lActivityDateTime)]={"ActivityStartDateTime":lCurrentDateTime} #Запуск циклической процедуры orchestratorTimer.activityLoopStart(lItem["ActivityIntervalSeconds"],lActivityTimeEndDateTime, lItem["Activity"]) #Уснуть до следующего прогона time.sleep(lDaemonLoopSeconds)