
    x[hB                        S SK r S SKrS SKrS SKJrJr  S SKJrJr  S SK	J
r
JrJrJr  \ R                  " \5      rSr " S S\5      r0 S\" S	S
S5      _S\" SSS5      _S\" SSS5      _S\" SSS5      _S\" SSS5      _S\" SSS5      _S\" SSS5      _S\" SSS5      _S \" S!S"S5      _S#\" S$S%S&5      _S'\" S(S)S*5      _S+\" S,S-S5      _S.\" S/S0S&5      _S1\" S2S3S45      _S5\" S6S7S*5      _S8\" S9S:S*5      _S;\" S<S=S5      _rS>\S?\\   4S@ jrS>\S?\\   4SA jrS>\S?\\   4SB jrS>\SC\S?\\   4SD jrS>\S?\\   4SE jrSF\S?\4SG jrg)H    N)
NamedTupleOptional)performancesubp)is_containeris_DragonFlyBSD
is_FreeBSD
is_OpenBSDz/sys/class/dmi/idc                   @    \ rS rSr% \\S'   \\   \S'   \\   \S'   Srg)KernelNames   linuxfreebsdopenbsd N)__name__
__module____qualname____firstlineno__str__annotations__r   __static_attributes__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                 "   [         R                  U 5      nUb  UR                  c  gSR                  [        UR                  5      n[
        R                  SU5        [        R                  R                  U5      (       d  [
        R                  SU5        g [        R                  " SU 35         [        US5       nUR                  5       nSSS5        SSS5        WS[        U5      S	-
  -  S
-   :X  a  Sn UR!                  S5      R#                  5       $ ! , (       d  f       NP= f! , (       d  f       NY= f! [         a    [
        R                  SU5         gf = f! [$         a"  n[
        R'                  SUUU5         SnAgSnAff = f)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_syspathrL   S   sQ    ""3'D|tzz)##L$**=LII$l377>>,''		#\2,894$<
wwyH<
9 7c(ma/0588
v&,,..<
 <
99  		%|4  
		;		
 	
 
s`   D< 2D+?DD+D< ;E" 
D(	$D++
D95D< 9D< < EE"
F,F		Fc                    [         R                  U 5      nUb  UR                  c  g[        R	                  SUR                  5         SSUR                  /n[
        R
                  " U5      R                  R                  5       n[        R	                  SX1R                  5        U$ ! [
        R                   a!  n[        R	                  SWU5         SnAgSnAff = f)z'
Reads dmi data from FreeBSD's kenv(1)
Nr/   kenvz-qzkenv returned '%s' for '%s'zfailed kenv cmd: %s
%s)	r5   r6   r   r9   r:   r   stdoutrD   ProcessExecutionErrorr,   rG   cmdresultrK   s        r   
_read_kenvrT   {   s     ""3'D|t||+II$dll35tT\\*3&&,,.		/F%% 5		+S!445   AB' 'C;CCc                    [         R                  U 5      nUb  UR                  c  g[        R	                  SUR                  5         SSUR                  /n[
        R
                  " U5      R                  R                  5       n[        R	                  SX1R                  5        U$ ! [
        R                   a!  n[        R	                  SWU5         SnAgSnAff = f)z)
Reads dmi data from OpenBSD's sysctl(8)
Nr/   sysctlz-qnzsysctl returned '%s' for '%s'zfailed sysctl cmd: %s
%s)	r5   r6   r   r9   r:   r   rO   rD   rP   rQ   s        r   _read_sysctlrX      s     ""3'D|t||+II$dll37-3&&,,.		16<<H%% 7		-sA667rU   dmidecode_pathc                 8    USU /n[         R                   " U5      R                  R                  5       n[        R	                  SX05        UR                  SS5      S:X  a  gU$ ! [         R                   a!  n[        R	                  SWU5         SnAgSnAff = f)zs
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   rO   rD   r9   r:   replacerP   )r,   rY   rR   rS   rK   s        r   _call_dmidecoder^      s    
	z3/3&&,,.		4fB>>#r"b(%% 		0#q9s   AA$ "A$ $B8BBc                    [        5       (       a  g[        5       (       d  [        5       (       a  [        U 5      $ [	        5       (       a  [        U 5      $ [        U 5      nUb  U$ S n[        R                  " 5       S   nU" U5      (       d  US;   d  [        R                  SU5        g[        R                  " S5      nU(       a  [        X5      $ [        R                  S[        5        g)aX  
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                 H    U S:H  =(       d    U S   S:H  =(       a    U SS  S:H  $ )Nx86_64r   i   86r   )archs    r   is_x86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   rT   r
   rX   rL   r;   unamer9   r:   r   whichr^   r8   )r,   syspath_valuerf   
uname_archrY   s        r   read_dmi_datarp      s    $ ~~||((#||C  %c*M I AJ:*0D"D		2J?ZZ,Ns33II@,Or   srcc                 <   SU ;  a  U $ [         R                  5       n[        R                  " SU 5       Hd  nX!;  a  [        R                  SUU U5        M"  [        U5      nU(       d  Sn[        R                  SUU U5        U R                  SU S3U5      n Mf     U $ )zBReplace __dmi.VARNAME__ with DMI values from either sysfs or kenv.__z__dmi\.([^_]+)__z7Ignoring invalid __dmi.%s__ in %s. Expected one of: %s.r\   z'Replacing __dmi.%s__ in '%s' with '%s'.z__dmi.)	r5   keysrefindallr9   warningrp   r:   r]   )rq   valid_dmi_keysmatch	dmi_values       r   sub_dmi_varsr{      s    3
(--/N/5&KKI	 !%(	I		5		
 kkF5',i8% 6& Jr   )loggingr;   ru   typingr   r   	cloudinitr   r   cloudinit.utilr   r   r	   r
   	getLoggerr   r9   r8   r   r5   r   rL   rT   rX   r^   rp   r{   r   r   r   <module>r      s    	 	 ' '  ! #* .;.. 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   