o
    •Û_å$  ã                   @   sÞ   d dl mZ ddlZddlmZ d dlT ddlZddlZddlZ	ddl
mZ e	j ¡ Zeƒ ZG dd„ dƒZG dd	„ d	ƒZG d
d„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ dejƒZdS )é   )Úbaseé    N)Ú*)Úcommandsc                   @   s   e Zd Zddd„ZdS )ÚServiceNc                 C   s   || _ || _|| _|| _d S ©N)ÚenableÚstartÚcfg_fileÚrunlevel)Úselfr	   r   r
   r   © r   ú>/usr/lib/python3/dist-packages/tuned/plugins/plugin_service.pyÚ__init__   s   
zService.__init__)NNNN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r      s    r   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚInitHandlerc                 C   s(   t  dg¡\}}|dkr| ¡ d S d S )Nr   r   éÿÿÿÿ)ÚcmdÚexecuteÚsplit©r   ÚretcodeÚoutr   r   r   Úrunlevel_get   s   zInitHandler.runlevel_getc                 C   s   t  ddg¡ d S )NÚtelinitÚq©r   r   ©r   r   r   r   Údaemon_reload   s   zInitHandler.daemon_reloadc                 C   ó   d S r   r   ©r   Únamer
   r   r   r   Úcfg_install   ó   zInitHandler.cfg_installc                 C   r!   r   r   r"   r   r   r   Úcfg_uninstall   r%   zInitHandler.cfg_uninstallc                 C   r!   r   r   r"   r   r   r   Ú
cfg_verify"   r%   zInitHandler.cfg_verifyN)r   r   r   r   r    r$   r&   r'   r   r   r   r   r      s    r   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚSysVBasicHandlerc                 C   ó   t  d|dg¡ d S )NÚservicer	   r   ©r   r#   r   r   r   r	   '   ó   zSysVBasicHandler.startc                 C   r)   )Nr*   Ústopr   r+   r   r   r   r-   *   r,   zSysVBasicHandler.stopc                 C   ó   t ƒ ‚r   ©ÚNotImplementedError©r   r#   r   r   r   r   r   -   ó   zSysVBasicHandler.enablec                 C   r.   r   r/   r1   r   r   r   Údisable0   r2   zSysVBasicHandler.disablec                 C   ó"   t jd|dgdgd\}}|dkS )Nr*   Ústatusr   ©Ú	no_errorsr   ©r   r#   r   r   r   r   r   Ú
is_running3   ó   zSysVBasicHandler.is_runningc                 C   r.   r   r/   r1   r   r   r   Ú
is_enabled7   r2   zSysVBasicHandler.is_enabledN)	r   r   r   r	   r-   r   r3   r9   r;   r   r   r   r   r(   &   s    r(   c                   @   ó$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚSysVHandlerc                 C   ó   t  dd||dg¡ d S )NÚ	chkconfigú--levelÚonr   r1   r   r   r   r   ;   ó   zSysVHandler.enablec                 C   r>   )Nr?   r@   Úoffr   r1   r   r   r   r3   >   rB   zSysVHandler.disablec                 C   óB   t  dd|g¡\}}|dkr| dt|ƒ ¡d d d… dkS d S )Nr?   ú--listr   ú%s:r   é   rA   ©r   r   r   Ústr©r   r#   r   r   r   r   r   r   r;   A   ó   .zSysVHandler.is_enabledN©r   r   r   r   r3   r;   r   r   r   r   r=   :   ó    r=   c                   @   r<   )ÚSysVRCHandlerc                 C   r>   )Núsysv-rc-confr@   rA   r   r1   r   r   r   r   F   rB   zSysVRCHandler.enablec                 C   r>   )NrO   r@   rC   r   r1   r   r   r   r3   I   rB   zSysVRCHandler.disablec                 C   rD   )NrO   rE   r   rF   r   rG   rA   rH   rJ   r   r   r   r;   L   rK   zSysVRCHandler.is_enabledNrL   r   r   r   r   rN   E   rM   rN   c                   @   sD   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )ÚOpenRCHandlerc                 C   s&   t  ddg¡\}}|dkr| ¡ S d S )Nz	rc-statusz-rr   ©r   r   Ústripr   r   r   r   r   Q   s   zOpenRCHandler.runlevel_getc                 C   r)   )Nú
rc-servicer	   r   r+   r   r   r   r	   U   r,   zOpenRCHandler.startc                 C   r)   )NrS   r-   r   r+   r   r   r   r-   X   r,   zOpenRCHandler.stopc                 C   ó   t  dd||g¡ d S )Nú	rc-updateÚaddr   r1   r   r   r   r   [   ó   zOpenRCHandler.enablec                 C   rT   )NrU   Údelr   r1   r   r   r   r3   ^   rW   zOpenRCHandler.disablec                 C   r4   )NrS   r5   r   r6   r   r8   r   r   r   r9   a   r:   zOpenRCHandler.is_runningc                 C   s2   t  dd|g¡\}}tt dt |¡ d |¡ƒS )NrU   Úshowz\b)r   r   ÚboolÚreÚsearchÚescaperJ   r   r   r   r;   e   s   zOpenRCHandler.is_enabledN)
r   r   r   r   r	   r-   r   r3   r9   r;   r   r   r   r   rP   P   s    rP   c                   @   s\   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚSystemdHandlerc                 C   s   dS )NÚ r   r   r   r   r   r   k   r%   zSystemdHandler.runlevel_getc                 C   ó   t  dd|g¡ d S )NÚ	systemctlÚrestartr   r+   r   r   r   r	   n   r,   zSystemdHandler.startc                 C   r`   )Nra   r-   r   r+   r   r   r   r-   q   r,   zSystemdHandler.stopc                 C   r`   )Nra   r   r   r1   r   r   r   r   t   r,   zSystemdHandler.enablec                 C   r`   )Nra   r3   r   r1   r   r   r   r3   w   r,   zSystemdHandler.disablec                 C   s"   t jdd|gdgd\}}|dkS )Nra   z	is-activer   r6   r   r8   r   r   r   r9   z   r:   zSystemdHandler.is_runningc                 C   s>   t jdd|gdgd\}}| ¡ }|dkrdS |dkrdS d S )	Nra   z
is-enabledr   r6   ÚenabledTÚdisabledFrQ   )r   r#   r   r   r   r5   r   r   r   r;   ~   s   zSystemdHandler.is_enabledc              
   C   sž   t  d||f ¡ tj |¡st  d| ¡ d S tj| }z	t |tj	¡ W n t
yB } zt  d||f ¡ W Y d }~d S d }~ww t ||¡ |  ¡  d S )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ÚmakedirsÚDEF_SERVICE_CFG_DIR_MODEÚOSErrorr   Úcopyr    )r   r#   r
   ÚdirpathÚer   r   r   r$   ƒ   s   
€þzSystemdHandler.cfg_installc              	   C   sl   t  d||f ¡ tj| }d|tj |¡f }t |¡ |  	¡  zt 
|¡ W d S  ttfy5   Y d S w )NzEuninstalling service configuration overlay file '%s' for service '%s'ú%s/%s)re   rf   rk   rl   rg   rh   Úbasenamer   Úunlinkr    ÚrmdirÚFileNotFoundErrorro   )r   r#   r
   rq   rh   r   r   r   r&   ‘   s   

ÿzSystemdHandler.cfg_uninstallc                 C   s†   |d u rd S dt j| tj |¡f }tj |¡s$t d||f ¡ dS tj |¡s5t d||f ¡ dS t 	|¡}t 	|¡}||kS )Nrs   z.Unable to find service '%s' configuration '%s'Fz0Service '%s' configuration not installed in '%s')
rk   rl   rg   rh   rt   ri   re   rj   r   Ú	sha256sum)r   r#   r
   rh   Ú
sha256sum1Ú
sha256sum2r   r   r   r'      s   

zSystemdHandler.cfg_verifyN)r   r   r   r   r	   r-   r   r3   r9   r;   r$   r&   r'   r   r   r   r   r^   i   s    r^   c                       sj   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zddd„Z‡  ZS )ÚServicePluginz?
	Plugin for handling sysvinit, openrc, and systemd services.
	c                    s*   t t| ƒj|i |¤Ž d| _|  ¡ | _d S )NT)Úsuperr{   r   Ú_has_dynamic_optionsÚ_detect_init_systemÚ_init_handler)r   ÚargsÚkwargs©Ú	__class__r   r   r   °   s   zServicePlugin.__init__c                 C   s   t j|dgd\}}|dkS )Nr   r6   r   )r   Úcommandr   r   r   r   r   Ú
_check_cmdµ   s   zServicePlugin._check_cmdc                 C   s€   |   ddg¡rt d¡ tƒ S |   dg¡rt d¡ tƒ S |   ddg¡r,t d¡ tƒ S |   d	dg¡r;t d
¡ tƒ S t d¡‚)Nra   r5   zdetected systemdr?   zdetected generic sysvinitzupdate-rc.dz-hzdetected sysv-rcrU   zdetected openrcz8Unable to detect your init system, disabling the plugin.)	r…   re   Údebugr^   r=   rN   rP   Ú
exceptionsÚNotSupportedPluginExceptionr   r   r   r   r~   ¹   s   




z!ServicePlugin._detect_init_systemc                 C   s’   t  d|¡}tƒ }|D ];}|dkrd|_q|dkrd|_q|dkr%d|_q|dkr-d|_q|d d… d	kr=|dd … |_qt d
||f ¡ q|S )Nz
\s*[,;]\s*r   Tr3   Fr	   r-   é   zfile:z*service '%s': invalid service option: '%s')r[   r   r   r   r	   r
   re   rj   )r   r#   ÚvalÚlr*   Úir   r   r   Ú_parse_service_optionsÉ   s   z$ServicePlugin._parse_service_optionsc                    s6   d|_ d|_t ‡ fdd„|j ¡ D ƒ¡ˆ _i |_d S )NFTc              	      sT   g | ]&\}}|d d… dkrt |ƒdkr|dd … ˆ  |dd … ˆ j |¡¡f‘qS )Né   zservice.)Úlenr   Ú
_variablesÚexpand)Ú.0ÚoptionÚvaluer   r   r   Ú
<listcomp>ß   s    þ
ÿz0ServicePlugin._instance_init.<locals>.<listcomp>)Ú_has_dynamic_tuningÚ_has_static_tuningÚcollectionsÚOrderedDictÚoptionsÚitemsÚ	_servicesÚ_services_original©r   Úinstancer   r   r   Ú_instance_initÛ   s   
ÿ
zServicePlugin._instance_initc                 C   r!   r   r   rž   r   r   r   Ú_instance_cleanupä   r%   zServicePlugin._instance_cleanupc                 C   sZ   |r	| j  |¡ n
|d ur| j  |¡ |r| j  ||¡ d S |d ur+| j  ||¡ d S d S r   )r   r	   r-   r   r3   )r   r#   r	   r   r   r   r   r   Ú_process_serviceç   s   ÿzServicePlugin._process_servicec                 C   s¶   | j  ¡ }|d u rt d¡ d S | j ¡ D ]C}| j  |d |¡}| j  |d ¡}t|||d j	|ƒ|j
|d < |d j	rH| j  |d |d j	¡ |  |d |d j|d j|¡ qd S )NzCannot detect runlevelr   r   )r   r   re   rj   rœ   r›   r;   r9   r   r
   r   r$   r¢   r	   r   )r   rŸ   r   r*   r;   r9   r   r   r   Ú_instance_apply_staticñ   s   


"úz$ServicePlugin._instance_apply_staticc           
      C   s>  | j  ¡ }|d u rt tjd ¡ dS d}| j ¡ D ]‚}| j  |d |d j	¡}|r<t 
tjd |d |d j	f ¡ n)|d urTt tjd |d |d j	f ¡ d}nt 
tjd |d |d j	f ¡ | j  |d |¡}| j  |d ¡}	|  d	|d  |d j|	|¡du r‰d}|  d
|d  |d j||¡du rœd}q|S )Nzcannot detect runlevelFTr   r   z'service '%s' configuration '%s' matchesz'service '%s' configuration '%s' differszservice '%s' configuration '%s'z
%s runningz
%s enabled)r   r   re   rj   rk   ÚSTR_VERIFY_PROFILE_FAILrœ   r›   r'   r
   rf   ÚSTR_VERIFY_PROFILE_OKÚ STR_VERIFY_PROFILE_VALUE_MISSINGr;   r9   Ú_verify_valuer	   r   )
r   rŸ   Úignore_missingÚdevicesr   Úretr*   Úret_cfg_verifyr;   r9   r   r   r   Ú_instance_verify_staticÿ   s*   
$""""€z%ServicePlugin._instance_verify_staticFc                 C   sH   t |j ¡ ƒD ]\}}|jr| j ||j¡ |  ||j|j|j	¡ qd S r   )
Úlistr   r›   r
   r   r&   r¢   r	   r   r   )r   rŸ   Úfull_rollbackr#   r”   r   r   r   Ú_instance_unapply_static  s
   ýz&ServicePlugin._instance_unapply_static)F)r   r   r   Ú__doc__r   r…   r~   r   r    r¡   r¢   r£   r¬   r¯   Ú__classcell__r   r   r‚   r   r{   «   s    	
r{   )r_   r   r˜   Útuned.constsrk   Ú
decoratorsrg   r[   Ú
tuned.logsÚtunedÚtuned.utils.commandsr   ÚlogsÚgetre   r   r   r   r(   r=   rN   rP   r^   ÚPluginr{   r   r   r   r   Ú<module>   s$    
B