# Imports
import os
import ctypes
import subprocess
from datetime import datetime
from datetime import timedelta


# Classes
class DisableFileSystemRedirection():
    _disable = ctypes.windll.kernel32.Wow64DisableWow64FsRedirection
    _revert = ctypes.windll.kernel32.Wow64RevertWow64FsRedirection

    def __enter__(self):
        self.old_value = ctypes.c_long()
        self.success = self._disable(ctypes.byref(self.old_value))

    def __exit__(self, type, value, traceback):
        if self.success:
            self._revert(self.old_value)


# Definitions
def ExecuteCmd(cmd):
    with DisableFileSystemRedirection():
        obj = subprocess.Popen(["powershell", cmd], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        out, err = obj.communicate()
        return out, err


# Logic
Current_time = datetime.now()

Date = datetime.strftime(Current_time, "%Y-%m-%d")
TimeForTask = Current_time + timedelta(seconds=60)
Time = datetime.strftime(TimeForTask, "%H:%M:%S")

XML = r'''<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <Triggers>
    <TimeTrigger>
''' + '      <StartBoundary>' + Date + 'T' + Time + '</StartBoundary>' + '''
      <Enabled>true</Enabled>
    </TimeTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>S-1-5-18</UserId>
      <RunLevel>LeastPrivilege</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>PT72H</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>net</Command>
      <Arguments>stop ITSMService</Arguments>
    </Exec>
    <Exec>
      <Command>net</Command>
      <Arguments>stop RMMService</Arguments>
    </Exec>
    <Exec>
      <Command>net</Command>
      <Arguments>stop CPMService</Arguments>
    </Exec>
    <Exec>
      <Command>net</Command>
      <Arguments>start ITSMService</Arguments>
    </Exec>
    <Exec>
      <Command>net</Command>
      <Arguments>start RMMService</Arguments>
    </Exec>
    <Exec>
      <Command>net</Command>
      <Arguments>start CPMService</Arguments>
    </Exec>
    <Exec>
      <Command>schtasks</Command>
      <Arguments>/delete /TN "Restart Comodo Services" /f</Arguments>
    </Exec>
  </Actions>
</Task>'''

ITSMPATH = os.path.dirname(
    ExecuteCmd(r'(Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\ITSMService -Name '
               r'"ImagePath").ImagePath')[0]).replace('"', '')

if os.path.exists(ITSMPATH):
    ConfigPath = ITSMPATH + r'\TaskXMLConfig.xml'
    print "Chosen path: " + ConfigPath

    with open(ConfigPath, "w") as f:
        f.write(XML)
        f.close()
    result = ExecuteCmd(r'schtasks /create /tn "Restart Comodo Services" /XML ' + '"' + ConfigPath + '"')[0]
    if '"Restart Comodo Services" has successfully been created' in result:
        print result
    else:
        print "Restart Comodo Services not created"
    os.remove(ConfigPath)
else:
    print "ITSMService does not exists"
