
    }f!                        d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
mZmZmZ  e j                  e      ZdZ edg d      Zd	ej&                  _        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      d0 ed1d2d(      d3 ed4d5d6      d7 ed8d9d,      d: ed;d<d,      d= ed>d?d      Zd@edAee   fdBZd@edAee   fdCZd@edAee   fdDZd@edEedAee   fdFZd@edAee   fdGZdHedAefdIZy)J    N)
namedtuple)Optional)subp)is_containeris_DragonFlyBSD
is_FreeBSD
is_OpenBSDz/sys/class/dmi/idKernelNames)linuxfreebsdopenbsd)NNNz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        |d      5 }|j                         }ddd       dt        |      dz
  z  d	z   k(  rd
}	 |j                  d      j                         S # 1 sw Y   Bx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 %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@   P   s/    ""3'D|tzz)##L$**=LII$l377>>,'		#\2,% 	!wwyH	! 7c(ma/0588
v&,,..	! 	! 		%|4  
		;		
 	
 
sB   C< C0/C< D! 0C95C< <DD!	E*EE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)	r)   r*   r   r-   r.   r   stdoutr7   ProcessExecutionErrorr   r:   cmdresultr>   s        r?   
_read_kenvrH   v   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)	r)   r*   r   r-   r.   r   rC   r7   rD   rE   s        r?   _read_sysctlrL      s     ""3'D|t||+II$dll37-3&&,,.		164<<H%% 7		-sA667rI   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   rC   r7   r-   r.   replacerD   )r   rM   rF   rG   r>   s        r?   _call_dmidecoderR      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   86 )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   rH   r	   rL   r@   r/   unamer-   r.   r   whichrR   r,   )r   syspath_valuer[   
uname_archrM   s        r?   read_dmi_datard      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.rP   z'Replacing __dmi.%s__ in '%s' with '%s'.z__dmi.)	r)   keysrefindallr-   warningrd   r.   rQ   )re   valid_dmi_keysmatch	dmi_values       r?   sub_dmi_varsro      s    3
(--/N/5 9&KKI	 !%(	I		5		
 kkF5',i8%9& Jr'   )loggingr/   ri   collectionsr   typingr   	cloudinitr   cloudinit.utilr   r   r   r	   	getLogger__name__r-   r,   r
   __new____defaults__r)   strr@   rH   rL   rR   rd   ro   rY   r'   r?   <module>rz      s    	 	 "    g! #(GH#5    .;.. 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= #LC HSM *c hsm * c hsm "-s -x} -`c c r'   