o
    w7eC                     @   s  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_i 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/d0ed1d2d3ed4d5d6ed7d8d9ed:d;d<ed=d>Zd?ed@ee fdAdBZd?ed@ee fdCdDZd?edEed@ee fdFdGZd?ed@ee fdHdIZdJed@efdKdLZdS )M    N)
namedtuple)Optional)log)subp)is_container
is_FreeBSDz/sys/class/dmi/idKernelNameslinuxfreebsd)NNzbaseboard-asset-tagboard_asset_tagzsmbios.planar.tagzbaseboard-manufacturerboard_vendorzsmbios.planar.makerzbaseboard-product-name
board_namezsmbios.planar.productzbaseboard-serial-numberboard_serialzsmbios.planar.serialzbaseboard-versionboard_versionzsmbios.planar.versionzbios-release-date	bios_datezsmbios.bios.reldatezbios-vendorbios_vendorzsmbios.bios.vendorzbios-versionbios_versionzsmbios.bios.versionzchassis-asset-tagchassis_asset_tagzsmbios.chassis.tagzchassis-manufacturerchassis_vendorzsmbios.chassis.makerzchassis-serial-numberchassis_serialzsmbios.chassis.serialzchassis-versionchassis_versionzsmbios.chassis.versionzsystem-manufacturer
sys_vendorzsmbios.system.makerzsystem-product-nameproduct_namezsmbios.system.productzsystem-serial-numberproduct_serialzsmbios.system.serialzsystem-uuidproduct_uuidzsmbios.system.uuidzsystem-versionproduct_versionzsmbios.system.versionkeyreturnc              
   C   s  t | }|du s|jdu rdS dt|j}td| tj	|s+td| dS zt
|d}| }W d   n1 s@w   Y  W n tyV   td| Y dS w |dt|d  d	 kred
}z|d W S  ty } ztd||| W Y d}~dS d}~ww )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   kmapdmi_key_pathfpkey_datae r;   //usr/lib/python3/dist-packages/cloudinit/dmi.py_read_dmi_syspath?   s>   

r=   c              
   C   s   t | }|du s|jdu rdS td|j zdd|jg}t|\}}| }td||j |W S  tjyN } ztd|| W Y d}~dS d}~ww )z/
    Reads dmi data from FreeBSD's kenv(1)
    Nr   kenvz-qzkenv returned '%s' for '%s'zfailed kenv cmd: %s
%s)r%   r&   r
   r)   r*   r   r3   ProcessExecutionError)r   r6   cmdresult_errr:   r;   r;   r<   
_read_kenve   s   
rC   dmidecode_pathc              
   C   s   z%|d| g}t  |\}}| }td||  |dddkr#W dS |W S  t jy@ } ztd|| W Y d}~dS d}~ww )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   r3   r)   r*   replacer?   )r   rD   r@   rA   rB   r:   r;   r;   r<   _call_dmidecode{   s   
rH   c                 C   s   t  rdS t rt| S t| }|dur|S dd }t d }||s0|dv s0td| dS t	d}|r<t
| |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 )Nx86_64r   i   86r;   )archr;   r;   r<   is_x86   s   $zread_dmi_data.<locals>.is_x86   )aarch64amd64zdmidata is not supported on %s	dmidecodez0did not find either path %s or dmidecode command)r   r   rC   r=   r+   unamer)   r*   r   whichrH   r(   )r   syspath_valuerN   
uname_archrD   r;   r;   r<   read_dmi_data   s"   

rW   srcc                 C   sx   d| vr| S t  }td| D ])}||vrtd|| | qt|}|s'd}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.rF   z'Replacing __dmi.%s__ in '%s' with '%s'.z__dmi.)	r%   keysrefindallr)   warningrW   r*   rG   )rX   valid_dmi_keysmatch	dmi_valuer;   r;   r<   sub_dmi_vars   s.   ra   )r+   r[   collectionsr   typingr   	cloudinitr   loggingr   cloudinit.utilr   r   	getLogger__name__r)   r(   r   __new____defaults__r%   strr=   rC   rH   rW   ra   r;   r;   r;   r<   <module>   s   







"
#'&-