1"""Run through the old agent's detached spawn endpoint in a disposable clone."""
2import os
3import ctypes
4from ctypes import wintypes
5import subprocess
6import sys
7import time
8
9if len(sys.argv) != 2 or not sys.argv[1].startswith('ONE-M6-') or os.environ.get('COMPUTERNAME') != sys.argv[1]:
10 raise SystemExit('The disposable clone hostname does not match.')
11parent = os.getppid()
12kernel = ctypes.WinDLL('kernel32', use_last_error=True)
13kernel.OpenProcess.argtypes = (wintypes.DWORD, wintypes.BOOL, wintypes.DWORD)
14kernel.OpenProcess.restype = wintypes.HANDLE
15kernel.TerminateProcess.argtypes = (wintypes.HANDLE, wintypes.UINT)
16kernel.TerminateProcess.restype = wintypes.BOOL
17kernel.WaitForSingleObject.argtypes = (wintypes.HANDLE, wintypes.DWORD)
18kernel.WaitForSingleObject.restype = wintypes.DWORD
19kernel.CloseHandle.argtypes = (wintypes.HANDLE,)
20kernel.CloseHandle.restype = wintypes.BOOL
21handle = kernel.OpenProcess(0x100001, False, parent)
22if not handle:
23 raise ctypes.WinError(ctypes.get_last_error())
24time.sleep(0.5)
25try:
26 if not kernel.TerminateProcess(handle, 0):
27 raise ctypes.WinError(ctypes.get_last_error())
28 if kernel.WaitForSingleObject(handle, 5000) != 0:
29 raise RuntimeError('The old agent did not terminate.')
30finally:
31 kernel.CloseHandle(handle)
32with open(r'C:\one-tests\agent-restart.log', 'ab') as log:
33 subprocess.Popen([sys.executable, r'C:\win7-agent\agent.py'], stdin=subprocess.DEVNULL,
34 stdout=log, stderr=log, close_fds=True,
35 creationflags=subprocess.DETACHED_PROCESS | subprocess.CREATE_NEW_PROCESS_GROUP)