Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gate win_osinfo and winservice #39370

Merged
merged 10 commits into from
Feb 17, 2017
52 changes: 25 additions & 27 deletions salt/utils/win_osinfo.py
Expand Up @@ -29,34 +29,32 @@ def __virtual__():
return 'win_osinfo'


class OSVERSIONINFO(ctypes.Structure):
_fields_ = (('dwOSVersionInfoSize', DWORD),
('dwMajorVersion', DWORD),
('dwMinorVersion', DWORD),
('dwBuildNumber', DWORD),
('dwPlatformId', DWORD),
('szCSDVersion', WCHAR * 128))

def __init__(self, *args, **kwds):
super(OSVERSIONINFO, self).__init__(*args, **kwds)
self.dwOSVersionInfoSize = ctypes.sizeof(self)
kernel32.GetVersionExW(ctypes.byref(self))


class OSVERSIONINFOEX(OSVERSIONINFO):
_fields_ = (('wServicePackMajor', WORD),
('wServicePackMinor', WORD),
('wSuiteMask', WORD),
('wProductType', BYTE),
('wReserved', BYTE))


def errcheck_bool(result, func, args):
if not result:
raise ctypes.WinError(ctypes.get_last_error())
return args

if HAS_WIN32:
class OSVERSIONINFO(ctypes.Structure):
_fields_ = (('dwOSVersionInfoSize', DWORD),
('dwMajorVersion', DWORD),
('dwMinorVersion', DWORD),
('dwBuildNumber', DWORD),
('dwPlatformId', DWORD),
('szCSDVersion', WCHAR * 128))

def __init__(self, *args, **kwds):
super(OSVERSIONINFO, self).__init__(*args, **kwds)
self.dwOSVersionInfoSize = ctypes.sizeof(self)
kernel32.GetVersionExW(ctypes.byref(self))

class OSVERSIONINFOEX(OSVERSIONINFO):
_fields_ = (('wServicePackMajor', WORD),
('wServicePackMinor', WORD),
('wSuiteMask', WORD),
('wProductType', BYTE),
('wReserved', BYTE))

def errcheck_bool(result, func, args):
if not result:
raise ctypes.WinError(ctypes.get_last_error())
return args

kernel32.GetVersionExW.errcheck = errcheck_bool
kernel32.GetVersionExW.argtypes = (ctypes.POINTER(OSVERSIONINFO),)

Expand Down
93 changes: 47 additions & 46 deletions salt/utils/winservice.py
Expand Up @@ -30,52 +30,53 @@ def __virtual__():
return 'winservice'


class Service(win32serviceutil.ServiceFramework):

_svc_name_ = '_unNamed'
_svc_display_name_ = '_Service Template'

def __init__(self, *args):
win32serviceutil.ServiceFramework.__init__(self, *args)
self.log('init')
self.stop_event = win32event.CreateEvent(None, 0, 0, None)

def log(self, msg):
import servicemanager
servicemanager.LogInfoMsg(str(msg))

def sleep(self, sec):
win32api.Sleep(sec * 1000, True)

def SvcDoRun(self): # pylint: disable=C0103
self.ReportServiceStatus(win32service.SERVICE_START_PENDING)
try:
self.ReportServiceStatus(win32service.SERVICE_RUNNING)
self.log('start')
self.start()
self.log('wait')
win32event.WaitForSingleObject(self.stop_event,
win32event.INFINITE)
self.log('done')
except Exception as err:
self.log('Exception: {0}'.format(err))
self.SvcStop()

def SvcStop(self): # pylint: disable=C0103
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
self.log('stopping')
self.stop()
self.log('stopped')
win32event.SetEvent(self.stop_event)
self.ReportServiceStatus(win32service.SERVICE_STOPPED)

# to be overridden
def start(self):
pass

# to be overridden
def stop(self):
pass
if HAS_WIN32:
class Service(win32serviceutil.ServiceFramework):

_svc_name_ = '_unNamed'
_svc_display_name_ = '_Service Template'

def __init__(self, *args):
win32serviceutil.ServiceFramework.__init__(self, *args)
self.log('init')
self.stop_event = win32event.CreateEvent(None, 0, 0, None)

def log(self, msg):
import servicemanager
servicemanager.LogInfoMsg(str(msg))

def sleep(self, sec):
win32api.Sleep(sec * 1000, True)

def SvcDoRun(self): # pylint: disable=C0103
self.ReportServiceStatus(win32service.SERVICE_START_PENDING)
try:
self.ReportServiceStatus(win32service.SERVICE_RUNNING)
self.log('start')
self.start()
self.log('wait')
win32event.WaitForSingleObject(self.stop_event,
win32event.INFINITE)
self.log('done')
except Exception as err:
self.log('Exception: {0}'.format(err))
self.SvcStop()

def SvcStop(self): # pylint: disable=C0103
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
self.log('stopping')
self.stop()
self.log('stopped')
win32event.SetEvent(self.stop_event)
self.ReportServiceStatus(win32service.SERVICE_STOPPED)

# to be overridden
def start(self):
pass

# to be overridden
def stop(self):
pass


def instart(cls, name, display_name=None, stay_alive=True):
Expand Down