a oe @slddlZddlZddlZddlZddlZddlZddlZddlZddlZdej j vrXdndZ e Z d>ddZddZd d Zd d Zd?d dZddZd@ddZdAddZddZddZdBddZddZdCddZdd Zd!d"ZdDd#d$ZdEd&d'ZdFd(d)ZdGd*d+Z dHd,d-Z!dId.d/Z"d0d1Z#gfd2d3Z$dJd4d5Z%dKd6d7Z&d8d9Z'dLd:d;Z(Gd ''z Can't find ' pywintypesrz.dllzcopying helper dll ')hasattrsys executableospathisfilewin32apiGetFullPathNamerjoin exec_prefixdirname win32service__file__existsprintZCopyFileerrorZGetModuleFileName dllhandle version_infor)ZexeZcorrectmaybeZ python_dllZpywZ correct_pywr;C:\Program Files\Certbot\pkgs\win32\lib\win32serviceutil.pyLocatePythonServiceExes*         rc CstjtjBtjB}ttjdd|}t|d}|}t d|D]d}t ||}t||d|}z.t t |dd}||kr|WSWqDtj yYqD0qDdS)N!SYSTEM\CurrentControlSet\ServicesrZ DisplayName)win32conKEY_READKEY_ENUMERATE_SUB_KEYSKEY_QUERY_VALUEr RegOpenKeyHKEY_LOCAL_MACHINEZRegQueryInfoKeylowerrange RegEnumKeystrRegQueryValueExr)ZlongNameaccesshkeynumxsvcZskeyZthisNamerrr_GetServiceShortNameKs"   r/c Csfzt|||WStjyJ}z |jtjtjfvr6WYd}~n d}~00t||}t|||SN)r OpenServicerrwinerrorZERROR_SERVICE_DOES_NOT_EXISTZERROR_INVALID_NAMEZGetServiceKeyName)hscmnamer*detailsrrrSmartOpenServicehs r6cCsBttjd|dtj}zt|ddW|S|0dS)N$SYSTEM\CurrentControlSet\Services\%srZ ImagePath)rr#rr$KEY_ALL_ACCESSr)Close) serviceNamer+rrrLocateSpecificServiceExeusr;c Cs|stddd|}|s\z0tjtjtjdd}tj|rF|}Wnt yZYn0|sht dt |}t t jd|dt j}zt|d}z^t|d dt j|t|d dt jd t|d dt jd t|ddt jdWt|n t|0Wt|n t|0z^ddl}tj|\}}t} |rPt|z|d|Wt| n t| 0Wn:tjy} ztdtd| WYd} ~ n d} ~ 00dS)NPythonZdllrrzperfmondata.dllz1The name of the performance DLL must be availabler7Z PerformanceLibraryZOpenZOpenPerformanceDatar9ZClosePerformanceDataZCollectZCollectPerformanceData python.exe z9The service was installed OK, but the performance monitorzdata could not be loaded.)rZ GetProfileValr r rsplitrrr AttributeError ValueErrorrr#rr$r8 RegCreateKey RegSetValueExREG_SZ RegCloseKeyperfmongetcwdchdirZLoadPerfCounterTextStringsrr) r:ZiniNameZdllNameZtryNamer+ZsubKeyrFr fnameZoldPathr5rrrInstallPerfmonForServices^        rJcCs|dur|d|S|SdS)N r)exeNameexeArgsrrr_GetCommandLines rNcCs4|durtj}tj}|r"|tjB}|dur0tj}dt| } t| | }tddtj}zt |||tj ||||dd||| }| durzt |tj | Wnt yYn0|durzt |tj|Wn"tjt fytdYn0t|Wt|n t|0t||| dur0t|| | dS)N"%s"r*Delayed Start not available on this system)rSERVICE_DEMAND_STARTSERVICE_WIN32_OWN_PROCESSSERVICE_INTERACTIVE_PROCESSZSERVICE_ERROR_NORMALrrN OpenSCManagerSC_MANAGER_ALL_ACCESSZ CreateServiceSERVICE_ALL_ACCESSChangeServiceConfig2SERVICE_CONFIG_DESCRIPTIONNotImplementedError&SERVICE_CONFIG_DELAYED_AUTO_START_INFOrwarningswarnCloseServiceHandleInstallPythonClassStringrJ)pythonClassStringr: displayName startType errorControlbRunInteractive serviceDepsuserNamepasswordrL perfMonIni perfMonDllrM description delayedstart serviceType commandLiner3hsrrrInstallServices^       rnc Cszddl}|d|Wnttjfy2Yn0dt|}|durNtj}|dur\tj}tddtj }tj }|r|tj B}t || }zt ||tj}zt|||||dd|||| | durzt|tj| WntyYn0|dur4zt|tj|Wn*tjtfy2|r.tdYn0Wt|n t|0Wt|n t|0t||| durt|| | dS)Nrr>rOrP)rFUnloadPerfCounterTextStrings ImportErrorrrrrZSERVICE_NO_CHANGErTrUrRrSrNr6rVChangeServiceConfigrWrXrYrZr[r\r]r^rJ)r_r:rarbrcrdrerfrLr`rgrhrMrirjrFr3rkrlrmrrrrq sj        rqc CsH|rDttjd|}z t|dtj|Wt|n t|0dS)Nz0System\CurrentControlSet\Services\%s\PythonClass)rrBrr$Z RegSetValuerDrE)r_r:keyrrrr^bsr^c Csz |j}WntyYn0ttjd|}zHt|tdkrXt||dtj|nt||dtj |Wt |n t |0dSNz/System\CurrentControlSet\Services\%s\Parametersr) _svc_name_r@rrBrr$typerC REG_DWORDrDrE)r:optionvaluerrrrrSetServiceCustomOptionps  ryc Csz |j}WntyYn0ttjd|}zRzt||dWWt|Stjyt|YWt|S0Wt|n t|0dSrs) rtr@rrBrr$r)rEr)r:rwZ defaultValuerrrrrGetServiceCustomOptions$    rzc Cszddl}|d|Wnttjfy2Yn0tddtj}z0t||tj }t |t |Wt |n t |0ddl }z| |WntjyYn0dS)Nrr>)rFrorprrrrTrUr6rVZ DeleteServicer]win32evtlogutilZRemoveSourceFromRegistry)r:rFr3rmr{rrr RemoveServices   r|c Csft|dtj}zDt||tj}zt||}Wt|n t|0Wt|n t|0|Sr0)rrTrUr6rVControlServicer])r:codemachiner3rmstatusrrrr}sr}c Cst|tjurt|}i}ttjd}d}zt||}Wntj yTYqYn0|d}t||}zt |d\}}Wntj yd}Yn0|D]*}| }| |g} | || ||<qq,t||S)NrrrZDependOnServicer)rurZ UnicodeTyper(rr#rr$r'rr)r%getappend __ResolveDeps) findNamedictkr,r.skdepstypdepZdep_onrrr __FindSvcDepss.      rcCs<||g}g}|D]}|d|t|||}q|SNr)rr%insertr)rritemsZretListr.rrrrs  rcCsZt|dD](}t||d}||kr*qVtdq ttjdttjdddS)z|Waits for the service to return the specified status. You should have already requested the service to enter that staterQueryServiceStatusN) r&rrSleeprrr2ERROR_SERVICE_REQUEST_TIMEOUT FormatMessage)r:rwaitSecsriZ now_statusrrrWaitForServiceStatuss rc Cszt|tj}Wn4tjyF}z|jtjkr2WYd}~n d}~00t|D]*}t|}|dtj krpqt dqPttj dt tj dddS)Nrr}r)rr}SERVICE_CONTROL_STOPrrr2ERROR_SERVICE_NOT_ACTIVEr&rSERVICE_STOPPEDrrrr)rmrrexcrrrr__StopServiceWithTimeouts    rc Cst|dtj}zt|}|D]:}t||tj}zt||Wt|qt|0qt||tj}zt||Wt|n t|0Wt|n t|0dSr0)rrTrUrr1rVrr])r:rrr3rrrmrrrStopServiceWithDepss  rcCst|tj|Sr0)r}rr)r:rrrr StopServicesrc Csft|dtj}zDt||tj}zt||Wt|n t|0Wt|n t|0dSr0)rrTrUr6rV StartServicer])r:argsrr3rmrrrrsrc Cszt||Wn4tjyB}z|jtjkr.WYd}~n d}~00t|D]Z}zt|||WqWqLtjy}z$|jtjkrt dWYd}~qLd}~00qLt ddS)zXStop the service, and then start it again (with some tolerance for allowing it to stop.)Nrz,Gave up waiting for the old service to stop!) rrrr2rr&rZERROR_SERVICE_ALREADY_RUNNINGrrr)r:rZ waitSecondsrrrrrrRestartService+s     "rcCs0|tjtjfvr,tsJtdtdSdS)NzStopping debug service.TF)r CTRL_C_EVENTCTRL_BREAK_EVENTg_debugServicerSvcStop)Zevtrrr_DebugCtrlHandler@s rc Csddl}td|jf|d||||attdz&t Wttd|ddanttd|dda0dS)Nrz,Debugging service %s - press Ctrl+C to stop.TF) servicemanagerrrtZ DebuggingZPrepareToHostSinglerrZSetConsoleCtrlHandlerrSvcRun)clsargvrrrr DebugServiceIs        rcCs|durtj}ddl}|||j}|dkrzNt|d}tj |d}t |}t |dkrxtj ||dd}Wn$tj yt d|dYn0tj|d}|d|jS)Nr__main__z3Could not resolve the path name '%s' to a full path.)r rpickleZ whichmodule__name__rrr r r?Z FindFileslenrrsplitext)rrrZmodNamerIr ZfilelistrrrGetServiceClassStringas"   rc Csdt|dtj}zBt||tj}zt|}Wt|n t|0Wt|n t|0|Sr0)rrTZSC_MANAGER_CONNECTr6ZSERVICE_QUERY_STATUSrr])r:rr3rmrrrrr{s rcCsztjtjdd}Wntjd}Yn0td|tdtdtdtdtdtd td td td td tdtdtdtddS)NrrzVUsage: '%s [options] install|update|remove|start [...]|stop|restart [...]|debug [...]'z1Options for 'install' and 'update' commands only:zF --username domain\username : The Username the service is to run underz4 --password password : The password for the usernamezT --startup [manual|auto|disabled|delayed] : How the service starts, default = manualz@ --interactive : Allow the service to interact with the desktop.zM --perfmonini file: .ini file to use for registering performance monitor datazB --perfmondll file: .dll file to use when querying the service forz. performance data, default = perfmondata.dllz-Options for 'start' and 'stop' commands only:z@ --wait seconds: Wait for the service to actually start or stop.zJ If you specify --wait with the 'stop' option, the servicezI and all dependent services will be stopped, each waitingz& the specified period.)r r r?r rrexit)rIrrrusages6rc Csfd}|durtj}t|dkr$t|j}|j}|dur@t|}ddl}z"||dd|gd\} } Wn4|jy} zt | tWYd} ~ n d} ~ 00d} d} d}}d}d}d}d}| D]\}}|dkr|} q|dkr|} q|dkr|}q|dkr|}q|d krd}q|d krt j t j t j t j d }z||}Wn tyht d |Yn0|d kr~d}n|dkrd}q|dkrz t|}Wqtyt dtYq0q| d}d}|dkr^d}t d|z*t|| dd|rt|t j|Wn<t jyX}z t d|j|j}WYd}~n d}~00n|dkrd}t d|t|| dd|rft|t j|n|dkrfd}ttds\d| dd}z t|}WnRtjy*}z6|jtjkrt dt dtdWYd}~n d}~00ztd|||fWnt yXYn0n t!|| |st| dkrt|dkr(d}z |j"}Wnt#yd}Yn0z |j$}Wnt#yd}Yn0z |j%}Wnt#yd}Yn0z |j&}Wnt#yd}Yn0t d|fz@t'||||||| | ||||||d |rb|| ft d!Wnt jy}z:|jtj(krd"}nt d#|j|jf|j}WYd}~nnd}~0ty&}zLt d$t)|d%}z t*|Wntjyt d&Yn0WYd}~n d}~00|d"krTd}z |j"}Wnt#yXd}Yn0z |j$}Wnt#y|d}Yn0z |j%}Wnt#yd}Yn0z |j&}Wnt#yd}Yn0t d'z@t+|||||| | |||||||d(|r|| ft d)WnBt jyP}z&t d*|j|jf|j}WYd}~n d}~00n|d+krd}t d,|zt*|t d-WnBt jy}z&t d.|j|jf|j}WYd}~n d}~00n~|d/krFd}t d0|z |rt,||d1nt-|WnBt jyD}z&t d2|j|jf|j}WYd}~n d}~00|sbd%}t d3|t|S)4aoUtility function allowing services to process the command line. Allows standard commands such as 'start', 'stop', 'debug', 'install' etc. Install supports 'standard' command line options prefixed with '--', such as --username, --password, etc. In addition, the function allows custom command line options to be handled by the calling function. rNr)z password=z username=zstartup=z perfmonini=z perfmondll= interactivezwait=z --usernamez --passwordz --perfmoniniz --perfmondllz --interactivez --startup)ZmanualautodelayedZdisabledz"'%s' is not a valid startup optionrTrFz--waitz1--wait must specify an integer number of seconds.startzStarting service %szError starting service: %sZrestartzRestarting service %sdebugrrKz,The service does not appear to be installed.z/Please install the service before debugging it.z%s -debug %s %sinstallzInstalling service %s) rdrarcrerfrLrgrhrMrirjzService installedupdatez!Error installing service: %s (%d)zError installing service: %sz;Warning - could not remove the partially installed service.zChanging service configuration) rdrarcrerfrLr`rgrhrMrirjzService updatedz-Error changing service configuration: %s (%d)removezRemoving service %szService removedzError removing service: %s (%d)stopzStopping service %s)rzError stopping service: %s (%d)zUnknown command - '%s').r rrrrtZ_svc_display_name_rgetoptrrrrQZSERVICE_AUTO_STARTZSERVICE_DISABLEDr%KeyErrorintrArrSERVICE_RUNNINGstrerrorr2rrrr;rZERROR_FILE_NOT_FOUNDrr systemKeyboardInterruptr _svc_deps_r@ _exe_name_ _exe_args__svc_description_rnZERROR_SERVICE_EXISTSr(r|rqrr) rZserviceClassStringrZcustomInstallOptionsZcustomOptionHandlererrr:ZserviceDisplayNamerZoptsrr5rerfrgrhZstartuprjrroptvalmapargZknownArgrZsvcArgsrLrdrMrimsgrrrHandleCommandLines                             $                   rc@sfeZdZdZdZdZdZddZddZddd Z d d Z d d Z ddZ ddZ ddZddZdS)ServiceFrameworkNcCs4ddl}||d|jd|_||jd|_dS)NrT)rZRegisterServiceCtrlHandlerServiceCtrlHandlerExsshZSetEventSourceNamert checkPoint)selfrrrrr__init__s   zServiceFramework.__init__cCsNd}t|dr|tjB}t|dr6t|dr6|tjB}t|drJ|tjB}|S)NrrSvcPause SvcContinue SvcShutdown)rrZSERVICE_ACCEPT_STOPZSERVICE_ACCEPT_PAUSE_CONTINUEZSERVICE_ACCEPT_SHUTDOWN)racceptedrrrGetAcceptedControlss     z$ServiceFramework.GetAcceptedControlsrcCst|jdurdS|tjkrd}n|}|tjtjfvr s .  <  J U