
    x[hB                        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 j                  e      ZdZ G 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&      d1 ed2d3d4      d5 ed6d7d*      d8 ed9d:d*      d; ed<d=d      Zd>ed?ee   fd@Zd>ed?ee   fdAZd>ed?ee   fdBZd>edCed?ee   fdDZd>ed?ee   fdEZdFed?efdGZy)H    N)
NamedTupleOptional)performancesubp)is_containeris_DragonFlyBSD
is_FreeBSD
is_OpenBSDz/sys/class/dmi/idc                   8    e Zd ZU eed<   ee   ed<   ee   ed<   y)KernelNameslinuxfreebsdopenbsdN)__name__
__module____qualname__str__annotations__r        //usr/lib/python3/dist-packages/cloudinit/dmi.pyr   r      s    Jc]c]r   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                    t         j                  |       }||j                  ydj                  t        |j                        }t
        j                  d|       t        j                  j                  |      st
        j                  d|       y	 t        j                  d|       5  t        |d      5 }|j                         }ddd       ddd       dt        |      d	z
  z  d
z   k(  rd}	 |j!                  d      j#                         S # 1 sw Y   JxY w# 1 sw Y   NxY w# t        $ r t
        j                  d|       Y yw xY w# t$        $ r"}t
        j'                  d|||       Y d}~yd}~ww xY 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         
r   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es         r   _read_dmi_syspathrI   S   s^    ""3'D|tzz)##L$**=LII$l377>>,'		#\2,89 	!4$<
 	!wwyH	! 	! 7c(ma/0588
v&,,..	! 	! 	! 	!  		%|4  
		;		
 	
 
sZ   D) *D7DDD) 2E D	DD&"D) )E
E	E9E44E9c                    t         j                  |       }||j                  yt        j	                  d|j                         	 dd|j                  g}t        j
                  |      j                  j                         }t        j	                  d||j                         |S # t
        j                  $ r!}t        j	                  d|       Y d}~yd}~ww xY w)z/
    Reads dmi data from FreeBSD's kenv(1)
    Nr,   kenvz-qzkenv returned '%s' for '%s'zfailed kenv cmd: %s
%s)	r2   r3   r   r6   r7   r   stdoutrA   ProcessExecutionErrorr)   rD   cmdresultrH   s        r   
_read_kenvrQ   {   s     ""3'D|t||+II$dll35tT\\*3&&,,.		/F%% 5		+S!445   AB% %C8CCc                    t         j                  |       }||j                  yt        j	                  d|j                         	 dd|j                  g}t        j
                  |      j                  j                         }t        j	                  d||j                         |S # t
        j                  $ r!}t        j	                  d|       Y d}~yd}~ww xY w)z1
    Reads dmi data from OpenBSD's sysctl(8)
    Nr,   sysctlz-qnzsysctl returned '%s' for '%s'zfailed sysctl cmd: %s
%s)	r2   r3   r   r6   r7   r   rL   rA   rM   rN   s        r   _read_sysctlrU      s     ""3'D|t||+II$dll37-3&&,,.		164<<H%% 7		-sA667rR   dmidecode_pathc                 4   	 |d| g}t        j                   |      j                  j                         }t        j	                  d||        |j                  dd      dk(  ry|S # t         j                  $ r!}t        j	                  d|       Y d}~yd}~ww xY 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   rL   rA   r6   r7   replacerM   )r)   rV   rO   rP   rH   s        r   _call_dmidecoder[      s    
	z3/3&&,,.		4fcB>>#r"b(%% 		0#q9s   AA# !A# #B6BBc                    t               ryt               s
t               rt        |       S t	               rt        |       S t        |       }||S d }t        j                         d   } ||      s|dv st        j                  d|       yt        j                  d      }|rt        | |      S t        j                  dt               y)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                 4    | dk(  xs | d   dk(  xr | dd  dk(  S )Nx86_64r   i   86r   )archs    r   is_x86zread_dmi_data.<locals>.is_x86   s*    xHDGsN$GtABx47GHr      )aarch64amd64zdmidata is not supported on %s	dmidecodez0did not find either path %s or dmidecode command)r   r	   r   rQ   r
   rU   rI   r8   unamer6   r7   r   whichr[   r5   )r)   syspath_valuerc   
uname_archrV   s        r   read_dmi_datarl      s    $ ~|(#|C  %c*M I AJ:*0D"D		2J?ZZ,NsN33II@,Or   srcc                 $   d| vr| S t         j                         }t        j                  d|       D ]\  }||vrt        j                  d|| |        t        |      }|sd}t        j                  d|| |       | j                  d| d|      } ^ | S )zBReplace __dmi.VARNAME__ with DMI values from either sysfs or kenv.__z__dmi\.([^_]+)__z7Ignoring invalid __dmi.%s__ in %s. Expected one of: %s.rY   z'Replacing __dmi.%s__ in '%s' with '%s'.z__dmi.)	r2   keysrefindallr6   warningrl   r7   rZ   )rm   valid_dmi_keysmatch	dmi_values       r   sub_dmi_varsrw      s    3
(--/N/5 9&KKI	 !%(	I		5		
 kkF5',i8%9& Jr   )loggingr8   rq   typingr   r   	cloudinitr   r   cloudinit.utilr   r   r	   r
   	getLoggerr   r6   r5   r   r2   r   rI   rQ   rU   r[   rl   rw   r   r   r   <module>r}      s    	 	 ' '  g! #* .;.. k-t	. k-t. {. . 0$.  [2GN!." ;}.BDI#.$ K0EtL%.& 14'., K0+-.2 [193.8 {3T9.> ;+[?.D ;/E.J K0)K.P ;,iQ.V k2DW. b%3 %8C= %PC HSM *c hsm * c hsm "-s -x} -`c c r   