o
    _                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlmZmZ zd dlZ	dZ
W n   dZ
Y d dlmZ d dlZd dlmZ ej ZG dd dZdS )    N)	ConfigObjConfigObjErrorTF)commandsc                   @   s0   e Zd ZdddZdd ZdddZd	d
 ZdS )ProfileRecommenderFc                 C   s   || _ t | _d | _d S )N)_is_hardcodedr   	_commands_chassis_type)selfis_hardcoded r   A/usr/lib/python3/dist-packages/tuned/utils/profile_recommender.py__init__   s   
zProfileRecommender.__init__c           
      C   s  t j}| jr|S t dk}|std | jt j|d}|d ur#|S i }t j	D ]=}g }zt
|}W n! tyT } z|jtjkrJtd||f  W Y d }~nd }~ww |D ]}tj||}	|	||< qWq(t| D ]}|| }	| j|	|d}|d ur|  S ql|S )Nr   ztProfile recommender is running without root privileges. Profiles with virt recommendation condition will be omitted.)has_rootzerror accessing %s: %s)constsDEFAULT_PROFILEr   osgeteuidlogwarningprocess_configRECOMMEND_CONF_FILERECOMMEND_DIRECTORIESlistdirOSErrorerrnoENOENTerrorpathjoinsortedkeys)
r	   profiler   matchingfiles	directorycontentsenamer   r   r   r   	recommend   s@   


zProfileRecommender.recommendTc                 C   s  d }z.t j|sW d S t|ddd}t| D ]}d}t||  D ]}|| | }|dkr5d}|dkrQ|s?d} nt|| j	dgd tj
sPd}q'|d	krgt|| jjtjdd
tj
sfd}q'|d dkrt j|rt|| j|tj
sd}q'|dd dkrt }	|	  t|	t|dkrd}q'|dkr|  }
|
rt||
tjsd}q'td|  q'|dkrtrtjjtjjdd}d}z|  |jd }W n( tt t!fy } zt"|dr|j#t#j$krt%d|  W Y d }~nd }~ww t||tjd u rd}q't%d|  q'|r.td}|&d|} W |S qW |S  tt t'fyQ } zt%d||f  W Y d }~|S d }~ww )NF)list_valuesinterpolationT z^$virtz	virt-what   system)no_errorr   /   processchassis_typez:Ignoring 'chassis_type' in '%s', could not read DMI value.syspurpose_role)raise_on_errorroler   z/Failed to load the syspurpose										file: %sz[Failed to process 'syspurpose_role' in '%s'								, the syspurpose module is not availablez,[^,]*$zerror processing '%s', %s)(r   r   isfiler   listr    rematchr   executeS	read_filer   SYSTEM_RELEASE_FILEexistsprocfspidstatsreload_threadslenfind_by_regexcompile_get_chassis_type
IGNORECASEr   debughave_syspurpose
syspurposer#   SyspurposeStoreUSER_SYSPURPOSEr%   IOErrorr   KeyErrorhasattrr   r   r   subr   )r	   fnamer   matching_profileconfigsectionr:   optionvaluepsr3   sr6   r&   rr   r   r   r   9   s   

>z!ProfileRecommender.process_configc              
   C   s  | j d urtd| j   | j S g d}z"tdd}t| }W d    n1 s+w   Y  || | _ W n* tyF   td|  Y n tt	fy` } zt
d|  W Y d }~nd }~ww | j rotd| j   | j S z*tjg dtjtjd	d
}| \}}|jrtd|j|f  n|  | _ W n tt	fy } zt
d|  W Y d }~nd }~ww | j std d| _ | j S td| j   | j S )Nz"returning cached chassis type '%s')%r+   OtherUnknownDesktopzLow Profile Desktopz	Pizza Boxz
Mini TowerTowerPortableLaptopNotebookz	Hand HeldzDocking Stationz
All In OnezSub NotebookzSpace-savingz	Lunch BoxzMain Server ChassiszExpansion ChassiszSub ChassiszBus Expansion ChassiszPeripheral ChassiszRAID ChassiszRack Mount ChassiszSealed-case PCzMulti-system
CompactPCIAdvancedTCABladezBlade EnclosingTabletConvertible
DetachablezIoT GatewayzEmbedded PCzMini PCzStick PCz(/sys/devices/virtual/dmi/id/chassis_typerY   z/Unknown chassis type id read from dmi sysfs: %dz"error accessing dmi sysfs file: %szchassis type - %s)	dmidecodez-szchassis-typeT)stdoutstderr	close_fdsz,dmidecode finished with error (ret %d): '%s'z#error executing dmidecode tool : %sz!could not determine chassis type.r+   )r   r   rH   openintread
IndexErrorr   r   rM   warn
subprocessPopenPIPEcommunicate
returncodestripdecode)r	   DMI_CHASSIS_TYPESsysfs_chassis_typechassis_type_idr&   p_dmi
dmi_output	dmi_errorr   r   r   rF      sL   


z$ProfileRecommender._get_chassis_typeN)F)T)__name__
__module____qualname__r   r(   r   rF   r   r   r   r   r      s
    

Fr   )r   r9   r   r@   rp   	configobjr   r   syspurpose.filesrJ   rI   tuned.constsr   
tuned.logstunedtuned.utils.commandsr   logsgetr   r   r   r   r   r   <module>   s     
