U
    Ӈgr                     @   s  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m	Z	 d dl
mZmZmZmZ e eZdZeddd	d
gZdej_edddedddedddedddedddedddedddedddedddeddd ed!d"d#ed$d%ded&d'd ed(d)d*ed+d,d#ed-d.d#ed/d0dd1Zeee d2d3d4Zeee d2d5d6Zeee d2d7d8Zeeee d9d:d;Zeee d2d<d=Zeed>d?d@ZdS )A    N)
namedtuple)Optional)performancesubp)is_containeris_DragonFlyBSD
is_FreeBSD
is_OpenBSDz/sys/class/dmi/idKernelNameslinuxfreebsdopenbsd)NNNZ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	hw.vendorZchassis_serialzsmbios.chassis.serialzhw.uuidZchassis_versionzsmbios.chassis.versionZ
sys_vendorzsmbios.system.makerZproduct_namezsmbios.system.productz
hw.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| $ t|d}| }W 5 Q R X 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 %szReading 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existsr   ZTimed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_syspathP   s<    
  r-   c              
   C   s   t | }|dks|jdkr dS td|j z2dd|jg}t|j }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   stdoutr%   ProcessExecutionErrorr   r(   cmdresultr*   r+   r+   r,   
_read_kenvx   s    
 r3   c              
   C   s   t | }|dks|jdkr dS td|j z2dd|jg}t|j }td||j |W S  tjk
r } ztd|| W 5 d}~X Y nX dS )z1
    Reads dmi data from OpenBSD's sysctl(8)
    Nr   Zsysctlz-qnzsysctl returned '%s' for '%s'zfailed sysctl cmd: %s
%s)	r   r   r   r   r   r   r.   r%   r/   r0   r+   r+   r,   _read_sysctl   s    
 r4   )r   dmidecode_pathr   c              
   C   s   zD|d| g}t  |j }td||  |dddkr@W 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   r   replacer/   )r   r5   r1   r2   r*   r+   r+   r,   _call_dmidecode   s    
r9   c                 C   s   t  r
dS t st rt| S t r,t| S t| }|dk	r@|S dd }t d }||st|dkstt	
d| dS td}|rt| |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   r3   r	   r4   r-   r   unamer   r   r   Zwhichr9   r   )r   Zsyspath_valuer<   Z
uname_archr5   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.r7   z'Replacing __dmi.%s__ in '%s' with '%s'.z__dmi.)	r   keysrefindallr   Zwarningr?   r   r8   )r@   Zvalid_dmi_keysmatchZ	dmi_valuer+   r+   r,   sub_dmi_vars   s.    rF   )Zloggingr   rC   collectionsr   typingr   Z	cloudinitr   r   Zcloudinit.utilr   r   r   r	   Z	getLogger__name__r   r   r
   __new____defaults__r   strr-   r3   r4   r9   r?   rF   r+   r+   r+   r,   <module>   s   

          


                  1(0