a ”ˆ«h9ã@s–ddlZddlZddlZddlZddlZddlmZmZzddlZ dZ WndZ Yn0ddl m Z ddl ZddlmZej ¡ZGdd„dƒZdS)éN)Ú ConfigParserÚErrorTF)Úcommandsc@s0eZdZd dd„Zdd„Zd dd„Zd d „Zd S)ÚProfileRecommenderFcCs||_tƒ|_d|_dS)N)Ú _is_hardcodedrÚ _commandsÚ _chassis_type)ÚselfZ is_hardcoded©r úC/usr/lib/python3.9/site-packages/tuned/utils/profile_recommender.pyÚ__init__szProfileRecommender.__init__c Cstj}|jr|St ¡dk}|s*t d¡|jtj|d}|durF|Si}tj D]z}g}zt  |¡}WnBt y¨}z*|j t j kr”t d||f¡WYd}~n d}~00|D]}tj ||¡} | ||<q®qPt| ¡ƒD]*}||} |j| |d}|durØ|SqØ|S)NrztProfile recommender is running without root privileges. Profiles with virt recommendation condition will be omitted.)Úhas_rootzerror accessing %s: %s)ÚconstsZDEFAULT_PROFILErÚosÚgeteuidÚlogÚwarningÚprocess_configZRECOMMEND_CONF_FILEZRECOMMEND_DIRECTORIESÚlistdirÚOSErrorÚerrnoÚENOENTÚerrorÚpathÚjoinÚsortedÚkeys) r Zprofiler ZmatchingÚfilesZ directoryÚcontentsÚeÚnamerr r r Ú recommends8  ÿ  (  zProfileRecommender.recommendTc Csäd}d}z–tj |¡sWdStdddd}t|_t|ƒ}| ||¡Wdƒn1s\0Y| ¡D],}d}|  |¡D]ö} |j || dd} | dkr¤d} | d krÞ|sºd}q|t   | |j  d g¡d t j¡sÜd}q‚| d krt   | |j jtjdd t j¡szd}q‚| ddkrJtj | ¡rDt   | |j  | ¡t j¡szd}q‚| dd…dkrŒt ¡} |  ¡t|  t  | ¡¡ƒdkrzd}q‚| dkr¶| ¡} t   | | t j¡szd}q‚| dkr‚d} trJtjjtjjdd}z| ¡|j d} WnTt!t"t#fyF}z4t$|dƒr2|j%t%j&kr2t' (d|¡WYd}~n d}~00n|sbt' (d|¡d}t   | | t j¡dur‚d}q‚|rnt  d¡}| )d|¡}qžqnWn>t!t"t*fyÞ}zt' (d||f¡WYd}~n d}~00|S)NFú=ú#)Z delimitersZinline_comment_prefixesÚstrictT)ÚrawÚz^$Zvirtz virt-whatéÚsystem)Zno_errorrú/éZprocessÚ chassis_typeZsyspurpose_role)Zraise_on_errorÚrolerz/Failed to load the syspurpose file: %sz\Failed to process 'syspurpose_role' in '%s' , the syspurpose module is not availablez,[^,]*$zerror processing '%s', %s)+rrÚisfilerÚstrZ optionxformÚopenZ read_fileZsectionsÚoptionsÚgetÚreÚmatchrZexecuteÚSrZSYSTEM_RELEASE_FILEÚexistsÚprocfsZpidstatsZreload_threadsÚlenZ find_by_regexÚcompileÚ_get_chassis_typeÚ IGNORECASEÚhave_syspurposeÚ syspurposerZSyspurposeStoreZUSER_SYSPURPOSErÚIOErrorrÚKeyErrorÚhasattrrrrrÚsubr)r Úfnamer Zmatching_profileZsyspurpose_error_loggedZconfigÚfÚsectionr3ÚoptionÚvalueZpsr+r,ÚsrÚrr r r r9s–  *ÿ þýÿ þÿÿ   (z!ProfileRecommender.process_configc Csž|jdur t d|j¡|jSgd¢}zDtddƒ}t| ¡ƒ}Wdƒn1sV0Y|||_WnTtyŒt d|¡Yn6tt fyÀ}zt  d|¡WYd}~n d}~00|jrÞt d|j¡|jSzVt j gd¢t j t j d d }| ¡\}}|jr$t d |j|f¡n| ¡ ¡|_Wn8tt fyl}zt  d |¡WYd}~n d}~00|jsˆt d ¡d|_nt d|j¡|jS)Nz"returning cached chassis type '%s')%r&ZOtherZUnknownZDesktopzLow Profile Desktopz Pizza Boxz Mini TowerZTowerZPortableZLaptopZNotebookz Hand HeldzDocking Stationz All In Onez Sub Notebookz Space-savingz Lunch BoxzMain Server ChassiszExpansion Chassisz Sub ChassiszBus Expansion ChassiszPeripheral Chassisz RAID ChassiszRack Mount ChassiszSealed-case PCz Multi-systemZ CompactPCIZ AdvancedTCAZBladezBlade EnclosingZTabletZ ConvertibleZ Detachablez IoT Gatewayz Embedded PCzMini PCzStick PCz(/sys/devices/virtual/dmi/id/chassis_typerGz/Unknown chassis type id read from dmi sysfs: %dz"error accessing dmi sysfs file: %szchassis type - %s)Z dmidecodez-sz chassis-typeT)ÚstdoutÚstderrZ close_fdsz,dmidecode finished with error (ret %d): '%s'z#error executing dmidecode tool : %sz!could not determine chassis type.r&)rrÚdebugr/ÚintÚreadÚ IndexErrorrrr=rÚ subprocessÚPopenÚPIPEZ communicateÚ returncodeÚstripÚdecode)r ZDMI_CHASSIS_TYPESZsysfs_chassis_typeZchassis_type_idrZp_dmiZ dmi_outputZ dmi_errorr r r r9‚s>  * $ þ $ z$ProfileRecommender._get_chassis_typeN)F)T)Ú__name__Ú __module__Ú __qualname__r r!rr9r r r r rs  Ir)rr2rr6rNZtuned.utils.config_parserrrZsyspurpose.filesr<r;Z tuned.constsrZ tuned.logsZtunedZtuned.utils.commandsrZlogsr1rrr r r r Ús