o
    _                     @   s   d dl Z ddlmZ ddlT d dlZd dlT d dlmZ d dl	m
Z
 d dlZd dlZej ZddgZdd	gZG d
d dejZdd Zdd Zdd Zdd Zdd ZdddZdS )    N   )base)*)commandsbase_reachable_timeretrans_timez/run/sysctl.dz/etc/sysctl.dc                       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dZ	  Z
S )SysctlPluginz.
	Plugin for applying custom sysctl options.
	c                    s(   t t| j|i | d| _t | _d S )NT)superr   __init___has_dynamic_optionsr   _cmd)selfargskwargs	__class__ =/usr/lib/python3/dist-packages/tuned/plugins/plugin_sysctl.pyr
      s   zSysctlPlugin.__init__c                 C   sh   d|_ d|_| |j}| j|i |_t|jdkr.t	d | 
| i |_| j| |j|_d S )NFTr   z0recovering old sysctl settings from previous run)_has_dynamic_tuning_has_static_tuning_storage_keyname_storageget_sysctl_originallenloginfo_instance_unapply_staticunsetoptions_sysctlr   instancestorage_keyr   r   r   _instance_init   s   

zSysctlPlugin._instance_initc                 C   s   |  |j}| j| d S N)r   r   r   r   r"   r   r   r   _instance_cleanup+   s   zSysctlPlugin._instance_cleanupc                 C   s   t |j D ]2\}}t|}|d u rtd|  q| j| j	|}| 
||}|d ur9||j|< t|| q| |j}| j||j | jtjtjr[td t  d S d S )NzDsysctl option %s will not be set, failed to read the original value.zreapplying system sysctl)listr!   items_read_sysctlr   error
_variablesexpandr   unquote_process_assignment_modifiersr   _write_sysctlr   r   r   set_global_cfgget_boolconstsCFG_REAPPLY_SYSCTLCFG_DEF_REAPPLY_SYSCTLr   _apply_system_sysctl)r   r#   optionvalueoriginal_value	new_valuer$   r   r   r   _instance_apply_static/   s,   




z#SysctlPlugin._instance_apply_staticc                 C   sp   d}d}t |j D ]*\}}t|}| | j||}|d ur5| || j	|| j	||dkr5d}q|S )NTF)
r(   r!   r)   r*   r/   r,   r-   _verify_valuer   	remove_ws)r   r#   ignore_missingdevicesretr8   r9   curr_valr   r   r   _instance_verify_staticE   s   $z$SysctlPlugin._instance_verify_staticFc                 C   s&   t |j D ]	\}}t|| qd S r&   )r(   r   r)   r0   )r   r#   full_rollbackr8   r9   r   r   r   r   Q   s   z%SysctlPlugin._instance_unapply_staticF)__name__
__module____qualname____doc__r
   r%   r'   r<   rC   r   __classcell__r   r   r   r   r      s    r   c               	   C   s   i } t D ]&}zt|}W n	 ty   Y qw |D ]}|ds!q|| vr)|| |< qqt|  D ]}| | }d||f }t| q1td d S )Nz.confz%s/%sz/etc/sysctl.conf)SYSCTL_CONFIG_DIRSoslistdirOSErrorendswithsortedkeys_apply_sysctl_config_file)filesdflistfnamepathr   r   r   r7   V   s&   

r7   c              
   C   s   t d|   z/t| d}t|dD ]
\}}t| || qW d    n1 s(w   Y  t d|   W d S  ttfyc } z|jtjkrXt 	d| t
|f  W Y d }~d S W Y d }~d S d }~ww )Nz%Applying sysctl settings from file %srr   z.Finished applying sysctl settings from file %sz.Error reading sysctl settings from file %s: %s)r   debugopen	enumerate_apply_sysctl_config_linerN   IOErrorerrnoENOENTr+   str)rW   flinenolineer   r   r   rR   i   s$   
rR   c                 C   s   |  }t|dks|d dks|d dkrd S |dd}t|dkr/td| |f  d S |\}}|  }t|dkrHtd| |f  d S |  }t||dd	 d S )
Nr   #;=r      z Syntax error in file %s, line %dT)r?   )stripr   splitr   r+   r0   )rW   rb   rc   tmpr8   r9   r   r   r   r\   v   s$   $r\   c                 C   s   d|  dd S )Nz/proc/sys/%s./)replace)r8   r   r   r   _get_sysctl_path   s   ro   c              
   C   s   t | }zEt|d,}d}t|D ]\}}|dkr*td|    W d    W d S q| }W d    n1 s9w   Y  td| |f  |W S  ttfyw } z |j	t	j
kratd|   ntd| t|f  W Y d }~d S d }~ww )NrX    r   zGFailed to read sysctl parameter '%s', multi-line values are unsupportedz&Value of sysctl parameter '%s' is '%s'zBFailed to read sysctl parameter '%s', the parameter does not existz(Failed to read sysctl parameter '%s': %s)ro   rZ   r[   r   r+   ri   rY   rN   r]   r^   r_   r`   )r8   rW   ra   rc   ir9   rd   r   r   r   r*      s:   

r*   Fc              
   C   s   t | }tj|tv rtd|   dS z(td| |f  t|d}|	| W d    W dS 1 s6w   Y  W dS  t
tfyu } z*|jtjkr^|rRtjntj}|d| |f  ntd| |t|f  W Y d }~dS d }~ww )Nz+Refusing to set deprecated sysctl option %sFz%Setting sysctl parameter '%s' to '%s'wTzIFailed to set sysctl parameter '%s' to '%s', the parameter does not existz/Failed to set sysctl parameter '%s' to '%s': %s)ro   rL   rW   basenameDEPRECATED_SYSCTL_OPTIONSr   r+   rY   rZ   writerN   r]   r^   r_   r`   )r8   r9   r?   rW   ra   rd   log_funcr   r   r   r0      s8   
r0   rE   )rerp   r   
decorators
tuned.logstuned
subprocesstuned.utils.commandsr   tuned.constsr4   r^   rL   logsr   r   rt   rK   Pluginr   r7   rR   r\   ro   r*   r0   r   r   r   r   <module>   s*    
E