3 @ag4@sddlmZddlZddlZddlmZddlZddljZddlm Z dgZ ej j Z GdddeZGdddejjjZdS) )exportsN)TunedException)commands Controllerc@s,eZdZddZddZddZddZd S) TimerStorecCst|_tj|_dS)N)dict_timers threadingZLock _timers_lock)selfr /usr/lib/python3.6/controller.py__init__szTimerStore.__init__c Cs |j||j|<WdQRXdS)N)r r)r tokentimerr r r store_timerszTimerStore.store_timercCsB|j2y|j|}|j|j|=Wn YnXWdQRXdS)N)r rcancel)r rrr r r drop_timers  zTimerStore.drop_timerc Cs<|j,x|jjD] }|jqW|jjWdQRXdS)N)r rvaluesrclear)r rr r r cancel_alls zTimerStore.cancel_allN)__name__ __module__ __qualname__rrrrr r r r r s rcseZdZdZfddZddZddZdd Zej d d d Z d dZ ej dddUddZ ej dddVddZej dddWddZdXddZej dddYddZej dddZdd Zd!d"Zej dd#d[d$d%Zej dd#d\d&d'Zej ddd]d(d)Zej dd*d^d+d,Zej ddd_d-d.Zej ddd`d/d0Zej dddad1d2Zej dd3dbd4d5Zej dd6dcd7d8Zej dd9ddd:d;Zej dddedd?Zej dddgd@dAZ ej ddBdhdCdDZ!ej dddidEdFZ"ej ddGdjdHdIZ#ej dddkdJdKZ$ej dLd#dldMdNZ%ej ddOdmdPdQZ&ej ddRdndSdTZ'Z(S)orz Controller's purpose is to keep the program running, start/stop the tuning, and export the controller interface (currently only over D-Bus). cs8tt|j||_||_tj|_t|_ t |_ dS)N) superrr_daemon_global_configr ZEvent _terminater_cmdr _timer_store)r daemonZ global_config) __class__r r r+s  zController.__init__cCsxtjd|j}|jjtjtj}| r6|r6tj|rb|j j x|j j |j ds`tj qFWtjd|jdS)z1 Controller main loop. The call is blocking. zstarting controllerzterminating controllerN)loginfostartrget_boolconsts CFG_DAEMONCFG_DEF_DAEMONrrrrwaitZ period_checkstop)r resr r r r run3s     zController.runcCs|jjdS)N)rset)r r r r terminateFszController.terminatecCs0|jjjs,|jjj|js,|jjjdS)N)rZ_sighup_processingZis_setr.reloadr)r r r r sighupIs  zController.sighupZsbscCsdS)Nr )r profile_nameresultZerrstrr r r profile_changedOszController.profile_changedcCstjj||jj|dS)N)tunedlogslog_capture_finishrr)r rr r r _log_capture_abortXs zController._log_capture_abortZiisNcCsf|dkr dStjj|}|dkr$dS|dkrVtj||j|gd}|jj|||j|dkrbdS|S)Nr)args) r5r6log_capture_startr ZTimerr8rrr%)r Z log_levelZtimeoutcallerrrr r r r<\s zController.log_capture_startcCs4|dkr dStjj|}|jj||dkr0dS|S)Nr:)r5r6r7rr)r rr=r,r r r r7js   zController.log_capture_finishr:bcCsD|dkr dS|jjtjtjr:|jjr,dS|jjs:dS|jjS)Nr:FT) rr&r'r(r)r is_running is_enabledr%)r r=r r r r%rs  zController.startFcCs,|jjsd}n|jj|d}|jj|S)NT)profile_switch)rr?r+rr)r rAr,r r r _stop}s   zController._stopcCs|dkr dS|jddS)Nr:F)rA)rB)r r=r r r r+szController.stopcCsp|dkr dS|jjr*|jdd}|s*dSy|jjWn.tk rf}ztjd|dSd}~XnX|jS)Nr:FT)rAzFailed to reload TuneD: %s)rr?rBZreload_profile_configrr#errorr%)r r=Zstop_oker r r r0s  zController.reloadcCs|jj}d}d}d}zy$|r,|jjdd|jj||Wnftjjk r}zFd}t|}|r|jjj |krt j d|d}nt j d|WYdd}~XnXWd|r|rt j d|n|st j d|jjX||fS) NOKTF)rAz@Failed to reapply profile '%s'. Did it change on disk and break?zFailed to apply profile '%s'z>Applying previously applied (possibly out-dated) profile '%s'.z$Applying previously applied profile.)rr?r+Z set_profiler5 exceptionsrstrprofilenamer#rCwarnr$r%)r r2manualZ was_runningmsgsuccessZreapplyrDr r r _switch_profiles, $  zController._switch_profilez(bs)cCs(|dkr dS|jj|sdS|j|dS)Nr:F UnauthorizedInvalid profile_nameT)FrO)FrP)r is_valid_namerN)r r2r=r r r switch_profiles  zController.switch_profilecCs |dkr dS|j}|j|dS)Nr:FrO)FrO)recommend_profilerN)r r=r2r r r auto_profileszController.auto_profilecCs*|dkr dS|jjdk r"|jjjSdSdS)Nr:)rrHrI)r r=r r r active_profiles   zController.active_profilez(ss)cCs|dkr dS|jj}|dkrpy"|jj\}}|dkr<|dk }Wn0tk rn}zd}t|}||fSd}~XnX|rztjntj}|dfS)Nr:unknownrO)rVrO) rrKrZget_active_profilerrGr'ZACTIVE_PROFILE_MANUALZACTIVE_PROFILE_AUTO)r r=rKrHrDmoderCr r r profile_modes zController.profile_modecCs|dkr dS|jjpdS)Nr:)rpost_loaded_profile)r r=r r r rYszController.post_loaded_profilecCsB|dkr dS|jjr |jj|jjr>|jjddddddS)Nr:FT)Zsave_instantly)rr?r+r@Zset_all_profiles)r r=r r r disables    zController.disablecCs|dkr dS|jjS)Nr:F)rr?)r r=r r r r?szController.is_runningascCs|dkr gS|jjjjS)Nr:)rprofile_loaderprofile_locatorZget_known_names)r r=r r r profilesszController.profilesza(ss)cCs|dkr gS|jjjjS)Nr:)rr\r]Zget_known_names_summary)r r=r r r profiles2szController.profiles2z(bsss)cCsT|dks|jj| rdS|dks*|dkr2|j}t|jjjj|tj tj gdgS)Nr:F)Fr:r:r:) rrQrUtuplerr\r]Zget_profile_attrsr'ZPROFILE_ATTR_SUMMARYZPROFILE_ATTR_DESCRIPTION)r r2r=r r r profile_infos zController.profile_infocCs|dkr dS|jjjS)Nr:)rZprofile_recommenderZ recommend)r r=r r r rS szController.recommend_profilecCs|dkr dS|jjddS)Nr:F)ignore_missing)rverify_profile)r r=r r r rcszController.verify_profilecCs|dkr dS|jjddS)Nr:FT)rb)rrc)r r=r r r verify_profile_ignore_missingsz(Controller.verify_profile_ignore_missingz a{sa{ss}}cCsz|dkr iSi}xd|jjD]V}|jjddjddd}|j}i||<x$|jD]\}}t||||<qVWqW|S)zuReturn dictionary with accesible plugins Return: dictionary -- {plugin_name: {parameter_name: default_value}} r:.r"_)rget_all_pluginsrsplitZ_get_config_optionsitemsrG)r r=ZpluginsZ plugin_class plugin_nameZ conf_optionskeyvalr r r rhszController.get_all_pluginscCs*|dks|jj| rdS|jjt|S)z"Return docstring of plugin's classr:)rrQrget_plugin_documentationrG)r rkr=r r r rn.sz#Controller.get_plugin_documentationza{ss}cCs*|dks|jj| riS|jjt|S)zReturn dictionary with plugin's parameters and their hints Parameters: plugin_name -- name of plugin Return: dictionary -- {parameter_name: hint} r:)rrQrget_plugin_hintsrG)r rkr=r r r ro5s zController.get_plugin_hintscCsD|dks|jj| rdS|jjr@|jjjr@|jjjj|dSdS)zAllows 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)rrQrZ _applicationZ_unix_socket_exporterZregister_signal_path)r pathr=r r r register_socket_signal_pathCs z&Controller.register_socket_signal_pathZssc Cs|dkr dS|jj|sdS|jj|s,dSd}x2|jjjD]$}|j|krsz*Controller.get_instances..cs |jjkS)N)ryrI)r})rkr r rsTrEcSs|j|jjfS)N)rIry)r}r r r rs) rrQrhkeysr#rCfilterrrtrulistmap)r rkr=r|rur )rkr get_instancess      zController.get_instancesz(bsas)cCsv|dkrddgfS|jj|s(ddgfSx0|jjjD]"}|j|kr4ddtt|jfSq4Wd|}t j |d|gfS)zReturn 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:FrOzInvalid instance_nameTrEzInstance '%s' not found) rrQrrtrurIsortedrrwr#rC)r rzr=r}r|r r r instance_get_devicess      zController.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))rrr__doc__rr-r/r1rsignalr4r8Zexportr<r7r%rBr+r0rNrRrTrUrXrYrZr?r^r_rarSrcrdrhrnrorqr~rr __classcell__r r )r!r r%sv                                             '   )r5rZ tuned.logsZtuned.exceptionsrr Z tuned.constsr'Ztuned.utils.commandsr__all__r6getr#objectrZ interfacesZExportableInterfacerr r r r s