<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
3
<e3              	   @   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 yd dlZ	dZ
W n   dZ
Y nX d dljZd dlZd dlmZ ejj ZG dd dZdS )    N)ConfigParserErrorTF)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)selfZis_hardcoded r
   )/usr/lib/python3.6/profile_recommender.py__init__   s    zProfileRecommender.__init__c       
      C   s  t j}| jr|S tj dk}|s*tjd | jt j|d}|d k	rF|S i }xt j	D ]|}g }ytj
|}W n@ tk
r } z$|jtjkrtjd||f  W Y d d }~X nX x"|D ]}tjj||}	|	||< qW qRW x6t|j D ]&}|| }	| j|	|d}|d k	r|S qW |S )Nr   ztProfile recommender is running without root privileges. Profiles with virt recommendation condition will be omitted.)has_rootzerror accessing %s: %s)constsZDEFAULT_PROFILEr   osgeteuidlogZwarningprocess_configZRECOMMEND_CONF_FILEZRECOMMEND_DIRECTORIESlistdirOSErrorerrnoENOENTerrorpathjoinsortedkeys)
r	   Zprofiler   ZmatchingfilesZ	directorycontentsenamer   r
   r
   r   	recommend   s6    
$
zProfileRecommender.recommendTc          !   C   s  d }d}yt jj|sd S tdddd}t|_t|}|j|| W d Q R X x:|j D ],}d}x|j	|D ]}	|j
||	dd}
|
dkrd}
|	d	kr|sd}P tj|
| jjd
gd tjsd}qt|	dk rtj|
| jjtjddtjsjd}qt|	d dkr<t jj|	 s6tj|
| jj|	tj rjd}qt|	dd dkr~tj }|j  t|jtj|
dkrjd}qt|	dkr| j }tj|
|tjsjd}qt|	dkrtd}tr:tjjtjjdd}y|j  |j d }W nR t!t"t#fk
r6 } z.t$|dr&|j%t%j&kr&t'j(d|  W Y d d }~X nX n|sRt'j(d|  d}tj|
|tjd krtd}qtW |r\tjd}|j)d|}P q\W W n< t!t"t*fk
r } zt'j(d||f  W Y d d }~X nX |S )NF=#)Z
delimitersZinline_comment_prefixesstrictT)raw z^$Zvirtz	virt-what   system)Zno_errorr   /   Zprocesschassis_typeZsyspurpose_role)Z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   strZoptionxformopenZ	read_fileZsectionsZoptionsgetrematchr   ZexecuteSr   ZSYSTEM_RELEASE_FILEexistsprocfsZpidstatsZreload_threadslenZfind_by_regexcompile_get_chassis_type
IGNORECASEhave_syspurpose
syspurposer   ZSyspurposeStoreZUSER_SYSPURPOSEr   IOErrorr   KeyErrorhasattrr   r   r   r   subr   )r	   Zfnamer   Zmatching_profileZsyspurpose_error_loggedconfigfZsectionr1   ZoptionvalueZpsr*   r+   sr   rr
   r
   r   r   9   s    





$z!ProfileRecommender.process_configc          %   C   s  | j d k	r tjd| j   | j S dddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&g%}y0td'd(}t|j }W d Q R X || | _ W nT tk
r   tjd)|  Y n4 tt	fk
r } ztj
d*|  W Y d d }~X nX | j rtjd+| j   | j S yXtjd,d-d.gtjtjd/d0}|j \}}|jrZtjd1|j|f  n|j j | _ W n6 tt	fk
r } ztj
d2|  W Y d d }~X nX | j stjd3 d| _ ntjd+| j   | j S )4Nz"returning cached chassis type '%s'r%   ZOtherZUnknownZDesktopzLow Profile Desktopz	Pizza Boxz
Mini TowerZTowerZPortableZLaptopZ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-systemZ
CompactPCIZAdvancedTCAZBladezBlade EnclosingZTabletZConvertibleZ
DetachablezIoT GatewayzEmbedded PCzMini PCzStick PCz(/sys/devices/virtual/dmi/id/chassis_typerC   z/Unknown chassis type id read from dmi sysfs: %dz"error accessing dmi sysfs file: %szchassis type - %sZ	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   r   debugr.   intread
IndexErrorr   r   r;   warn
subprocessPopenPIPEZcommunicate
returncodestripdecode)r	   ZDMI_CHASSIS_TYPESZsysfs_chassis_typeZchassis_type_idr   Zp_dmiZ
dmi_outputZ	dmi_errorr
   r
   r   r7      sF    


  
z$ProfileRecommender._get_chassis_typeN)F)T)__name__
__module____qualname__r   r    r   r7   r
   r
   r
   r   r      s   

Ir   )r   r0   r   r4   rK   Ztuned.utils.config_parserr   r   Zsyspurpose.filesr:   r9   Ztuned.constsr   Z
tuned.logsZtunedZtuned.utils.commandsr   Zlogsr/   r   r   r
   r
   r
   r   <module>   s   


