3 À<×eá)ã@sÜddlmZddlZddljZddlTddlZddlZddlZ ddl m Z e j j ƒZe ƒZGdd„dƒZGdd „d ƒZGd d „d eƒZGd d „d eƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„dejƒZdS)é)ÚbaseéN)Ú*)Úcommandsc@seZdZddd„ZdS)ÚServiceNcCs||_||_||_||_dS)N)ÚenableÚstartÚcfg_fileÚrunlevel)Úselfrrr r ©r ú$/usr/lib/python3.6/plugin_service.pyÚ__init__szService.__init__)NNNN)Ú__name__Ú __module__Ú __qualname__rr r r r r src@s4eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd S) Ú InitHandlercCs(tjdgƒ\}}|dkr$|jƒdSdS)Nr rréÿÿÿÿ)ÚcmdÚexecuteÚsplit)r ÚretcodeÚoutr r r Ú runlevel_getszInitHandler.runlevel_getcCstjddgƒdS)NZtelinitÚq)rr)r r r r Ú daemon_reloadszInitHandler.daemon_reloadcCsdS)Nr )r Únamer r r r Ú cfg_installszInitHandler.cfg_installcCsdS)Nr )r rr r r r Ú cfg_uninstallszInitHandler.cfg_uninstallcCsdS)Nr )r rr r r r Ú cfg_verify"szInitHandler.cfg_verifyN)rrrrrrrrr r r r rs rc@s<eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd S)ÚSysVBasicHandlercCstjd|dgƒdS)NÚservicer)rr)r rr r r r'szSysVBasicHandler.startcCstjd|dgƒdS)Nr!Ústop)rr)r rr r r r"*szSysVBasicHandler.stopcCs tƒ‚dS)N)ÚNotImplementedError)r rr r r r r-szSysVBasicHandler.enablecCs tƒ‚dS)N)r#)r rr r r r Údisable0szSysVBasicHandler.disablecCs"tjd|dgdgd�\}}|dkS)Nr!Ústatusr)Ú no_errors)rr)r rrrr r r Ú is_running3szSysVBasicHandler.is_runningcCs tƒ‚dS)N)r#)r rr r r r Ú is_enabled7szSysVBasicHandler.is_enabledN) rrrrr"rr$r'r(r r r r r &s r c@s$eZdZdd„Zdd„Zdd„ZdS)Ú SysVHandlercCstjdd||dgƒdS)NÚ chkconfigz--levelÚon)rr)r rr r r r r;szSysVHandler.enablecCstjdd||dgƒdS)Nr*z--levelÚoff)rr)r rr r r r r$>szSysVHandler.disablecCsBtjdd|gƒ\}}|dkr>|jdt|ƒƒddd…dkSdS)Nr*z--listrz%s:rér+)rrrÚstr)r rr rrr r r r(AszSysVHandler.is_enabledN)rrrrr$r(r r r r r):sr)c@s$eZdZdd„Zdd„Zdd„ZdS)Ú SysVRCHandlercCstjdd||dgƒdS)Nz sysv-rc-confz--levelr+)rr)r rr r r r rFszSysVRCHandler.enablecCstjdd||dgƒdS)Nz sysv-rc-confz--levelr,)rr)r rr r r r r$IszSysVRCHandler.disablecCsBtjdd|gƒ\}}|dkr>|jdt|ƒƒddd…dkSdS)Nz sysv-rc-confz--listrz%s:rr-r+)rrrr.)r rr rrr r r r(LszSysVRCHandler.is_enabledN)rrrrr$r(r r r r r/Esr/c@sDeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dS)Ú OpenRCHandlercCs&tjddgƒ\}}|dkr"|jƒSdS)Nz rc-statusz-rr)rrÚstrip)r rrr r r rQszOpenRCHandler.runlevel_getcCstjd|dgƒdS)Nz rc-servicer)rr)r rr r r rUszOpenRCHandler.startcCstjd|dgƒdS)Nz rc-servicer")rr)r rr r r r"XszOpenRCHandler.stopcCstjdd||gƒdS)Nz rc-updateÚadd)rr)r rr r r r r[szOpenRCHandler.enablecCstjdd||gƒdS)Nz rc-updateÚdel)rr)r rr r r r r$^szOpenRCHandler.disablecCs"tjd|dgdgd�\}}|dkS)Nz rc-servicer%r)r&)rr)r rrrr r r r'aszOpenRCHandler.is_runningcCs2tjdd|gƒ\}}ttjdtj|ƒd|ƒƒS)Nz rc-updateZshowz\b)rrÚboolÚreÚsearchÚescape)r rr rrr r r r(eszOpenRCHandler.is_enabledN) rrrrrr"rr$r'r(r r r r r0Psr0c@s\eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dS)ÚSystemdHandlercCsdS)NÚr )r r r r rkszSystemdHandler.runlevel_getcCstjdd|gƒdS)NÚ systemctlZrestart)rr)r rr r r rnszSystemdHandler.startcCstjdd|gƒdS)Nr:r")rr)r rr r r r"qszSystemdHandler.stopcCstjdd|gƒdS)Nr:r)rr)r rr r r r rtszSystemdHandler.enablecCstjdd|gƒdS)Nr:r$)rr)r rr r r r r$wszSystemdHandler.disablecCs"tjdd|gdgd�\}}|dkS)Nr:z is-activer)r&)rr)r rrrr r r r'zszSystemdHandler.is_runningcCs>tjdd|gdgd�\}}|jƒ}|dkr.dS|dkr:dSdS) Nr:z is-enabledr)r&ZenabledTZdisabledF)rrr1)r rr rrr%r r r r(~szSystemdHandler.is_enabledcCs˜tjd||fƒtjj|ƒs0tjd|ƒdStj|}ytj|tj ƒWn2t k r~}ztjd||fƒdSd}~XnXt j ||ƒ|j ƒdS)NzCinstalling service configuration overlay file '%s' for service '%s'z)Unable to find service configuration '%s'z#Unable to create directory '%s': %s)ÚlogÚinfoÚosÚpathÚexistsÚerrorÚconstsÚSERVICE_SYSTEMD_CFG_PATHÚmakedirsZDEF_SERVICE_CFG_DIR_MODEÚOSErrorrÚcopyr)r rr ÚdirpathÚer r r rƒs   zSystemdHandler.cfg_installc Csntjd||fƒtj|}d|tjj|ƒf}tj|ƒ|j ƒytj |ƒWnt t fk rhYnXdS)NzEuninstalling service configuration overlay file '%s' for service '%s'z%s/%s) r;r<rArBr=r>ÚbasenamerÚunlinkrÚrmdirÚFileNotFoundErrorrD)r rr rFr>r r r r‘s  zSystemdHandler.cfg_uninstallcCs†|dkr dSdtj|tjj|ƒf}tjj|ƒsHtjd||fƒdStjj|ƒsjtjd||fƒdStj |ƒ}tj |ƒ}||kS)Nz%s/%sz.Unable to find service '%s' configuration '%s'Fz0Service '%s' configuration not installed in '%s') rArBr=r>rHr?r;r@rZ sha256sum)r rr r>Z sha256sum1Z sha256sum2r r r r�s    zSystemdHandler.cfg_verifyN) rrrrrr"rr$r'r(rrrr r r r r8is r8csneZdZdZ‡fdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z e jfdd„Z‡ZS)Ú ServicePlugina1 `service`:: Plug-in for handling sysvinit, sysv-rc, openrc and systemd services. + The syntax is as follows: + [subs="+quotes,+macros"] ---- [service] service.__service_name__=__commands__[,file:__file__] ---- + Supported service-handling `_commands_` are `start`, `stop`, `enable` and `disable`. The optional `file:__file__` directive installs an overlay configuration file `__file__`. Multiple commands must be comma (`,`) or semicolon (`;`) separated. If the directives conflict, the last one is used. + The service plugin supports configuration overlays only for systemd. In other init systems, this directive is ignored. The configuration overlay files are copied to `/etc/systemd/system/__service_name__.service.d/` directories. Upon profile unloading, the directory is removed if it is empty. + With systemd, the `start` command is implemented by `restart` in order to allow loading of the service configuration file overlay. + NOTE: With non-systemd init systems, the plug-in operates on the current runlevel only. + .Start and enable the `sendmail` service with an overlay file ==== ---- [service] service.sendmail=start,enable,file:${i:PROFILE_DIR}/tuned-sendmail.conf ---- The internal variable `${i:PROFILE_DIR}` points to the directory from which the profile is loaded. ==== cs&tt|ƒj||Žd|_|jƒ|_dS)NT)ÚsuperrLrZ_has_dynamic_optionsÚ_detect_init_systemÚ _init_handler)r ÚargsÚkwargs)Ú __class__r r rÕszServicePlugin.__init__cCstj|dgd�\}}|dkS)Nr)r&)rr)r Zcommandrrr r r Ú _check_cmdÚszServicePlugin._check_cmdcCs„|jddgƒrtjdƒtƒS|jdgƒr:tjdƒtƒS|jddgƒrXtjdƒtƒS|jd dgƒrvtjd ƒtƒStjd ƒ‚dS) Nr:r%zdetected systemdr*zdetected generic sysvinitz update-rc.dz-hzdetected sysv-rcz rc-updatezdetected openrcz8Unable to detect your init system, disabling the plugin.) rSr;Údebugr8r)r/r0Ú exceptionsZNotSupportedPluginException)r r r r rNÞs     z!ServicePlugin._detect_init_systemcCs–tjd|ƒ}tƒ}x~|D]v}|dkr,d|_q|dkrsz0ServicePlugin._instance_init..)Z_has_dynamic_tuningZ_has_static_tuningÚ collectionsÚ OrderedDictZoptionsÚitemsÚ _servicesÚ_services_original)r Úinstancer )r r Ú_instance_inits zServicePlugin._instance_initcCsdS)Nr )r rfr r r Ú_instance_cleanup szServicePlugin._instance_cleanupcCsT|r|jj|ƒn|dk r&|jj|ƒ|r:|jj||ƒn|dk rP|jj||ƒdS)N)rOrr"rr$)r rrrr r r r Ú_process_service s zServicePlugin._process_servicecCsº|jjƒ}|dkr tjdƒdSx”|jjƒD]†}|jj|d|ƒ}|jj|dƒ}t|||dj |ƒ|j |d<|dj r’|jj |d|dj ƒ|j |d|dj |dj|ƒq,WdS)NzCannot detect runlevelrr)rOrr;r@rdrcr(r'rr rerrirr)r rfr r!r(r'r r r Ú_instance_apply_statics   z$ServicePlugin._instance_apply_staticc CsH|jjƒ}|dkr&tjtjdƒdSd}�x|jjƒD�]}|jj|d|dj ƒ}|r~tj tj d|d|dj fƒnR|dk r®tjtjd|d|dj fƒd}n"tj tj d|d|dj fƒ|jj |d|ƒ}|jj|dƒ} |jd |d|dj| |ƒdk�rd}|jd |d|dj||ƒdkr8d}q8W|S) Nzcannot detect runlevelFTrrz'service '%s' configuration '%s' matchesz'service '%s' configuration '%s' differszservice '%s' configuration '%s'z %s runningz %s enabled)rOrr;r@rAZSTR_VERIFY_PROFILE_FAILrdrcrr r<ZSTR_VERIFY_PROFILE_OKZ STR_VERIFY_PROFILE_VALUE_MISSINGr(r'Z _verify_valuerr) r rfZignore_missingZdevicesr Úretr!Zret_cfg_verifyr(r'r r r Ú_instance_verify_static$s( $""$"z%ServicePlugin._instance_verify_staticcCsLxFt|jjƒƒD]4\}}|jr.|jj||jƒ|j||j|j|j ƒqWdS)N) Úlistrercr rOrrirrr )r rfZrollbackrr_r r r Ú_instance_unapply_static<sz&ServicePlugin._instance_unapply_static)rrrÚ__doc__rrSrNrZrgrhrirjrlrAZ ROLLBACK_SOFTrnÚ __classcell__r r )rRr rL«s(   rL)r9rraZ tuned.constsrAZ decoratorsr=r5Z tuned.logsZtunedZtuned.utils.commandsrZlogsÚgetr;rrrr r)r/r0r8ZPluginrLr r r r Ús"      B