
    ܍~c                        d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
mZ  ej        e          ZdZ edd	d
g          Zdej        _        i d edd          d edd          d edd          d edd          d edd          d edd          d edd           d! ed"d#          d$ ed%d&          d' ed(d)          d* ed+d,          d- ed.d/          d0 ed1d2          d3 ed4d5          d6 ed7d8          d9 ed:d;          d< ed=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dS )F    N)
namedtuple)Optional)log)subp)is_container
is_FreeBSDz/sys/class/dmi/idKernelNameslinuxfreebsd)NNz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chassis-serial-numberchassis_serialzsmbios.chassis.serialzchassis-versionchassis_versionzsmbios.chassis.versionzsystem-manufacturer
sys_vendorzsmbios.system.makerzsystem-product-nameproduct_namezsmbios.system.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        dS d                    t          |j                  }t
                              d|           t          j        	                    |          st
                              d|           dS 	 t          |d          5 }|                                }ddd           n# 1 swxY w Y   n,# t          $ r t
                              d|           Y dS w xY w|dt          |          dz
  z  d	z   k    rd
}	 |                    d                                          S # t           $ r'}t
                              d|||           Y d}~nd}~ww xY wdS )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es         //usr/lib/python3/dist-packages/cloudinit/dmi.py_read_dmi_syspathr>   >   s    ""3''D|tz)t##L$*==LII$l3337>>,'' 		#\222t,%% 	!wwyyH	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!   		%|444tt 7c(mma/05888
v&&,,... 
 
 
		;		
 	
 	
 	
 	
 	
 	
 	

 4sN   C .CC CC CC %DD&&E 
E>E99E>c                    t                               |           }||j        dS t                              d|j                   	 dd|j        g}t          j        |          \  }}|                                }t                              d||j                   |S # t
          j        $ r&}t                              d||           Y d}~nd}~ww xY wdS )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   r5   ProcessExecutionError)r   r8   cmdresult_errr<   s         r=   
_read_kenvrE   d   s     ""3''D|t|+tII$dl3335tT\*3		/FFF% 5 5 5		+S!444444445 4s   AB C.CCdmidecode_pathc                 J   	 |d| g}t          j         |          \  }}|                                }t                              d||            |                    dd          dk    rdS |S # t           j        $ r'}t                              d||           Y d}~dS 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   r5   r+   r,   replacerA   )r   rF   rB   rC   rD   r<   s         r=   _call_dmidecoderK   z   s    

z3/3		4fcBBB>>#r""b((2%   		0#q999ttttts   A&A, *A, ,B";BB"c                    t                      rdS t                      rt          |           S t          |           }||S d }t	          j                    d         } ||          s!|dv st                              d|           dS t          j	        d          }|rt          | |          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                 B    | dk    p| d         dk    o| dd          dk    S )Nx86_64r   i   86 )archs    r=   is_x86zread_dmi_data.<locals>.is_x86   s,    xHDGsN$GtABBx47GHr%      )aarch64amd64zdmidata is not supported on %s	dmidecodez0did not find either path %s or dmidecode command)r   r   rE   r>   r-   unamer+   r,   r   whichrK   r*   )r   syspath_valuerT   
uname_archrF   s        r=   read_dmi_datar]      s    $ ~~ t|| #%c**M I I I AJF: *0D"D"D		2J???tZ,,N 4sN333II@,OOO4r%   )r-   collectionsr   typingr   	cloudinitr   loggingr   cloudinit.utilr   r   	getLogger__name__r+   r*   r	   __new____defaults__r'   strr>   rE   rK   r]   rR   r%   r=   <module>rh      s3   				 " " " " " "       $ $ $ $ $ $       3 3 3 3 3 3 3 3g!! #j)(<==#/   $;;'8:MNN$kk- $
 kk- $ {{.   $ _6MNN$ [2GHH$ ;;}.BCC$ KK0EFF$ 1 $$ KK0 %$* [[1 +$0 {{3 1$6 ;;|5JKK7$8 ;;/ 9$> KK0 ?$D ;;~/CDDE$F kk"35LMMG$ N#3 #8C= # # # #LC HSM    , c hsm    $*s *x} * * * * * *r%   