import subprocess
import json
import datetime
import time
import codecs
import os
import signal
import pdb
import orchestratorServer



#Чтение конфигурации
lDaemonConfigurationFile = codecs.open("orchestratorConfiguration.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 = orchestratorServer.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)

