o
    f!                     @   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 d dl	m
Z
mZmZmZ e eZdZedg dZd	ej_i d
eddddeddddeddddeddddeddddeddddedddded d!dd"ed#d$dd%ed&d'd(d)ed*d+d,d-ed.d/dd0ed1d2d(d3ed4d5d6d7ed8d9d,d:ed;d<d,d=ed>d?dZd@edAee fdBdCZd@edAee fdDdEZd@edAee fdFdGZd@edHedAee fdIdJZd@edAee fdKdLZdMedAefdNdOZdS )P    N)
namedtuple)Optional)subp)is_containeris_DragonFlyBSD
is_FreeBSD
is_OpenBSDz/sys/class/dmi/idKernelNames)linuxfreebsdopenbsd)NNNz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	hw.vendorzchassis-serial-numberchassis_serialzsmbios.chassis.serialzhw.uuidzchassis-versionchassis_versionzsmbios.chassis.versionzsystem-manufacturer
sys_vendorzsmbios.system.makerzsystem-product-nameproduct_namezsmbios.system.productz
hw.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_syspathP   s>   

r?   c              
   C      t | }|du s|jdu rdS td|j zdd|jg}t|j }td||j |W S  tjyK } 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   stdoutr5   ProcessExecutionErrorr   r8   cmdresultr<   r=   r=   r>   
_read_kenvv      
rG   c              
   C   r@   )z1
    Reads dmi data from OpenBSD's sysctl(8)
    Nr    sysctlz-qnzsysctl returned '%s' for '%s'zfailed sysctl cmd: %s
%s)	r'   r(   r   r+   r,   r   rB   r5   rC   rD   r=   r=   r>   _read_sysctl   rH   rJ   dmidecode_pathc              
   C   s|   z"|d| g}t  |j }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   rB   r5   r+   r,   replacerC   )r   rK   rE   rF   r<   r=   r=   r>   _call_dmidecode   s   
rO   c                 C   s   t  rdS t st rt| S t rt| S t| }|dur |S dd }t d }||s:|dv s:t	
d| dS td}|rFt| |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   r   rG   r   rJ   r?   r-   unamer+   r,   r   whichrO   r*   )r   syspath_valuerU   
uname_archrK   r=   r=   r>   read_dmi_data   s&   

r^   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.rM   z'Replacing __dmi.%s__ in '%s' with '%s'.z__dmi.)	r'   keysrefindallr+   warningr^   r,   rN   )r_   valid_dmi_keysmatch	dmi_valuer=   r=   r>   sub_dmi_vars   s.   rh   )loggingr-   rb   collectionsr   typingr   	cloudinitr   cloudinit.utilr   r   r   r   	getLogger__name__r+   r*   r	   __new____defaults__r'   strr?   rG   rJ   rO   r^   rh   r=   r=   r=   r>   <module>   s   
	
"%(+1&0