o
    x[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