@ -8,6 +8,13 @@ import signal
import pdb
import pdb
import orchestratorServer
import orchestratorServer
import orchestratorTimer
import orchestratorTimer
import logging
#Создать файл логирования
# 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 = { }
lGlobalDict = { }
#"JSONConfigurationDict":<JSON>
#"JSONConfigurationDict":<JSON>
@ -44,75 +51,81 @@ while True:
#Циклический обход правил
#Циклический обход правил
lFlagSearchActivityType = True
lFlagSearchActivityType = True
for lItem in lDaemonConfigurationObject [ " activityList " ] :
for lItem in lDaemonConfigurationObject [ " activityList " ] :
if lFlagSearchActivityType :
#Проверка дней недели, в рамках которых можно запускать активность
#Определить вид активности
lItemWeekdayList = lItem . get ( " weekdayNumList " , [ 0 , 1 , 2 , 3 , 4 , 5 , 6 ] )
if lItem [ " activityType " ] == " processStart " :
if lCurrentDateTime . weekday ( ) in lItemWeekdayList :
#Вид активности - запуск процесса
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 = datetime . datetime . strptime ( lItem [ " time " ] , " % H: % M " )
lActivityDateTime > = lDaemonStartDateTime and
lActivityDateTime = lActivityDateTime . replace ( year = lCurrentDateTime . year , month = lCurrentDateTime . month , day = lCurrentDateTime . day )
lCurrentDateTime > = lActivityDateTime and
#Убедиться в том, что время наступило
( lItem [ " activityType " ] , lActivityDateTime , lItem [ " processPath " ] ) not in lDaemonActivityLogDict ) :
if (
#Выполнить операцию
lActivityDateTime > = lDaemonStartDateTime and
print ( datetime . datetime . now ( ) . isoformat ( ) + " :: ProcessStart: " + lItem [ " processPath " ] )
lCurrentDateTime > = lActivityDateTime and
#Запись в массив отработанных активностей
( lItem [ " activityType " ] , lActivityDateTime , lItem [ " processPath " ] ) not in lDaemonActivityLogDict ) :
lDaemonActivityLogDict [ ( lItem [ " activityType " ] , lActivityDateTime , lItem [ " processPath " ] ) ] = { " ActivityStartDateTime " : lCurrentDateTime }
#Выполнить операцию
#Лог
print ( datetime . datetime . now ( ) . isoformat ( ) + " :: ProcessStart: " + lItem [ " processPath " ] )
lGlobalDict [ " ActivityLogScheduleList " ] . append ( { " activityType " : lItem [ " activityType " ] , " activityDateTime " : str ( lActivityDateTime ) , " processPath " : lItem [ " processPath " ] , " activityStartDateTime " : str ( lCurrentDateTime ) } )
logging . info ( " ProcessStart: " + lItem [ " processPath " ] )
#Запустить процесс
#Запись в массив отработанных активностей
lItemArgs = [ lItem [ " processPath " ] ]
lDaemonActivityLogDict [ ( lItem [ " activityType " ] , lActivityDateTime , lItem [ " processPath " ] ) ] = { " ActivityStartDateTime " : lCurrentDateTime }
lItemArgs . extend ( lItem [ " processArgs " ] )
#Лог
subprocess . Popen ( lItemArgs , stdin = subprocess . PIPE , stdout = subprocess . PIPE , stderr = subprocess . PIPE )
lGlobalDict [ " ActivityLogScheduleList " ] . append ( { " activityType " : lItem [ " activityType " ] , " activityDateTime " : str ( lActivityDateTime ) , " processPath " : lItem [ " processPath " ] , " activityStartDateTime " : str ( lCurrentDateTime ) } )
#Определить вид активности
#Запустить процесс
if lItem [ " activityType " ] == " processStop " :
lItemArgs = [ lItem [ " processPath " ] ]
#Вид активности - остановка процесса
lItemArgs . extend ( lItem [ " processArgs " ] )
#Сформировать временной штамп, относительно которого надо будет проверять время
subprocess . Popen ( lItemArgs , stdin = subprocess . PIPE , stdout = subprocess . PIPE , stderr = subprocess . PIPE )
#часовой пояс пока не учитываем
#Определить вид активности
lActivityDateTime = datetime . datetime . strptime ( lItem [ " time " ] , " % H: % M " )
if lItem [ " activityType " ] == " processStop " :
lActivityDateTime = lActivityDateTime . replace ( year = lCurrentDateTime . year , month = lCurrentDateTime . month , day = lCurrentDateTime . day )
#Вид активности - остановка процесса
#Убедиться в том, что время наступило
#Сформировать временной штамп, относительно которого надо будет проверять время
if (
#часовой пояс пока не учитываем
lActivityDateTime > = lDaemonStartDateTime and
lActivityDateTime = datetime . datetime . strptime ( lItem [ " time " ] , " % H: % M " )
lCurrentDateTime > = lActivityDateTime and
lActivityDateTime = lActivityDateTime . replace ( year = lCurrentDateTime . year , month = lCurrentDateTime . month , day = lCurrentDateTime . day )
( lItem [ " activityType " ] , lActivityDateTime , lItem [ " processName " ] ) not in lDaemonActivityLogDict ) :
#Убедиться в том, что время наступило
#Запись в массив отработанных активностей
if (
lDaemonActivityLogDict [ ( lItem [ " activityType " ] , lActivityDateTime , lItem [ " processName " ] ) ] = { " ActivityStartDateTime " : lCurrentDateTime }
lActivityDateTime > = lDaemonStartDateTime and
#Сформировать команду на завершение
lCurrentDateTime > = lActivityDateTime and
lActivityCloseCommand = ' taskkill /im ' + lItem [ " processName " ]
( lItem [ " activityType " ] , lActivityDateTime , lItem [ " processName " ] ) not in lDaemonActivityLogDict ) :
#TODO Сделать безопасную обработку,если параметра нет в конфигурации
#Запись в массив отработанных активностей
if lItem [ ' flagCloseForce ' ] :
lDaemonActivityLogDict [ ( lItem [ " activityType " ] , lActivityDateTime , lItem [ " processName " ] ) ] = { " ActivityStartDateTime " : lCurrentDateTime }
lActivityCloseCommand + = " /F "
#Сформировать команду на завершение
#Завершить процессы только текущего пользоваиеля
lActivityCloseCommand = ' taskkill /im ' + lItem [ " processName " ]
if lItem [ ' flagCloseOnlyCurrentUser ' ] :
#TODO Сделать безопасную обработку,если параметра нет в конфигурации
lActivityCloseCommand + = ' /fi " username eq %u sername % " '
if lItem . get ( ' flagCloseForce ' , False ) :
#Лог
lActivityCloseCommand + = " /F "
lGlobalDict [ " ActivityLogScheduleList " ] . append ( { " activityType " : lItem [ " activityType " ] , " activityDateTime " : str ( lActivityDateTime ) , " processPath " : lItem [ " processPath " ] , " activityStartDateTime " : str ( lCurrentDateTime ) } )
#Завершить процессы только текущего пользоваиеля
#Завершить процесс
if lItem . get ( ' flagCloseOnlyCurrentUser ' , False ) :
os . system ( lActivityCloseCommand )
lActivityCloseCommand + = ' /fi " username eq %u sername % " '
print ( datetime . datetime . now ( ) . isoformat ( ) + " :: ProcessStop " + lItem [ " processName " ] )
#Лог
#Вид активности - запуск отдельного потока с циклическим вызовом
lGlobalDict [ " ActivityLogScheduleList " ] . append ( { " activityType " : lItem [ " activityType " ] , " activityDateTime " : str ( lActivityDateTime ) , " processPath " : lItem [ " processName " ] , " activityStartDateTime " : str ( lCurrentDateTime ) } )
if lItem [ " activityType " ] == " loopActivity " :
#Завершить процесс
#Сформировать временной штамп, относительно которого надо будет проверять время
os . system ( lActivityCloseCommand )
#часовой пояс пока не учитываем
print ( datetime . datetime . now ( ) . isoformat ( ) + " :: ProcessStop " + lItem [ " processName " ] )
lActivityDateTime = datetime . datetime . strptime ( lItem [ " loopTimeStart " ] , " % H: % M " )
logging . info ( " ProcessStop " + lItem [ " processName " ] )
lActivityDateTime = lActivityDateTime . replace ( year = lCurrentDateTime . year , month = lCurrentDateTime . month , day = lCurrentDateTime . day )
#Вид активности - запуск отдельного потока с циклическим вызовом
#Убедиться в том, что время наступило
if lItem [ " activityType " ] == " loopActivity " :
if (
#Сформировать временной штамп, относительно которого надо будет проверять время
lActivityDateTime > = lDaemonStartDateTime and
#часовой пояс пока не учитываем
lCurrentDateTime > = lActivityDateTime and
lActivityDateTime = datetime . datetime . strptime ( lItem [ " loopTimeStart " ] , " % H: % M " )
( lItem [ " activityType " ] , lActivityDateTime , lItem [ " processPath " ] ) not in lDaemonActivityLogDict ) :
lActivityDateTime = lActivityDateTime . replace ( year = lCurrentDateTime . year , month = lCurrentDateTime . month , day = lCurrentDateTime . day )
#Запись в массив отработанных активностей
lDaemonActivityLogDict [ ( lItem [ " activityType " ] , lActivityDateTime , lItem [ " processPath " ] ) ] = { " ActivityStartDateTime " : lCurrentDateTime }
lActivityTimeEndDateTime = datetime . datetime . strptime ( lItem [ " loopTimeEnd " ] , " % H: % M " )
lActivityTimeEndDateTime = datetime . datetime . strptime ( lItem [ " loopTimeEnd " ] , " % H: % M " )
lActivityTimeEndDateTime = lActivityTimeEndDateTime . replace ( year = lCurrentDateTime . year , month = lCurrentDateTime . month , day = lCurrentDateTime . day )
lActivityTimeEndDateTime = lActivityTimeEndDateTime . replace ( year = lCurrentDateTime . year , month = lCurrentDateTime . month , day = lCurrentDateTime . day )
#Лог
#Убедиться в том, что время наступило
lGlobalDict [ " ActivityLogScheduleList " ] . append ( { " activityType " : lItem [ " activityType " ] , " activityDateTime " : str ( lActivityDateTime ) , " processPath " : lItem [ " processPath " ] , " activityStartDateTime " : str ( lCurrentDateTime ) } )
if (
#Запуск циклической процедуры
lCurrentDateTime < lActivityTimeEndDateTime and
orchestratorTimer . activityLoopStart ( lItem [ " loopSeconds " ] , lItem [ " processPath " ] , lItem [ " processArgs " ] , lActivityTimeEndDateTime , lItem [ " pythonPackageName " ] , lItem [ " pythonFunctionName " ] , lItem [ " pythonFunctionArgList " ] )
lCurrentDateTime > = lActivityDateTime and
( lItem [ " activityType " ] , lActivityDateTime , lItem [ " processPath " ] ) not in lDaemonActivityLogDict ) :
logging . info ( " ActivityLoop Start " )
#Запись в массив отработанных активностей
lDaemonActivityLogDict [ ( lItem [ " activityType " ] , lActivityDateTime , lItem [ " processPath " ] ) ] = { " ActivityStartDateTime " : lCurrentDateTime }
#Лог
lGlobalDict [ " ActivityLogScheduleList " ] . append ( { " activityType " : lItem [ " activityType " ] , " activityDateTime " : str ( lActivityDateTime ) , " processPath " : lItem [ " processPath " ] , " activityStartDateTime " : str ( lCurrentDateTime ) } )
#Запуск циклической процедуры
orchestratorTimer . activityLoopStart ( lItem [ " loopSeconds " ] , lItem [ " processPath " ] , lItem [ " processArgs " ] , lActivityTimeEndDateTime , lItem [ " pythonPackageName " ] , lItem [ " pythonFunctionName " ] , lItem [ " pythonFunctionArgList " ] )
#Уснуть до следующего прогона
#Уснуть до следующего прогона
time . sleep ( lDaemonLoopSeconds )
time . sleep ( lDaemonLoopSeconds )