
­­­­­­­­­­­­­­­­­­
<!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rd
}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   
&-