509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
À<×e‘W  ã               @   sl   d dl Z d dljZd dlZd dlZd dlZd dlmZ d dl	Z	d dl
mZmZ ejjƒ ZG dd„ deƒZdS )é    N)Úcommands)ÚPopenÚPIPEc               @   s&  e Zd ZdZdd„ Zdd„ Zdd„ Zedd	„ ƒZe	d
d„ ƒZ
e	dd„ ƒZe	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"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zejfd2d3„Z d4d5„ Z!d6d7„ Z"d8d9„ Z#ejfd:d;„Z$d<d=„ Z%d>d?„ Z&ejfd@dA„Z'dBdC„ Z(dDdE„ Z)dFdG„ Z*dHdI„ Z+dJdK„ Z,dLdM„ Z-d|dOdP„Z.d}dQdR„Z/d~dSdT„Z0ddUdV„Z1dWdX„ Z2dYdZ„ Z3d[d\„ Z4d]d^„ Z5d_d`„ Z6d€dbdc„Z7d�ddde„Z8dfdg„ Z9dhdi„ Z:djdk„ Z;d‚dldm„Z<dƒdndo„Z=dpdq„ Z>drds„ Z?dtdu„ Z@d„dvdw„ZAd…dxdy„ZBdzd{„ ZCdNS )†ÚPlugina  
	Base class for all plugins.

	Plugins change various system settings in order to get desired performance or power
	saving. Plugins use Monitor objects to get information from the running system.

	Intentionally a lot of logic is included in the plugin to increase plugin flexibility.
	c	       	      C   sn   |j | jjƒ| _|| _|| _|| _|| _|| _t	j
ƒ | _| jƒ  || _|| _d| _d| _| jƒ | _tƒ | _dS )zPlugin constructor.FN)ÚcreateÚ	__class__Ú__name__Ú_storageZ_monitors_repositoryZ_hardware_inventoryÚ_device_matcherÚ_device_matcher_udevÚ_instance_factoryÚcollectionsÚOrderedDictÚ
_instancesÚ_init_commandsÚ_global_cfgÚ
_variablesÚ_has_dynamic_optionsÚ_devices_initedÚ#_get_config_options_used_by_dynamicÚ_options_used_by_dynamicr   Ú_cmd)	ÚselfZmonitors_repositoryZstorage_factoryZhardware_inventoryZdevice_matcherZdevice_matcher_udevZinstance_factoryZ
global_cfgÚ	variables© r   ú/usr/lib/python3.6/base.pyÚ__init__   s    

zPlugin.__init__c             C   s   | j ƒ  d S )N)Údestroy_instances)r   r   r   r   Úcleanup,   s    zPlugin.cleanupc             C   s   | j s| jƒ  d| _ d S )NT)r   Ú_init_devices)r   r   r   r   Úinit_devices/   s    zPlugin.init_devicesc             C   s   | j jjdƒd jddƒd S )NÚ.é   Ú_éÿÿÿÿ)r   Ú
__module__Úsplit)r   r   r   r   Úname4   s    zPlugin.namec             C   s   i S )z-Default configuration options for the plugin.r   )r   r   r   r   Ú_get_config_options<   s    zPlugin._get_config_optionsc             C   s   i S )z*Explanation of each config option functionr   )Úclsr   r   r   Úget_config_options_hintsA   s    zPlugin.get_config_options_hintsc             C   s   g S )znList of config options used by dynamic tuning. Their previous values will be automatically saved and restored.r   )r   r   r   r   r   F   s    z*Plugin._get_config_options_used_by_dynamicc             C   sP   | j ƒ jƒ }x>|D ]6}||ks$| jr2|| ||< qtjd|| jjf ƒ qW |S )z3Merge provided options with plugin default options.z$Unknown option '%s' for plugin '%s'.)r(   Úcopyr   ÚlogÚwarnr   r   )r   ÚoptionsZ	effectiveÚkeyr   r   r   Ú_get_effective_optionsK   s    
zPlugin._get_effective_optionsc             C   s,   t |ƒtkr|S t|ƒjƒ }|dkp*|dkS )NÚtrueÚ1)ÚtypeÚboolÚstrÚlower)r   Úvaluer   r   r   Ú_option_boolV   s    zPlugin._option_boolc       	      C   sF   || j krtd| ƒ‚| j|ƒ}| jj| ||||||ƒ}|| j |< |S )z8Create new instance of the plugin and seize the devices.z.Plugin instance with name '%s' already exists.)r   Ú	Exceptionr0   r   r   )	r   r'   Údevices_expressionÚdevices_udev_regexÚ
script_preÚscript_postr.   Zeffective_optionsÚinstancer   r   r   Úcreate_instance`   s    



zPlugin.create_instancec             C   sV   |j | krtd|| f ƒ‚|j| jkr2td| ƒ‚| j|j }| j|ƒ | j|j= dS )zDestroy existing instance.z9Plugin instance '%s' does not belong to this plugin '%s'.z+Plugin instance '%s' was already destroyed.N)Z_pluginr9   r'   r   Ú_destroy_instance)r   r>   r   r   r   Údestroy_instancel   s    

zPlugin.destroy_instancec             C   s$   t jd|j| jf ƒ | j|ƒ dS )zInitialize an instance.zinitializing instance %s (%s)N)r,   Údebugr'   Ú_instance_init)r   r>   r   r   r   Úinitialize_instancew   s    zPlugin.initialize_instancec             C   sF   x6t | jjƒ ƒD ]$}tjd|j| jf ƒ | j|ƒ qW | jjƒ  dS )zDestroy all instances.zdestroying instance %s (%s)N)Úlistr   Úvaluesr,   rB   r'   r@   Úclear)r   r>   r   r   r   r   |   s    zPlugin.destroy_instancesc             C   s   | j |ƒ | j|ƒ d S )N)Úrelease_devicesÚ_instance_cleanup)r   r>   r   r   r   r@   ƒ   s    
zPlugin._destroy_instancec             C   s
   t ƒ ‚d S )N)ÚNotImplementedError)r   r>   r   r   r   rC   ‡   s    zPlugin._instance_initc             C   s
   t ƒ ‚d S )N)rJ   )r   r>   r   r   r   rI   Š   s    zPlugin._instance_cleanupc             C   s   d| _ tƒ | _tƒ | _d S )NF)Ú_devices_supportedÚsetÚ_assigned_devicesÚ_free_devices)r   r   r   r   r   ‘   s    zPlugin._init_devicesc             C   s   dS )z’Override this in a subclass to transform a list of device names (e.g. ['sda'])
		   to a list of pyudev.Device objects, if your plugin supports itNr   )r   Údevicesr   r   r   Ú_get_device_objects–   s    zPlugin._get_device_objectsc             C   sj   |j d krt| jj|j|ƒƒS | j|ƒ}|d krDtjd| jƒ tƒ S | j	j|j |ƒ}tdd„ |D ƒƒS d S )Nz<Plugin '%s' does not support the 'devices_udev_regex' optionc             S   s   g | ]
}|j ‘qS r   )Zsys_name)Ú.0Úxr   r   r   ú
<listcomp>¤   s    z0Plugin._get_matching_devices.<locals>.<listcomp>)
r;   rL   r
   Z
match_listr:   rP   r,   Úerrorr'   r   )r   r>   rO   Zudev_devicesr   r   r   Ú_get_matching_devices›   s    

zPlugin._get_matching_devicesc             C   s²   | j s
d S tjd|j ƒ | j|| jƒ}t|ƒdk|_|jsNtjd|j ƒ n`|j}|j| jkrn|d| j 7 }tj	d|dj
|ƒf ƒ |jj|ƒ |  j|O  _|  j|8  _d S )Nz assigning devices to instance %sr   z*instance %s: no matching devices availablez (%s)z!instance %s: assigning devices %sz, )rK   r,   rB   r'   rU   rN   ÚlenÚactiver-   ÚinfoÚjoinÚassigned_devicesÚupdaterM   )r   r>   Z	to_assignr'   r   r   r   Úassign_free_devices¦   s    zPlugin.assign_free_devicesc             C   sV   | j s
d S |j|jB | j@ }d|_|jjƒ  |jjƒ  |  j|8  _|  j|O  _d S )NF)rK   Úprocessed_devicesrZ   rM   rW   rG   rN   )r   r>   Z
to_releaser   r   r   rH   ¸   s    

zPlugin.release_devicesc             C   s(   | j sd g}x|D ]}|||ƒ qW d S )N)rK   )r   r>   ÚcallbackrO   Údevicer   r   r   Ú_run_for_each_deviceÊ   s    
zPlugin._run_for_each_devicec             C   s   d S )Nr   )r   r>   Úenablingr   r   r   Ú_instance_pre_staticÑ   s    zPlugin._instance_pre_staticc             C   s   d S )Nr   )r   r>   ra   r   r   r   Ú_instance_post_staticÔ   s    zPlugin._instance_post_staticc             C   sn  |d krd S t |ƒdkr0tjd|j|f ƒ d S |jdƒsHtjdƒ dS tjj|ƒ}d}�x|D �]}tj	}	|	j
| jjƒ ƒ |g}
|tjkr–|
jdƒ |
j|ƒ tjd	|t|
ƒf ƒ tjd
tt|	jƒ ƒƒ ƒ yVt|g|
 ttd|	|dd�}|jƒ \}}|j�r$tjd||j|d d… f ƒ d}W q` ttfk
�rd } ztjd||f ƒ d}W Y d d }~X q`X q`W |S )Nr   z1Instance '%s': no device to call script '%s' for.ú/z<Relative paths cannot be used in script_pre or script_post. zUse ${i:PROFILE_DIR}.FTZfull_rollbackz'calling script '%s' with arguments '%s'zusing environment '%s')ÚstdoutÚstderrZ	close_fdsÚenvÚcwdZuniversal_newlineszscript '%s' error: %d, '%s'r"   zscript '%s' error: %szQRelative paths cannot be used in script_pre or script_post. Use ${i:PROFILE_DIR}.r$   )rV   r,   r-   r'   Ú
startswithrT   ÚosÚpathÚdirnameÚenvironr[   r   Zget_envÚconstsZROLLBACK_FULLÚappendrX   r5   rB   rE   Úitemsr   r   ZcommunicateÚ
returncodeÚOSErrorÚIOError)r   r>   ZscriptÚoprO   ÚrollbackZdir_nameÚretZdevrm   Z	argumentsÚprocÚoutÚerrÚer   r   r   Ú_call_device_script×   sB    





zPlugin._call_device_scriptc             C   s    |j s
dS |jrZ| j||jd|jƒ | j|dƒ | j|ƒ | j|dƒ | j||jd|jƒ |j	r„| j
jtjtjƒr„| j|| j|jƒ |jj|jƒ |jjƒ  dS )zG
		Apply static and dynamic tuning if the plugin instance is active.
		NZapplyT)rW   Úhas_static_tuningr{   r<   rZ   rb   Ú_instance_apply_staticrc   r=   Úhas_dynamic_tuningr   Úgetrn   ÚCFG_DYNAMIC_TUNINGÚCFG_DEF_DYNAMIC_TUNINGr`   Ú_instance_apply_dynamicr]   r[   rG   )r   r>   r   r   r   Úinstance_apply_tuningú   s    




zPlugin.instance_apply_tuningc             C   s”   |j s
dS t|jƒdkr.tjddj|jƒ ƒ |jjƒ }|jrŒ| j	||j
d|ƒdkrXdS | j|||ƒdkrndS | j	||jd|ƒdkrˆdS dS dS dS )z<
		Verify static tuning if the plugin instance is active.
		Nr   z)BUG: Some devices have not been tuned: %sz, ZverifyFT)rW   rV   rZ   r,   rT   rY   r]   r+   r|   r{   r<   Ú_instance_verify_staticr=   )r   r>   Úignore_missingrO   r   r   r   Úinstance_verify_tuning  s    
zPlugin.instance_verify_tuningc             C   s<   |j s
dS |jr8| jjtjtjƒr8| j|| j|j	j
ƒ ƒ dS )z<
		Apply dynamic tuning if the plugin instance is active.
		N)rW   r~   r   r   rn   r€   r�   r`   Ú_instance_update_dynamicr]   r+   )r   r>   r   r   r   Úinstance_update_tuning$  s    zPlugin.instance_update_tuningc             C   s–   |t jkrdS |jr8| jjt jt jƒr8| j|| j|j	ƒ |j
r’| j||jd|j	|d� | j|dƒ | j||ƒ | j|dƒ | j||jd|j	|d� dS )z8
		Remove all tunings applied by the plugin instance.
		NZunapply)ru   F)rn   ZROLLBACK_NONEr~   r   r   r€   r�   r`   Ú_instance_unapply_dynamicr]   r|   r{   r=   rb   Ú_instance_unapply_staticrc   r<   )r   r>   ru   r   r   r   Úinstance_unapply_tuning-  s    

zPlugin.instance_unapply_tuningc             C   s   | j |ƒ | j||jƒ d S )N)Ú _execute_all_non_device_commandsÚ_execute_all_device_commandsrZ   )r   r>   r   r   r   r}   ?  s    
zPlugin._instance_apply_staticc             C   s2   d}| j ||ƒdkrd}| j|||ƒdkr.d}|S )NTF)Ú_verify_all_non_device_commandsÚ_verify_all_device_commands)r   r>   r…   rO   rv   r   r   r   r„   C  s    zPlugin._instance_verify_staticc             C   s   | j ||jƒ | j|ƒ d S )N)Ú_cleanup_all_device_commandsr]   Ú _cleanup_all_non_device_commands)r   r>   ru   r   r   r   rŠ   K  s    zPlugin._instance_unapply_staticc                sF   x4‡ ‡‡fdd„ˆj D ƒD ]}ˆjˆˆj| ˆ ƒ qW ˆjˆˆ ƒ d S )Nc                s(   g | ] }ˆj ˆˆj| ˆ ƒd kr|‘qS )N)Ú_storage_getÚ	_commands)rQ   Úopt)r_   r>   r   r   r   rS   Q  s    z2Plugin._instance_apply_dynamic.<locals>.<listcomp>)r   Ú_check_and_save_valuer“   r‡   )r   r>   r_   Zoptionr   )r_   r>   r   r   r‚   P  s    zPlugin._instance_apply_dynamicc             C   s
   t ƒ ‚d S )N)rJ   )r   r>   r_   r   r   r   r‰   V  s    z Plugin._instance_unapply_dynamicc             C   s
   t ƒ ‚d S )N)rJ   )r   r>   r_   r   r   r   r‡   Y  s    zPlugin._instance_update_dynamicc             C   s   t jƒ | _| jƒ  | jƒ  dS )z
		Initialize commands.
		N)r   r   r“   Ú_autoregister_commandsÚ_check_commands)r   r   r   r   r   `  s    
zPlugin._init_commandsc             C   sú   xÒ| j jD ]Æ}|jdƒrq
t| |ƒ}t|dƒs0q
|jd }| jj|d|iƒ}d|jkr„d|d< ||d< |jd |d< |jd |d< nBd	|jkr˜||d	< n.d|jkrÆ||d< |jd |d< |jd |d< || j|< q
W tj	t
t| jjƒ ƒd
d„ d�ƒ| _dS )zd
		Register all commands marked using @command_set, @command_get, and @command_custom decorators.
		Ú__Ú_commandr'   rL   NÚcustomÚ
per_deviceÚpriorityr   c             S   s   | d d S )Nr"   rœ   r   )Z	name_infor   r   r   Ú<lambda>…  s    z/Plugin._autoregister_commands.<locals>.<lambda>)r/   )r   Ú__dict__ri   ÚgetattrÚhasattrr™   r“   r   r   r   ÚsortedÚiterrp   )r   Úmember_nameÚmemberÚcommand_namerX   r   r   r   r–   h  s*    







zPlugin._autoregister_commandsc             C   sJ   xDt | jjƒ ƒD ]2\}}|jddƒr&qd|ks6d|krtd| ƒ‚qW dS )z2
		Check if all commands are defined correctly.
		rš   Fr   rL   z,Plugin command '%s' is not defined correctlyN)rE   r“   rp   r   Ú	TypeError)r   r¥   Úcommandr   r   r   r—   ‡  s
    zPlugin._check_commandsNc             C   sJ   t | ƒj}|d krdn|}|d kr&dn|}|d kr6dn|}d||||f S )NÚ z%s/%s/%s/%s)r3   r   )r   Zinstance_namer¥   Údevice_nameÚ
class_namer   r   r   Ú_storage_key—  s    
zPlugin._storage_keyc             C   s&   | j |j|d |ƒ}| jj||ƒ d S )Nr'   )r«   r'   r	   rL   )r   r>   r§   r7   r©   r/   r   r   r   Ú_storage_set   s    zPlugin._storage_setc             C   s    | j |j|d |ƒ}| jj|ƒS )Nr'   )r«   r'   r	   r   )r   r>   r§   r©   r/   r   r   r   r’   ¤  s    zPlugin._storage_getc             C   s    | j |j|d |ƒ}| jj|ƒS )Nr'   )r«   r'   r	   Zunset)r   r>   r§   r©   r/   r   r   r   Ú_storage_unset¨  s    zPlugin._storage_unsetc             C   sV   xPdd„ t | jjƒ ƒD ƒD ]4}| jj|jj|d d ƒƒ}|d k	r| j|||ƒ qW d S )Nc             S   s   g | ]}|d  s|‘qS )r›   r   )rQ   r§   r   r   r   rS   ±  s    z;Plugin._execute_all_non_device_commands.<locals>.<listcomp>r'   )rE   r“   rF   r   Úexpandr.   r   Ú_execute_non_device_command)r   r>   r§   Ú	new_valuer   r   r   rŒ   °  s    z'Plugin._execute_all_non_device_commandsc             C   sh   xbdd„ t | jjƒ ƒD ƒD ]F}| jj|jj|d d ƒƒ}|d krBqx|D ]}| j||||ƒ qHW qW d S )Nc             S   s   g | ]}|d  r|‘qS )r›   r   )rQ   r§   r   r   r   rS   ·  s    z7Plugin._execute_all_device_commands.<locals>.<listcomp>r'   )rE   r“   rF   r   r®   r.   r   Ú_execute_device_command)r   r>   rO   r§   r°   r_   r   r   r   r�   ¶  s    
z#Plugin._execute_all_device_commandsc             C   sd   d}xZdd„ t | jjƒ ƒD ƒD ]>}| jj|jj|d d ƒƒ}|d k	r| j||||ƒdkrd}qW |S )NTc             S   s   g | ]}|d  s|‘qS )r›   r   )rQ   r§   r   r   r   rS   À  s    z:Plugin._verify_all_non_device_commands.<locals>.<listcomp>r'   F)rE   r“   rF   r   r®   r.   r   Ú_verify_non_device_command)r   r>   r…   rv   r§   r°   r   r   r   rŽ   ¾  s    z&Plugin._verify_all_non_device_commandsc             C   sn   d}xddd„ t | jjƒ ƒD ƒD ]H}|jj|d d ƒ}|d kr>qx&|D ]}| j|||||ƒdkrDd}qDW qW |S )NTc             S   s   g | ]}|d  r|‘qS )r›   r   )rQ   r§   r   r   r   rS   É  s    z6Plugin._verify_all_device_commands.<locals>.<listcomp>r'   F)rE   r“   rF   r.   r   Ú_verify_device_command)r   r>   rO   r…   rv   r§   r°   r_   r   r   r   r�   Ç  s    
z"Plugin._verify_all_device_commandsc             C   sÆ   |d k	rÂt |ƒ}t|ƒdkr |S |d d… }|dd … }|d krP|dkrL|S |S yF|dkrtt|ƒt|ƒkrn|S d S n |dkr”t|ƒt|ƒk r�|S d S W n* tk
rÀ   tjd||||f ƒ Y nX |S )Nr"   ú<ú>zhcannot compare new value '%s' with current value '%s' by operator '%s', using '%s' directly as new value)r´   rµ   )r5   rV   ÚintÚ
ValueErrorr,   r-   )r   r°   Úcurrent_valueZnwsrt   Úvalr   r   r   Ú_process_assignment_modifiersÒ  s(    z$Plugin._process_assignment_modifiersFc             C   s&   |d k	r|d ||d�S |d ƒ S d S )Nr   )r…   r   )r   r§   r_   r…   r   r   r   Ú_get_current_valueê  s    zPlugin._get_current_valuec             C   s<   | j ||ƒ}| j||ƒ}|d k	r8|d k	r8| j||||ƒ |S )N)r»   rº   r¬   )r   r>   r§   r_   r°   r¸   r   r   r   r•   ð  s
    zPlugin._check_and_save_valuec             C   sR   |d d k	r"|d d||ddƒ n,| j ||||ƒ}|d k	rN|d ||ddd� d S )Nrš   TFrL   )ÚsimÚremove)r•   )r   r>   r§   r_   r°   r   r   r   r±   ÷  s
    zPlugin._execute_device_commandc             C   sN   |d d k	r |d d|ddƒ n*| j ||d |ƒ}|d k	rJ|d |ddd� d S )Nrš   TFrL   )r¼   r½   )r•   )r   r>   r§   r°   r   r   r   r¯   ÿ  s
    z"Plugin._execute_non_device_commandc             C   s.   | j jt|ƒƒ}tjd|ƒr*tjdd|ƒS |S )Nz\s*(0+,?)+([\da-fA-F]*,?)*\s*$z^\s*(0+,?)+r¨   )r   Zunquoter5   ÚreÚmatchÚsub)r   r7   Úvr   r   r   Ú_norm_value  s    zPlugin._norm_valuec       	      C   s(  |d krd S d}|d krN|rN|d kr6t jtj| ƒ nt jtj||f ƒ dS |d k	�r| j|ƒ}| j|ƒ}yt|ƒt|ƒk}W nŽ tk
�r   yt|dƒt|dƒk}W n^ tk
�r   t|ƒt|ƒk}|�st|ƒj	dƒ}x"|D ]}|j
ƒ }||k}|ræP qæW Y nX Y nX | j|||||d� |S )NFTé   ú|)r_   )r,   rX   rn   Z STR_VERIFY_PROFILE_VALUE_MISSINGZ'STR_VERIFY_PROFILE_DEVICE_VALUE_MISSINGrÂ   r¶   r·   r5   r&   ÚstripÚ_log_verification_result)	r   r'   r°   r¸   r…   r_   rv   Úvalsr¹   r   r   r   Ú_verify_value  s8    





zPlugin._verify_valuec             C   s¬   |rL|d kr*t jtj|t|ƒjƒ f ƒ nt jtj||t|ƒjƒ f ƒ dS |d kr|t jtj|t|ƒjƒ t|ƒjƒ f ƒ n(t jtj	||t|ƒjƒ t|ƒjƒ f ƒ dS d S )NTF)
r,   rX   rn   ZSTR_VERIFY_PROFILE_VALUE_OKr5   rÅ   Z"STR_VERIFY_PROFILE_DEVICE_VALUE_OKrT   ZSTR_VERIFY_PROFILE_VALUE_FAILZ$STR_VERIFY_PROFILE_DEVICE_VALUE_FAIL)r   r'   Úsuccessr°   r¸   r_   r   r   r   rÆ   -  s    ((zPlugin._log_verification_resultc             C   sp   |d d k	r |d d||d|ƒS | j |||d�}| j||ƒ}|d krHd S |d ||ddƒ}| j|d ||||ƒS )Nrš   T)r…   rL   Fr'   )r»   rº   rÈ   )r   r>   r§   r_   r°   r…   r¸   r   r   r   r³   <  s    zPlugin._verify_device_commandc             C   sd   |d d k	r|d d|d|ƒS | j |ƒ}| j||ƒ}|d kr@d S |d |ddƒ}| j|d |||ƒS )Nrš   TrL   Fr'   )r»   rº   rÈ   )r   r>   r§   r°   r…   r¸   r   r   r   r²   F  s    
z!Plugin._verify_non_device_commandc             C   sZ   xTt dd„ t| jjƒ ƒD ƒƒD ]4}|jj|d d ƒd k	sF|d | jkr| j||ƒ qW d S )Nc             S   s   g | ]}|d  s|‘qS )r›   r   )rQ   r§   r   r   r   rS   Q  s    z;Plugin._cleanup_all_non_device_commands.<locals>.<listcomp>r'   )ÚreversedrE   r“   rF   r.   r   r   Ú_cleanup_non_device_command)r   r>   r§   r   r   r   r‘   P  s    "$z'Plugin._cleanup_all_non_device_commandsc             C   sl   xft dd„ t| jjƒ ƒD ƒƒD ]F}|jj|d d ƒd k	sF|d | jkrx|D ]}| j||||ƒ qLW qW d S )Nc             S   s   g | ]}|d  r|‘qS )r›   r   )rQ   r§   r   r   r   rS   V  s    z7Plugin._cleanup_all_device_commands.<locals>.<listcomp>r'   )rÊ   rE   r“   rF   r.   r   r   Ú_cleanup_device_command)r   r>   rO   r½   r§   r_   r   r   r   r�   U  s    "$
z#Plugin._cleanup_all_device_commandsc             C   s^   |d d k	r"|d dd |ddƒ n8| j |||ƒ}|d k	rL|d ||d|d� | j|||ƒ d S )Nrš   FrL   )r¼   r½   )r’   r­   )r   r>   r§   r_   r½   Ú	old_valuer   r   r   rÌ   [  s    zPlugin._cleanup_device_commandc             C   sV   |d d k	r |d dd ddƒ n2| j ||ƒ}|d k	rF|d |ddd� | j||ƒ d S )Nrš   FrL   )r¼   r½   )r’   r­   )r   r>   r§   rÍ   r   r   r   rË   d  s    z"Plugin._cleanup_non_device_command)NNN)N)N)N)NF)NN)N)N)F)F)Dr   r%   Ú__qualname__Ú__doc__r   r   r    Úpropertyr'   Úclassmethodr(   r*   r   r0   r8   r?   rA   rD   r   r@   rC   rI   r   rP   rU   r\   rH   r`   rb   rc   rn   ZROLLBACK_SOFTr{   rƒ   r†   rˆ   r‹   r}   r„   rŠ   r‚   r‰   r‡   r   r–   r—   r«   r¬   r’   r­   rŒ   r�   rŽ   r�   rº   r»   r•   r±   r¯   rÂ   rÈ   rÆ   r³   r²   r‘   r�   rÌ   rË   r   r   r   r   r      s|   
#	 



	


!




	r   )r¾   Ztuned.constsrn   Ztuned.profiles.variablesZtunedZ
tuned.logsr   Ztuned.utils.commandsr   rj   Ú
subprocessr   r   Zlogsr   r,   Úobjectr   r   r   r   r   Ú<module>   s   

