
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
…á�jÓ4  ã               @   s€   d dl mZ d dlZ d dlZ d dlmZ d dlZd dljZd dlm	Z	 dgZ
e jjƒ ZG dd„ deƒZG dd„ de jjjƒZdS )	é    )ÚexportsN)ÚTunedException)ÚcommandsÚ
Controllerc               @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú
TimerStorec             C   s   t ƒ | _tjƒ | _d S )N)ÚdictÚ_timersÚ	threadingZLockÚ_timers_lock)Úself© r   ú /usr/lib/python3.6/controller.pyÚ__init__   s    zTimerStore.__init__c          
   C   s    | j � || j|< W d Q R X d S )N)r
   r   )r   ÚtokenÚtimerr   r   r   Ústore_timer   s    zTimerStore.store_timerc             C   sB   | j �2 y| j| }|jƒ  | j|= W n   Y nX W d Q R X d S )N)r
   r   Úcancel)r   r   r   r   r   r   Ú
drop_timer   s    
zTimerStore.drop_timerc          	   C   s<   | j �, x| jjƒ D ]}|jƒ  qW | jjƒ  W d Q R X d S )N)r
   r   Úvaluesr   Úclear)r   r   r   r   r   Ú
cancel_all   s    zTimerStore.cancel_allN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r   r      s   	r   c                   sŠ  e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Zej	d
ƒdd„ ƒZ
dd„ ZejddƒdUdd„ƒZejddƒdVdd„ƒZejddƒdWdd„ƒZdXdd„ZejddƒdYdd„ƒZejddƒdZdd „ƒZd!d"„ Zejdd#ƒd[d$d%„ƒZejdd#ƒd\d&d'„ƒZejddƒd]d(d)„ƒZejdd*ƒd^d+d,„ƒZejddƒd_d-d.„ƒZejddƒd`d/d0„ƒZejddƒdad1d2„ƒZejdd3ƒdbd4d5„ƒZejdd6ƒdcd7d8„ƒZejdd9ƒddd:d;„ƒZejddƒded<d=„ƒZejddƒdfd>d?„ƒZejddƒdgd@dA„ƒZ ejddBƒdhdCdD„ƒZ!ejddƒdidEdF„ƒZ"ejddGƒdjdHdI„ƒZ#ejddƒdkdJdK„ƒZ$ejdLd#ƒdldMdN„ƒZ%ejddOƒdmdPdQ„ƒZ&ejddRƒdndSdT„ƒZ'‡  Z(S )or   z‘
	Controller's purpose is to keep the program running, start/stop the tuning,
	and export the controller interface (currently only over D-Bus).
	c                s8   t t| ƒjƒ  || _|| _tjƒ | _tƒ | _	t
ƒ | _d S )N)Úsuperr   r   Ú_daemonÚ_global_configr	   ZEventÚ
_terminater   Ú_cmdr   Ú_timer_store)r   ÚdaemonZglobal_config)Ú	__class__r   r   r   +   s    
zController.__init__c             C   sx   t jdƒ | jƒ }| jjtjtjƒ}| r6|r6tjƒ  |rb| j	j
ƒ  x| jj| j	dƒs`tjƒ  qFW t jdƒ | jƒ  dS )z1
		Controller main loop. The call is blocking.
		zstarting controlleré   zterminating controllerN)ÚlogÚinfoÚstartr   Úget_boolÚconstsÚ
CFG_DAEMONÚCFG_DEF_DAEMONr   r   r   r   ÚwaitZperiod_checkÚstop)r   Úresr    r   r   r   Úrun3   s    



zController.runc             C   s   | j jƒ  d S )N)r   Úset)r   r   r   r   Ú	terminateF   s    zController.terminatec             C   s0   | j jjƒ s,| j jjƒ  | jƒ s,| j jjƒ  d S )N)r   Z_sighup_processingZis_setr.   Úreloadr   )r   r   r   r   ÚsighupI   s    zController.sighupZsbsc             C   s   d S )Nr   )r   Úprofile_nameÚresultZerrstrr   r   r   Úprofile_changedO   s    zController.profile_changedc             C   s   t jj|ƒ | jj|ƒ d S )N)ÚtunedÚlogsÚlog_capture_finishr   r   )r   r   r   r   r   Ú_log_capture_abortX   s    zController._log_capture_abortZiiÚsNc             C   sf   |dkrdS t jj|ƒ}|d kr$dS |dkrVtj|| j|gd�}| jj||ƒ |jƒ  |d krbdS |S )NÚ r   )Úargs)	r5   r6   Úlog_capture_startr	   ZTimerr8   r   r   r%   )r   Z	log_levelZtimeoutÚcallerr   r   r   r   r   r<   \   s    zController.log_capture_startc             C   s4   |dkrdS t jj|ƒ}| jj|ƒ |d kr0dS |S )Nr:   )r5   r6   r7   r   r   )r   r   r=   r,   r   r   r   r7   j   s
    zController.log_capture_finishr:   Úbc             C   sD   |dkrdS | j jtjtjƒr:| jjƒ r,dS | jjƒ s:dS | jjƒ S )Nr:   FT)	r   r&   r'   r(   r)   r   Ú
is_runningÚ
is_enabledr%   )r   r=   r   r   r   r%   r   s    

zController.startFc             C   s,   | j jƒ sd}n| j j|d�}| jjƒ  |S )NT)Úprofile_switch)r   r?   r+   r   r   )r   rA   r,   r   r   r   Ú_stop}   s
    

zController._stopc             C   s   |dkrdS | j dd�S )Nr:   F)rA   )rB   )r   r=   r   r   r   r+   …   s    zController.stopc             C   sp   |dkrdS | j jƒ r*| jdd�}|s*dS y| j jƒ  W n. tk
rf } ztjd| ƒ dS d }~X nX | jƒ S )Nr:   FT)rA   zFailed to reload TuneD: %s)r   r?   rB   Zreload_profile_configr   r#   Úerrorr%   )r   r=   Zstop_okÚer   r   r   r0   ‹   s    
zController.reloadc             C   sâ   | j jƒ }d}d}d}z�y$|r,| j jdd� | j j||ƒ W nf tjjk
r¢ } zFd}t|ƒ}|r„| j jj	|kr„t
jd| ƒ d}nt
jd| ƒ W Y d d }~X nX W d |rØ|rÀt
jd| ƒ n|sÎt
jdƒ | j jƒ  X ||fS )	NÚOKTF)rA   z@Failed to reapply profile '%s'. Did it change on disk and break?zFailed to apply profile '%s'z>Applying previously applied (possibly out-dated) profile '%s'.z$Applying previously applied profile.)r   r?   r+   Zset_profiler5   Ú
exceptionsr   ÚstrÚprofileÚnamer#   rC   Úwarnr$   r%   )r   r2   ÚmanualZwas_runningÚmsgÚsuccessZreapplyrD   r   r   r   Ú_switch_profileš   s,    
$
zController._switch_profilez(bs)c             C   s(   |dkrdS | j j|ƒsdS | j|dƒS )Nr:   FÚUnauthorizedúInvalid profile_nameT)FrO   )FrP   )r   Úis_valid_namerN   )r   r2   r=   r   r   r   Úswitch_profileµ   s
    zController.switch_profilec             C   s    |dkrdS | j ƒ }| j|dƒS )Nr:   FrO   )FrO   )Úrecommend_profilerN   )r   r=   r2   r   r   r   Úauto_profile½   s    zController.auto_profilec             C   s*   |dkrdS | j jd k	r"| j jjS dS d S )Nr:   )r   rH   rI   )r   r=   r   r   r   Úactive_profileÄ   s
    
zController.active_profilez(ss)c             C   sˆ   |dkrdS | j j}|d krpy"| jjƒ \}}|d kr<|d k	}W n0 tk
rn } zd}t|ƒ}||fS d }~X nX |rztjntj}|dfS )Nr:   ÚunknownrO   )rV   rO   )	r   rK   r   Zget_active_profiler   rG   r'   ZACTIVE_PROFILE_MANUALZACTIVE_PROFILE_AUTO)r   r=   rK   rH   rD   ÚmoderC   r   r   r   Úprofile_modeÍ   s    zController.profile_modec             C   s   |dkrdS | j jpdS )Nr:   )r   Úpost_loaded_profile)r   r=   r   r   r   rY   ß   s    zController.post_loaded_profilec             C   sB   |dkrdS | j jƒ r | j jƒ  | j jƒ r>| j jd dd dd� dS )Nr:   FT)Zsave_instantly)r   r?   r+   r@   Zset_all_profiles)r   r=   r   r   r   Údisableå   s    


zController.disablec             C   s   |dkrdS | j jƒ S )Nr:   F)r   r?   )r   r=   r   r   r   r?   ð   s    zController.is_runningÚasc             C   s   |dkrg S | j jjjƒ S )Nr:   )r   Úprofile_loaderÚprofile_locatorZget_known_names)r   r=   r   r   r   Úprofilesö   s    zController.profilesza(ss)c             C   s   |dkrg S | j jjjƒ S )Nr:   )r   r\   r]   Zget_known_names_summary)r   r=   r   r   r   Ú	profiles2ü   s    zController.profiles2z(bsss)c             C   sT   |dks| j j|ƒ rdS |d ks*|dkr2| jƒ }t| jjjj|tj	tj
gdgƒƒS )Nr:   F)Fr:   r:   r:   )r   rQ   rU   Útupler   r\   r]   Zget_profile_attrsr'   ZPROFILE_ATTR_SUMMARYZPROFILE_ATTR_DESCRIPTION)r   r2   r=   r   r   r   Úprofile_info  s
    zController.profile_infoc             C   s   |dkrdS | j jjƒ S )Nr:   )r   Zprofile_recommenderZ	recommend)r   r=   r   r   r   rS   
  s    zController.recommend_profilec             C   s   |dkrdS | j jdd�S )Nr:   F)Úignore_missing)r   Úverify_profile)r   r=   r   r   r   rc     s    zController.verify_profilec             C   s   |dkrdS | j jdd�S )Nr:   FT)rb   )r   rc   )r   r=   r   r   r   Úverify_profile_ignore_missing  s    z(Controller.verify_profile_ignore_missingz	a{sa{ss}}c             C   sz   |dkri S i }xd| j jƒ D ]V}|jjdƒd jddƒd }|jƒ }i ||< x$|jƒ D ]\}}t|ƒ|| |< qVW qW |S )zuReturn dictionary with accesible plugins

		Return:
		dictionary -- {plugin_name: {parameter_name: default_value}}
		r:   Ú.r"   Ú_éÿÿÿÿ)r   Úget_all_pluginsr   ÚsplitZ_get_config_optionsÚitemsrG   )r   r=   ZpluginsZplugin_classÚplugin_nameZconf_optionsÚkeyÚvalr   r   r   rh     s    zController.get_all_pluginsc             C   s*   |dks| j j|ƒ rdS | jjt|ƒƒS )z"Return docstring of plugin's classr:   )r   rQ   r   Úget_plugin_documentationrG   )r   rk   r=   r   r   r   rn   .  s    z#Controller.get_plugin_documentationza{ss}c             C   s*   |dks| j j|ƒ ri S | jjt|ƒƒS )zžReturn dictionary with plugin's parameters and their hints

		Parameters:
		plugin_name -- name of plugin

		Return:
		dictionary -- {parameter_name: hint}
		r:   )r   rQ   r   Úget_plugin_hintsrG   )r   rk   r=   r   r   r   ro   5  s    
zController.get_plugin_hintsc             C   sD   |dks| j j|ƒ rdS | jjr@| jjjr@| jjjj|ƒ dS dS )z¤Allows to dynamically add sockets to send signals to

		Parameters:
		path -- path to socket to register for sending signals

		Return:
		bool -- True on success
		r:   FT)r   rQ   r   Z_applicationZ_unix_socket_exporterZregister_signal_path)r   Úpathr=   r   r   r   Úregister_socket_signal_pathC  s    
z&Controller.register_socket_signal_pathZssc       
      C   s‚  |dkrdS | j j|ƒsdS | j j|ƒs,dS d}x2| jjjD ]$}|j|kr<tjd|j ƒ d}P q<W |s‚d| }tj|ƒ d|fS t	| j j
|ƒƒ}tjd	|jt|ƒf ƒ xª| jjjD ]œ}|j|@ }	t|	ƒr¶||	8 }tjd
t|	ƒ|j|jf ƒ |jj|jjk�r6d|j|jjt|	ƒ|j|jjf }tj|ƒ d|fS |jj||	ƒ |jj||	ƒ q¶W t|ƒ�r~dt|ƒ }tj|ƒ d|fS dS )Nr:   FrO   úInvalid devicesúInvalid instance_namezFound instance '%s'.TzInstance '%s' not foundz-Instance '%s' trying to acquire devices '%s'.z8Moving devices '%s' from instance '%s' to instance '%s'.ztTarget instance '%s' is of type '%s', but devices '%s' are currently handled by instance '%s' which is of type '%s'.z2Ignoring devices not handled by any instance '%s'.rE   )FrO   )Frr   )Frs   )TrE   )r   rQ   r   Ú_unit_managerÚ	instancesrI   r#   ÚdebugrC   r.   Zdevstr2devsrG   Úprocessed_devicesÚlenr$   ÚpluginZ_remove_devices_nocheckZ_add_devices_nocheck)
r   ZdevicesÚinstance_namer=   ÚfoundZinstance_targetÚretsZdevsÚinstanceZdevs_movingr   r   r   Úinstance_acquire_devicesW  sJ    





z#Controller.instance_acquire_devicesz	(bsa(ss))c                s¢   |dkrddg fS | j jˆ ƒs(ddg fS ˆ dkr\ˆ | jƒ jƒ kr\dˆ  }tj|ƒ d|g fS tdd„ | jjj	ƒ}ˆ dkrŠt‡ fdd„|ƒ}d	d
t
tdd„ |ƒƒfS )a  Return a list of active instances of a plugin or all active instances

		Parameters:
		plugin_name -- name of the plugin or an empty string

		Return:
		bool -- True on success
		string -- error message or "OK"
		list of string pairs -- [(instance_name, plugin_name)]
		r:   FrO   zInvalid plugin_namezPlugin '%s' does not existc             S   s   | j S )N)Zactive)r}   r   r   r   Ú<lambda>“  s    z*Controller.get_instances.<locals>.<lambda>c                s   | j jˆ kS )N)ry   rI   )r}   )rk   r   r   r   •  s    TrE   c             S   s   | j | jj fS )N)rI   ry   )r}   r   r   r   r   –  s    )r   rQ   rh   Úkeysr#   rC   Úfilterr   rt   ru   ÚlistÚmap)r   rk   r=   r|   ru   r   )rk   r   Úget_instances  s    



zController.get_instancesz(bsas)c             C   sv   |dkrddg fS | j j|ƒs(ddg fS x0| jjjD ]"}|j|kr4ddtt|jƒƒfS q4W d| }t	j
|ƒ d|g fS )zÓReturn a list of devices assigned to an instance

		Parameters:
		instance_name -- name of the instance

		Return:
		bool -- True on success
		string -- error message or "OK"
		list of strings -- device names
		r:   FrO   zInvalid instance_nameTrE   zInstance '%s' not found)r   rQ   r   rt   ru   rI   Úsortedr‚   rw   r#   rC   )r   rz   r=   r}   r|   r   r   r   Úinstance_get_devices˜  s    



zController.instance_get_devices)N)N)N)F)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N))r   r   r   Ú__doc__r   r-   r/   r1   r   Úsignalr4   r8   Zexportr<   r7   r%   rB   r+   r0   rN   rR   rT   rU   rX   rY   rZ   r?   r^   r_   ra   rS   rc   rd   rh   rn   ro   rq   r~   r„   r†   Ú__classcell__r   r   )r!   r   r   %   sv   	

























'

)r5   r   Z
tuned.logsZtuned.exceptionsr   r	   Ztuned.constsr'   Ztuned.utils.commandsr   Ú__all__r6   Úgetr#   Úobjectr   Z
interfacesZExportableInterfacer   r   r   r   r   Ú<module>   s   

