1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| # A Windows service
import win32service
import win32event
import win32evtlog
import win32evtlogutil
import win32serviceutil
import win32process
import ConfigParser
import time, os, sys
from ftplib import FTP
class WinService (win32serviceutil.ServiceFramework):
_svc_name_ = "SMD"
_svc_display_name_ = "SMD"
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
# Evenement declenché lors de l'arret du service
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
# Evenement dont on se sert pour la boucle infinie
self.hService = win32event.CreateEvent(None, 0, 0, None)
self.log_type = "tmp.log"
def SvcStop(self):
# Arret
win32evtlogutil.ReportEvent(self.log_type, 2, eventType=win32evtlog.EVENTLOG_INFORMATION_TYPE, strings=[ _svc_display_name_ + " STOPPED"])
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
def SvcDoRun (self):
# Pas d'initialisation
# Declenche l'evenement hService qui permet de passer dans
# en continu dans la fonction DoBatch ()
win32evtlogutil.ReportEvent(self.log_type, 1, eventType=win32evtlog.EVENTLOG_INFORMATION_TYPE, strings=[ _svc_display_name_ + " STARTED"])
win32event.SetEvent (self.hService)
# Boucle
while 1:
# Attend une demande d'arret ou la fin de la tempo
rc = win32event.WaitForMultipleObjects((self.hWaitStop,
self.hService),
0, win32event.INFINITE)
# Arrete le service
if rc==win32event.WAIT_OBJECT_0:
# Stop event
break
# Traitement
else:
# Mon service !
self.DoBatch ()
win32event.SetEvent (self.hService)
# Fin
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING, 5000)
def DoBatch (self):
print " Le service fonctionne correctment"
if __name__=='__main__':
win32serviceutil.HandleCommandLine(WinService) |
Partager