o
    쑛hB                     @   s  d dl Z d dlZd dlZd dlmZ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G dd deZ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d.ed/d0d&d1ed2d3d4d5ed6d7d*d8ed9d:d*d;ed<d=dZd>ed?ee fd@dAZd>ed?ee fdBdCZd>ed?ee fdDdEZd>edFed?ee fdGdHZd>ed?ee fdIdJZdKed?efdLdMZdS )N    N)
NamedTupleOptional)performancesubp)is_containeris_DragonFlyBSD
is_FreeBSD
is_OpenBSDz/sys/class/dmi/idc                   @   s.   e Zd ZU eed< ee ed< ee ed< dS )KernelNameslinuxfreebsdopenbsdN)__name__
__module____qualname__str__annotations__r    r   r   //usr/lib/python3/dist-packages/cloudinit/dmi.pyr
      s   
 r
   z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   sB  t | }|du s|jdu rdS dt|j}td| tj	|s+td| dS z3t
d| ! t|d}| }W d   n1 sIw   Y  W d   n1 sXw   Y  W n tyn   td| Y dS w |dt|d	  d
 kr}d}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 %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   TimedopenreadPermissionErrorlendecodestripUnicodeDecodeErrorerror)r&   kmapdmi_key_pathfpkey_dataer   r   r   _read_dmi_syspathS   sH   

 rF   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/   r0   r   r3   r4   r   stdoutr>   ProcessExecutionErrorr&   rA   cmdresultrE   r   r   r   
_read_kenv{      
rN   c              
   C   rG   )z1
    Reads dmi data from OpenBSD's sysctl(8)
    Nr(   sysctlz-qnzsysctl returned '%s' for '%s'zfailed sysctl cmd: %s
%s)	r/   r0   r   r3   r4   r   rI   r>   rJ   rK   r   r   r   _read_sysctl   rO   rQ   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   rI   r>   r3   r4   replacerJ   )r&   rR   rL   rM   rE   r   r   r   _call_dmidecode   s   
rV   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   rN   r	   rQ   rF   r5   unamer3   r4   r   whichrV   r2   )r&   syspath_valuer\   
uname_archrR   r   r   r   read_dmi_data   s&   

re   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.rT   z'Replacing __dmi.%s__ in '%s' with '%s'.z__dmi.)	r/   keysrefindallr3   warningre   r4   rU   )rf   valid_dmi_keysmatch	dmi_valuer   r   r   sub_dmi_vars   s.   ro   )loggingr5   ri   typingr   r   	cloudinitr   r   cloudinit.utilr   r   r   r	   	getLoggerr   r3   r2   r
   r/   r   rF   rN   rQ   rV   re   ro   r   r   r   r   <module>   s   

"%(+1(0