U
    Ó‡gr  ã                   @   s¨  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m	Z	 d dl
mZmZmZmZ e  e¡ZdZeddd	d
gƒZdej_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%dƒed&d'd ƒed(d)d*ƒed+d,d#ƒed-d.d#ƒed/d0dƒd1œZeee d2œd3d4„Zeee d2œd5d6„Zeee d2œd7d8„Zeeee d9œd:d;„Zeee d2œd<d=„Zeed>œd?d@„ZdS )Aé    N)Ú
namedtuple)ÚOptional)ÚperformanceÚsubp)Úis_containerÚis_DragonFlyBSDÚ
is_FreeBSDÚ
is_OpenBSDz/sys/class/dmi/idÚKernelNamesÚlinuxÚfreebsdÚopenbsd)NNNZboard_asset_tagzsmbios.planar.tagZboard_vendorzsmbios.planar.makerZ
board_namezsmbios.planar.productZboard_serialzsmbios.planar.serialZboard_versionzsmbios.planar.versionZ	bios_datezsmbios.bios.reldateZbios_vendorzsmbios.bios.vendorZbios_versionzsmbios.bios.versionZchassis_asset_tagzsmbios.chassis.tagZchassis_vendorzsmbios.chassis.makerz	hw.vendorZchassis_serialzsmbios.chassis.serialzhw.uuidZchassis_versionzsmbios.chassis.versionZ
sys_vendorzsmbios.system.makerZproduct_namezsmbios.system.productz
hw.productZproduct_serialzsmbios.system.serialZproduct_uuidzsmbios.system.uuidZproduct_versionzsmbios.system.version)zbaseboard-asset-tagzbaseboard-manufacturerzbaseboard-product-namezbaseboard-serial-numberzbaseboard-versionzbios-release-datezbios-vendorzbios-versionzchassis-asset-tagzchassis-manufacturerzchassis-serial-numberzchassis-versionzsystem-manufacturerzsystem-product-namezsystem-serial-numberzsystem-uuidzsystem-version)ÚkeyÚreturnc              
   C   s  t  | ¡}|dks|jdkr dS d t|j¡}t d|¡ tj 	|¡sVt d|¡ dS z>t
 d|› �¡�$ t|dƒ�}| ¡ }W 5 Q R X W 5 Q R X W n" tk
r¶   t d|¡ Y dS X |dt|ƒd	  d
 krÔd}z| d¡ ¡ W S  tk
�r } zt d|||¡ W 5 d}~X Y nX dS )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   ZTimedÚopenÚreadÚPermissionErrorÚlenÚdecodeÚstripÚUnicodeDecodeErrorÚerror)r   ÚkmapZdmi_key_pathÚfpZkey_dataÚe© r+   ú//usr/lib/python3/dist-packages/cloudinit/dmi.pyÚ_read_dmi_syspathP   s<    
 ÿ ür-   c              
   C   s˜   t  | ¡}|dks|jdkr dS t d|j¡ z2dd|jg}t |¡j ¡ }t d||j¡ |W S  tjk
r’ } zt d||¡ W 5 d}~X Y nX dS )z/
    Reads dmi data from FreeBSD's kenv(1)
    Nr   Zkenvz-qzkenv returned '%s' for '%s'zfailed kenv cmd: %s
%s)	r   r   r   r   r   r   Ústdoutr%   ÚProcessExecutionError©r   r(   ÚcmdÚresultr*   r+   r+   r,   Ú
_read_kenvx   s    
 r3   c              
   C   s˜   t  | ¡}|dks|jdkr dS t d|j¡ z2dd|jg}t |¡j ¡ }t d||j¡ |W S  tjk
r’ } zt d||¡ W 5 d}~X Y nX dS )z1
    Reads dmi data from OpenBSD's sysctl(8)
    Nr   Zsysctlz-qnzsysctl returned '%s' for '%s'zfailed sysctl cmd: %s
%s)	r   r   r   r   r   r   r.   r%   r/   r0   r+   r+   r,   Ú_read_sysctl�   s    
 r4   )r   Údmidecode_pathr   c              
   C   s‚   zD|d| g}t   |¡j ¡ }t d|| ¡ | dd¡dkr@W dS |W S  t jk
r| } zt d||¡ W Y ¢dS d}~X Y nX dS )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   r.   r%   r   r   Úreplacer/   )r   r5   r1   r2   r*   r+   r+   r,   Ú_call_dmidecode¢   s    
r9   c                 C   sœ   t ƒ r
dS tƒ stƒ rt| ƒS tƒ r,t| ƒS t| ƒ}|dk	r@|S dd„ }t ¡ d }||ƒst|dkstt	 
d|¡ dS t 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                 S   s$   | dkp"| d dko"| dd … dkS )NZx86_64r   Úié   Z86r+   )Zarchr+   r+   r,   Úis_x86Ò   s    zread_dmi_data.<locals>.is_x86é   )Zaarch64Zamd64zdmidata is not supported on %sZ	dmidecodez0did not find either path %s or dmidecode command)r   r   r   r3   r	   r4   r-   r   Úunamer   r   r   Zwhichr9   r   )r   Zsyspath_valuer<   Z
uname_archr5   r+   r+   r,   Úread_dmi_data³   s&    

r?   )Úsrcr   c                 C   sx   d| kr| S t  ¡ }t d| ¡D ]R}||kr>t d|| |¡ q t|ƒ}|sNd}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.r7   z'Replacing __dmi.%s__ in '%s' with '%s'.z__dmi.)	r   ÚkeysÚreÚfindallr   Zwarningr?   r   r8   )r@   Zvalid_dmi_keysÚmatchZ	dmi_valuer+   r+   r,   Úsub_dmi_varsã   s.    üürF   )Zloggingr   rC   Úcollectionsr   Útypingr   Z	cloudinitr   r   Zcloudinit.utilr   r   r   r	   Z	getLoggerÚ__name__r   r   r
   Ú__new__Ú__defaults__r   Ústrr-   r3   r4   r9   r?   rF   r+   r+   r+   r,   Ú<module>   s´   

  ÿ  ÿ  ÿ  ÿ  ÿ


  ÿ  ÿ  ÿ  ÿ  ÿ  ÿ  ÿ  ÿ  ÿÕ1(0