o
    •Û_5  ã                   @   sl   d dl Z 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 ej ¡ ZG dd„ dejƒZdS )é    Né   )Úbase)Ú*)Úcommandsc                       sb   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d„Zdd„ Z‡  ZS )ÚModulesPluginz6
	Plugin for applying custom kernel modules 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_modules.pyr      s   zModulesPlugin.__init__c                 C   s   d|_ d|_|j|_d S )NFT)Ú_has_dynamic_tuningÚ_has_static_tuningÚoptionsÚ_modules©r   Úinstancer   r   r   Ú_instance_init   s   zModulesPlugin._instance_initc                 C   s   d S ©Nr   r   r   r   r   Ú_instance_cleanup   s   zModulesPlugin._instance_cleanupc                 C   sŒ   |D ]A}| j  dd|g¡\}}|dk rt d¡  d S |dkr*t d|| ¡ f ¡ | j  d|g¡\}}|dkrCt d|| ¡ f ¡ qd S )NÚmodprobez-rr   zN'modprobe' command not found, cannot reload kernel modules, reboot is requiredz$cannot remove kernel module '%s': %sz:cannot insert/reinsert module '%s', reboot is required: %s)r
   ÚexecuteÚlogÚwarnÚdebugÚstrip)r   ÚmodulesÚmoduleÚretcodeÚoutr   r   r   Ú_reload_modules   s   
€÷zModulesPlugin._reload_modulesc                 C   sR  |   ¡  d}d}d}g }t|j ¡ ƒD ]m\}}| j |¡}| j |¡}	|sF| j d|g¡\}}
|dk r;d}t 	d¡ n|dkrFt 
d| ¡ |sL|dkr€t|	ƒdkrf|	dd	… d
krft dd|	¡}	| |¡ t|	ƒdkry|d| d |	 d 7 }qt d| ¡ q| j tj|¡ t|ƒ}|dkr¥|  |¡ t|jƒ|kr§t tj¡ d S d S d S )NÚ r   FÚmodinfoTz8'modinfo' command not found, not checking kernel modulesz)kernel module '%s' not found, skipping itr   é   z+rú^\s*\+r\s*,?\s*zoptions ú Ú
zKmodule '%s' doesn't have any option specified, not writing it to modprobe.d)Ú_clear_modprobe_fileÚlistr   ÚitemsÚ
_variablesÚexpandr
   r   r   r   ÚerrorÚlenÚreÚsubÚappendr   Úwrite_to_fileÚconstsÚMODULES_FILEr%   ÚinfoÚSTR_HINT_REBOOT)r   r   Úsr#   Ú
skip_checkÚreload_listÚoptionÚvaluer"   Úvr$   Úlr   r   r   Ú_instance_apply_static*   s>   
€
ýz$ModulesPlugin._instance_apply_staticc                 C   s   t |ƒ dd¡S )Nú/r&   )ÚstrÚreplace)r   Úpathr   r   r   Ú_unquote_pathI   s   zModulesPlugin._unquote_pathc                 C   s  d}d}t  d¡}t|j ¡ ƒD ]w\}}| j |¡}| j |¡}	t  dd|	¡}	d| }
tj	 
|
¡s>d}t tjd | ¡ qt tjd | ¡ | |	¡}|D ]7}| d	¡}t|ƒd
krft d||f ¡ qO|  |d |d | jj|
d |  |d ¡ d dd|¡dkr†d}qOq|S )NTz\s+r)   r&   z/sys/module/%sFzmodule '%s' is not loadedzmodule '%s' is loadedú=r(   z.unrecognized module option for module '%s': %sr   r   z/parameters/)Úerr_retÚno_error)r3   Úcompiler-   r   r.   r/   r0   r4   ÚosrF   Úexistsr   r1   r7   ÚSTR_VERIFY_PROFILE_FAILr9   ÚSTR_VERIFY_PROFILE_OKÚsplitr2   r   Ú_verify_valuer
   Ú	read_filerG   )r   r   Úignore_missingÚdevicesÚretÚrr>   r?   r"   r@   ÚmpathrA   ÚitemÚargr   r   r   Ú_instance_verify_staticL   s6   


"þþ€ø	z%ModulesPlugin._instance_verify_staticFc                 C   s   |r|   ¡  d S d S r   )r,   )r   r   Úfull_rollbackr   r   r   Ú_instance_unapply_staticg   s   ÿz&ModulesPlugin._instance_unapply_staticc                 C   s¢   | j jtjdd}| d¡}d }}t|ƒ}t d¡}||k r4| || ¡d u r,|}|}|d7 }||k sd 	|d|… ¡}t|ƒdkrG|d7 }| j  
tj|¡ d S )NT)rJ   r+   r   z^\s*#r   )r
   rR   r7   r8   rP   r2   r3   rK   ÚsearchÚjoinr6   )r   r;   rA   ÚiÚjÚllrV   r   r   r   r,   k   s   

üz"ModulesPlugin._clear_modprobe_file)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r%   rB   rG   rZ   r\   r,   Ú__classcell__r   r   r   r   r      s    
r   )r3   Úos.pathrL   r&   r   Ú
decoratorsÚ
tuned.logsÚtunedÚ
subprocessÚtuned.utils.commandsr   Útuned.constsr7   ÚlogsÚgetr   ÚPluginr   r   r   r   r   Ú<module>   s    
