<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
3
<e                 @   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	j
Z
d dlZd dlZejj ZddgZdd	gZG d
d dejZdS )    N   )base)*)commandsZbase_reachable_timeZretrans_timez/run/sysctl.dz/etc/sysctl.dc                   s   e Zd ZdZ fddZdd Zdd Zdd	 Zd
d Ze	j
fddZdd Zdd Zdd Zdd Zdd ZdddZ  ZS )SysctlPluginaI  
	`sysctl`::
	
	Sets various kernel parameters at runtime.
	+
	This plug-in is used for applying custom `sysctl` settings and should
	only be used to change system settings that are not covered by other
	*TuneD* plug-ins. If the settings are covered by other *TuneD* plug-ins,
	use those plug-ins instead.
	+
	The syntax for this plug-in is
	`_key_=_value_`, where
	`_key_` is the same as the key name provided by the
	`sysctl` utility.
	+
	.Adjusting the kernel runtime kernel.sched_min_granularity_ns value
	====
	----
	[sysctl]
	kernel.sched_min_granularity_ns=3000000
	----
	====
	c                s$   t t| j|| d| _t | _d S )NT)superr   __init__Z_has_dynamic_optionsr   _cmd)selfargskwargs)	__class__ #/usr/lib/python3.6/plugin_sysctl.pyr   *   s    zSysctlPlugin.__init__c             C   sh   d|_ d|_| j|j}| jj|i |_t|jdkr\tj	d | j
| i |_| jj| |j|_d S )NFTr   z0recovering old sysctl settings from previous run)Z_has_dynamic_tuningZ_has_static_tuning_storage_keyname_storageget_sysctl_originallenloginfo_instance_unapply_staticunsetZoptions_sysctl)r
   instancestorage_keyr   r   r   _instance_init/   s    

zSysctlPlugin._instance_initc             C   s   | j |j}| jj| d S )N)r   r   r   r   )r
   r   r   r   r   r   _instance_cleanup?   s    zSysctlPlugin._instance_cleanupc             C   s   xzt |jj D ]h\}}| j|}|d kr:tjd|  q| jj| jj	|}| j
||}|d k	r||j|< | j|| qW | j|j}| jj||j | jjtjtjrtjd | j|j 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	   Zunquote_process_assignment_modifiersr   _write_sysctlr   r   r   setZ_global_cfgZget_boolconstsZCFG_REAPPLY_SYSCTLZCFG_DEF_REAPPLY_SYSCTLr   _apply_system_sysctl)r
   r   optionvalueoriginal_valueZ	new_valuer   r   r   r   _instance_apply_staticC   s"    



z#SysctlPlugin._instance_apply_staticc             C   sv   d}d}xht |jj D ]V\}}| j|}| j| jj||}|d k	r| j|| jj	|| jj	||dkrd}qW |S )NTF)
r   r   r    r!   r%   r#   r$   Z_verify_valuer	   Z	remove_ws)r
   r   ignore_missingZdevicesretr*   r+   Zcurr_valr   r   r   _instance_verify_staticY   s    
$z$SysctlPlugin._instance_verify_staticc             C   s,   x&t |jj D ]\}}| j|| qW d S )N)r   r   r    r&   )r
   r   Zrollbackr*   r+   r   r   r   r   e   s    z%SysctlPlugin._instance_unapply_staticc             C   s   i }x\t D ]T}ytj|}W n tk
r2   w
Y nX x(|D ] }|jdsJq:||kr:|||< q:W q
W x4t|j D ]$}|| }d||f }| j|| qpW | jd| d S )Nz.confz%s/%sz/etc/sysctl.conf)SYSCTL_CONFIG_DIRSoslistdirOSErrorendswithsortedkeys_apply_sysctl_config_file)r
   instance_sysctlfilesdflistZfnamepathr   r   r   r)   i   s     


z!SysctlPlugin._apply_system_sysctlc             C   s   t jd|  yPt|d.}x&t|dD ]\}}| j|||| q(W W d Q R X t jd|  W nH ttfk
r } z(|jtjkrt j	d|t
|f  W Y d d }~X nX d S )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_liner4   IOErrorerrnoENOENTr"   str)r
   r=   r9   flinenolineer   r   r   r8   |   s    z&SysctlPlugin._apply_sysctl_config_filec       	      C   s   |j  }t|dks,|d dks,|d dkr0d S |jdd}t|dkr^tjd||f  d S |\}}|j  }t|dkrtjd||f  d S |j  }||kr| jj|| }||krtjd|||f  | j||d	d
 d S )Nr   #;=r      z Syntax error in file %s, line %dz2Overriding sysctl parameter '%s' from '%s' to '%s'T)r.   )	stripr   splitr   r"   r#   r$   r   r&   )	r
   r=   rH   rI   r9   Ztmpr*   r+   Zinstance_valuer   r   r   rB      s*    $z&SysctlPlugin._apply_sysctl_config_linec             C   s   d| j j|dd S )Nz/proc/sys/%sz./z/.)r	   Ztr)r
   r*   r   r   r   _get_sysctl_path   s    zSysctlPlugin._get_sysctl_pathc             C   s   | j |}yht|dB}d}x.t|D ]"\}}|dkr&tjd|  d S q&W |j }W d Q R X tjd||f  |S  ttfk
r } z6|j	t	j
krtjd|  ntjd|t|f  d S d }~X nX d S )Nr>    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)rQ   r@   rA   r   r"   rO   r?   r4   rC   rD   rE   rF   )r
   r*   r=   rG   rI   ir+   rJ   r   r   r   r!      s(    

zSysctlPlugin._read_sysctlFc             C   s   | j |}tjj|tkr,tjd|  dS y6tjd||f  t|d}|j	| W d Q R X dS  t
tfk
r } zJ|jtjkr|rtjntj}|d||f  ntjd||t|f  dS d }~X nX d S )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)rQ   r2   r=   basenameDEPRECATED_SYSCTL_OPTIONSr   r"   r?   r@   writer4   rC   rD   rE   rF   )r
   r*   r+   r.   r=   rG   rJ   Zlog_funcr   r   r   r&      s&    
zSysctlPlugin._write_sysctl)F)__name__
__module____qualname____doc__r   r   r   r-   r0   r(   ZROLLBACK_SOFTr   r)   r8   rB   rQ   r!   r&   __classcell__r   r   )r   r   r      s   r   )rerR   r   Z
decoratorsZ
tuned.logsZtuned
subprocessZtuned.utils.commandsr   Ztuned.constsr(   rD   r2   Zlogsr   r   rV   r1   ZPluginr   r   r   r   r   <module>   s   

