U
    LdC                     @   sh  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	 d dl
mZmZ e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/d0d1Zeee d/d2d3Zeeee d4d5d6Zeee d/d7d8Zeed9d:d;ZdS )<    N)
namedtuple)Optional)log)subp)is_container
is_FreeBSDz/sys/class/dmi/idKernelNameslinuxfreebsd)NNZ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 | }|dks|jdkr dS dt|j}td| tj	|sVtd| dS z"t
|d}| }W 5 Q R X W n" tk
r   td| Y dS X |dt|d  d	 krd
}z|d W S  tk
 r } ztd||| W 5 d}~X Y nX dS )z/
    Reads dmi data from /sys/class/dmi/id
    Nz{0}/{1}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/dist-packages/cloudinit/dmi.py_read_dmi_syspath?   s4    
r*   c              
   C   s   t | }|dks|jdkr dS td|j z8dd|jg}t|\}}| }td||j |W S  tjk
r } ztd|| W 5 d}~X Y nX dS )z/
    Reads dmi data from FreeBSD's kenv(1)
    Nr   Z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   zJ|d| g}t  |\}}| }td||  |dddkrFW dS |W S  t jk
r } ztd|| W Y dS d}~X Y 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   r0   r,   r-   r.   r'   r(   r(   r)   _call_dmidecode{   s    
r4   c                 C   s   t  r
dS t rt| S t| }|dk	r,|S dd }t d }||s`|dks`td| dS t	d}|rxt
| |S t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   )Zaarch64Zamd64zdmidata is not supported on %sZ	dmidecodez0did not find either path %s or dmidecode command)r   r   r/   r*   r   unamer   r   r   Zwhichr4   r   )r   Zsyspath_valuer7   Z
uname_archr0   r(   r(   r)   read_dmi_data   s"    

r:   )srcr   c                 C   sx   d| kr| S t  }td| D ]R}||kr>td|| | q t|}|sNd}td|| | | d| d|} q | S )zBReplace __dmi.VARNAME__ with DMI values from either sysfs or kenv.__z__dmi\.([^_]+)__z7Ignoring invalid __dmi.%s__ in %s. Expected one of: %s.r2   z'Replacing __dmi.%s__ in '%s' with '%s'.z__dmi.)	r   keysrefindallr   Zwarningr:   r   r3   )r;   Zvalid_dmi_keysmatchZ	dmi_valuer(   r(   r)   sub_dmi_vars   s.    rA   )r   r>   collectionsr   typingr   Z	cloudinitr   Zloggingr   Zcloudinit.utilr   r   Z	getLogger__name__r   r   r   __new____defaults__r   strr*   r/   r4   r:   rA   r(   r(   r(   r)   <module>   sx   
         '&-