
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
\¼me  ã               @   sd  d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
mZ e jeƒZdZeddd	gƒZd:ej_ed
dƒeddƒeddƒeddƒeddƒeddƒeddƒeddƒeddƒeddƒeddƒed d!ƒed"d#ƒed$d%ƒed&d'ƒed(d)ƒed*d+ƒd,œZeee d-œd.d/„Zeee d-œd0d1„Zeeee d2œd3d4„Zeee d-œd5d6„Zeed7œd8d9„ZdS );é    N)Ú
namedtuple)ÚOptional)Úsubp)Úis_containerÚ
is_FreeBSDz/sys/class/dmi/idÚKernelNamesÚlinuxÚfreebsdZboard_asset_tagzsmbios.planar.tagZboard_vendorzsmbios.planar.makerZ
board_namezsmbios.planar.productZboard_serialzsmbios.planar.serialZboard_versionzsmbios.planar.versionZ	bios_datezsmbios.bios.reldateZbios_vendorzsmbios.bios.vendorZbios_versionzsmbios.bios.versionZchassis_asset_tagzsmbios.chassis.tagZchassis_vendorzsmbios.chassis.makerZchassis_serialzsmbios.chassis.serialZchassis_versionzsmbios.chassis.versionZ
sys_vendorzsmbios.system.makerZproduct_namezsmbios.system.productZproduct_serialzsmbios.system.serialZproduct_uuidzsmbios.system.uuidZproduct_versionzsmbios.system.version)zbaseboard-asset-tagzbaseboard-manufacturerzbaseboard-product-namezbaseboard-serial-numberzbaseboard-versionzbios-release-datezbios-vendorzbios-versionzchassis-asset-tagzchassis-manufacturerzchassis-serial-numberzchassis-versionzsystem-manufacturerzsystem-product-namezsystem-serial-numberzsystem-uuidzsystem-version)ÚkeyÚreturnc             C   sþ   t j| ƒ}|dks|jdkr dS djt|jƒ}tjd|ƒ tjj	|ƒsVtjd|ƒ dS y"t
|dƒ�}|jƒ }W dQ R X W n  tk
r˜   tjd|ƒ dS X |dt|ƒd  d	 kr¶d
}y|jdƒjƒ S  tk
� rø } ztjd|||ƒ W Y dd}~X nX dS )z/
    Reads dmi data from /sys/class/dmi/id
    Nz{0}/{1}zquerying dmi data %szdid not find %sÚrbzCould not read %só   ÿé   ó   
ó    Úutf8z-utf-8 decode of content (%s) in %s failed: %s)ÚDMIDECODE_TO_KERNELÚgetr   ÚformatÚDMI_SYS_PATHÚLOGÚdebugÚosÚpathÚexistsÚopenÚreadÚPermissionErrorÚlenÚdecodeÚstripÚUnicodeDecodeErrorÚerror)r
   ÚkmapZdmi_key_pathÚfpZkey_dataÚe© r&   ú/usr/lib/python3.6/dmi.pyÚ_read_dmi_syspath?   s2    
r(   c             C   sœ   t j| ƒ}|dks|jdkr dS tjd|jƒ y6dd|jg}tj|ƒ\}}|jƒ }tjd||jƒ |S  tjk
r– } ztjd||ƒ W Y dd}~X nX dS )z/
    Reads dmi data from FreeBSD's kenv(1)
    Nzquerying dmi data %sZkenvz-qzkenv returned '%s' for '%s'zfailed kenv cmd: %s
%s)r   r   r	   r   r   r   r    ÚProcessExecutionError)r
   r#   ÚcmdÚresultÚ_errr%   r&   r&   r'   Ú
_read_kenve   s    
 r-   )r
   Údmidecode_pathr   c             C   s|   yF|d| g}t j |ƒ\}}|jƒ }tjd|| ƒ |jddƒdkrDdS |S  t jk
rv } ztjd||ƒ dS d}~X nX dS )z
    Calls out to dmidecode to get the data out. This is mostly for supporting
    OS's without /sys/class/dmi/id support.
    z--stringz dmidecode returned '%s' for '%s'Ú.Ú zfailed dmidecode cmd: %s
%sN)r   r    r   r   Úreplacer)   )r
   r.   r*   r+   r,   r%   r&   r&   r'   Ú_call_dmidecode{   s    
r2   c             C   sˆ   t ƒ r
dS tƒ rt| ƒS t| ƒ}|dk	r,|S dd„ }tjƒ d }||ƒpN|d
ks`tjd|ƒ dS tj	dƒ}|rxt
| |ƒS tjd	tƒ dS )aˆ  
    Wrapper for reading DMI data.

    If running in a container return None.  This is because DMI data is
    assumed to be not useful in a container as it does not represent the
    container but rather the host.

    This will do the following (returning the first that produces a
    result):
        1) Use a mapping to translate `key` from dmidecode naming to
           sysfs naming and look in /sys/class/dmi/... for a value.
        2) Use `key` as a sysfs key directly and look in /sys/class/dmi/...
        3) Fall-back to passing `key` to `dmidecode --string`.

    If all of the above fail to find a value, None will be returned.
    Nc             S   s$   | dkp"| d dko"| dd … dkS )NZx86_64r   Úié   Z86r&   )Zarchr&   r&   r'   Úis_x86©   s    zread_dmi_data.<locals>.is_x86é   Úaarch64Úamd64zdmidata is not supported on %sZ	dmidecodez0did not find either path %s or dmidecode command)r7   r8   )r   r   r-   r(   r   Úunamer   r   r   Zwhichr2   r   )r
   Zsyspath_valuer5   Z
uname_archr.   r&   r&   r'   Úread_dmi_data�   s"    

r:   )Úsrcr   c             C   s|   d| kr| S t jƒ }xbtjd| ƒD ]R}||kr@tjd|| |ƒ q"t|ƒ}|sPd}tjd|| |ƒ | jd|› d�|ƒ} q"W | S )zBReplace __dmi.VARNAME__ with DMI values from either sysfs or kenv.Ú__z__dmi\.([^_]+)__z7Ignoring invalid __dmi.%s__ in %s. Expected one of: %s.r0   z'Replacing __dmi.%s__ in '%s' with '%s'.z__dmi.)	r   ÚkeysÚreÚfindallr   Zwarningr:   r   r1   )r;   Zvalid_dmi_keysÚmatchZ	dmi_valuer&   r&   r'   Úsub_dmi_varsº   s*    rA   )NN)Zloggingr   r>   Úcollectionsr   Ztypingr   Z	cloudinitr   Zcloudinit.utilr   r   Z	getLoggerÚ__name__r   r   r   Ú__new__Ú__defaults__r   Ústrr(   r-   r2   r:   rA   r&   r&   r&   r'   Ú<module>   sR   
&-