3 Yd @sddlZddlmZddlTddlZddlTddlmZddl j Z ddl Z ddl Z ej jZddgZdd gZGd d d ejZd d ZddZddZddZddZdddZdS)N)base)*)commandsZbase_reachable_timeZ retrans_timez /run/sysctl.dz /etc/sysctl.dcsNeZdZdZfddZddZddZdd Zd d Ze j fd 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 ---- ==== cs$tt|j||d|_t|_dS)NT)superr__init__Z_has_dynamic_optionsr_cmd)selfargskwargs) __class__#/usr/lib/python3.6/plugin_sysctl.pyr*szSysctlPlugin.__init__cCshd|_d|_|j|j}|jj|i|_t|jdkr\tj d|j |i|_|jj ||j |_ dS)NFTrz0recovering old sysctl settings from previous run)Z_has_dynamic_tuningZ_has_static_tuning _storage_keyname_storageget_sysctl_originallenloginfo_instance_unapply_staticunsetZoptions_sysctl)r instance storage_keyrrr_instance_init/s    zSysctlPlugin._instance_initcCs|j|j}|jj|dS)N)rrrr)r rrrrr_instance_cleanup?s zSysctlPlugin._instance_cleanupcCsxvt|jjD]d\}}t|}|dkr8tjd|q|jj|jj |}|j ||}|dk r||j |<t ||qW|j |j}|jj||j |jjtjtjrtjdt|jdS)NzDsysctl option %s will not be set, failed to read the original value.zreapplying system sysctl)listritems _read_sysctlrerror _variablesexpandr Zunquote_process_assignment_modifiersr _write_sysctlrrrsetZ _global_cfgZget_boolconstsZCFG_REAPPLY_SYSCTLZCFG_DEF_REAPPLY_SYSCTLr_apply_system_sysctl)r roptionvalueoriginal_valueZ new_valuerrrr_instance_apply_staticCs"    z#SysctlPlugin._instance_apply_staticcCstd}d}xft|jjD]T\}}t|}|j|jj||}|dk r|j||jj ||jj ||dkrd}qW|S)NTF) rrr r!r%r#r$Z _verify_valuer Z remove_ws)r rignore_missingZdevicesretr*r+Zcurr_valrrr_instance_verify_staticYs$z$SysctlPlugin._instance_verify_staticcCs*x$t|jjD]\}}t||qWdS)N)rrr r&)r rZrollbackr*r+rrrresz%SysctlPlugin._instance_unapply_static) __name__ __module__ __qualname____doc__rrrr-r0r(Z ROLLBACK_SOFTr __classcell__rr)r rrs  rc Csi}x\tD]T}ytj|}Wntk r2w YnXx(|D] }|jdsJq:||kr:|||<q:Wq Wx2t|jD]"}||}d||f}t||qpWtd|dS)Nz.confz%s/%sz/etc/sysctl.conf)SYSCTL_CONFIG_DIRSoslistdirOSErrorendswithsortedkeys_apply_sysctl_config_file)instance_sysctlfilesdflistZfnamepathrrrr)js     r)cCstjd|yNt|d,}x$t|dD]\}}t||||q(WWdQRXtjd|WnHttfk r}z(|jtjkrtj d|t |fWYdd}~XnXdS)Nz%Applying sysctl settings from file %srrz.Finished applying sysctl settings from file %sz.Error reading sysctl settings from file %s: %s) rdebugopen enumerate_apply_sysctl_config_liner9IOErrorerrnoENOENTr"str)rBr>flinenolineerrrr=}s   r=cCs|j}t|dks,|ddks,|ddkr0dS|jdd}t|dkr^tjd||fdS|\}}|j}t|dkrtjd||fdS|j}||kr|||krtjd||||ft||d d dS) Nr#;=rz Syntax error in file %s, line %dz2Overriding sysctl parameter '%s' from '%s' to '%s'T)r.)striprsplitrr"rr&)rBrMrNr>Ztmpr*r+rrrrGs&$     rGcCsd|jddS)Nz /proc/sys/%s./)replace)r*rrr_get_sysctl_pathsrYcCst|}yht|dB}d}x.t|D]"\}}|dkr$tjd|dSq$W|j}WdQRXtjd||f|Sttfk r}z6|j t j krtjd|ntjd|t |fdSd}~XnXdS)NrCrzGFailed 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) rYrErFrr"rTrDr9rHrIrJrK)r*rBrLrNir+rOrrrr!s(    r!FcCst|}tjj|tkr*tjd|dSy6tjd||ft|d}|j |WdQRXdSt t fk r}zJ|j t j kr|rtjntj}|d||fntjd||t|fdSd}~XnXdS)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)rYr7rBbasenameDEPRECATED_SYSCTL_OPTIONSrr"rDrEwriter9rHrIrJrK)r*r+r.rBrLrOZlog_funcrrrr&s&   r&)F)rerZrZ decoratorsZ tuned.logsZtuned subprocessZtuned.utils.commandsrZ tuned.constsr(rIr7Zlogsrrr^r6ZPluginrr)r=rGrYr!r&rrrrs&    Y