
"T`              $   @   s  d  d l  m Z d  d l  m Z d  d l m Z m Z d  d l m Z d  d l	 Z	 e j
 e  Z d Z e d d d	 g  Z dE e j _ 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/ d0  d1 e d2 d3  d4 e d5 d6  d7 e d8 d9  d: e d; d<  i Z d= d>   Z d? d@   Z dA dB   Z dC dD   Z d S)F    )log)subp)is_container
is_FreeBSD)
namedtupleNz/sys/class/dmi/idZKernelNameslinuxfreebsdzbaseboard-asset-tagZboard_asset_tagzsmbios.planar.tagzbaseboard-manufacturerZboard_vendorzsmbios.planar.makerzbaseboard-product-nameZ
board_namezsmbios.planar.productzbaseboard-serial-numberZboard_serialzsmbios.planar.serialzbaseboard-versionZboard_versionzsmbios.planar.versionzbios-release-dateZ	bios_datezsmbios.bios.reldatezbios-vendorZbios_vendorzsmbios.bios.vendorzbios-versionZbios_versionzsmbios.bios.versionzchassis-asset-tagZchassis_asset_tagzsmbios.chassis.tagzchassis-manufacturerZchassis_vendorzsmbios.chassis.makerzchassis-serial-numberZchassis_serialzsmbios.chassis.serialzchassis-versionZchassis_versionzsmbios.chassis.versionzsystem-manufacturerZ
sys_vendorzsmbios.system.makerzsystem-product-nameZproduct_namezsmbios.system.productzsystem-serial-numberZproduct_serialzsmbios.system.serialzsystem-uuidZproduct_uuidzsmbios.system.uuidzsystem-versionZproduct_versionzsmbios.system.versionc             C   sH  t  j |   } | d k s* | j d k r. d Sd j t | j  } t j d |  t j j	 |  sy t j d |  d Sy) t
 | d   } | j   } Wd QRXWn& t k
 r t j d |  d SYn X| d t |  d d	 k r d
 } y | j d  j   SWn; t k
 rC} z t j d | | |  WYd d } ~ Xn Xd S)z/
    Reads dmi data from /sys/class/dmi/id
    Nz{0}/{1}zquerying dmi data %szdid not find %srbzCould not read %ss      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)keykmapZdmi_key_pathfpZkey_datae r"   //usr/lib/python3/dist-packages/cloudinit/dmi.py_read_dmi_syspath+   s,    		 r$   c             C   s   t  j |   } | d k s* | j d k r. d St j d | j  yQ d d | j g } t j |  \ } } | j   } t j d | | j  | SWn? t j k
 r } z t j d | |  d SWYd d } ~ Xn Xd S)z/
    Reads dmi data from FreeBSD's kenv(1)
    Nzquerying dmi data %sZkenvz-qzkenv returned '%s' for '%s'zfailed kenv cmd: %s
%s)r   r   r   r   r   r   r   ProcessExecutionError)r   r   cmdresult_errr!   r"   r"   r#   
_read_kenvM   s    r)   c             C   s   yg | d |  g } t  j  |  \ } } | j   } t j d | |   | j d d  d k rb d S| SWn? t  j k
 r } z t j d | |  d SWYd d } ~ Xn Xd 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   replacer%   )r   dmidecode_pathr&   r'   r(   r!   r"   r"   r#   _call_dmidecoded   s    r.   c             C   s   t    r d St   r  t |   St |   } | d k	 r< | Sd d   } t j   d } | |  pm | d
 k s t j d |  d St j	 d  } | r t
 |  |  St j 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   s0   |  d k p/ |  d d k o/ |  d d   d k S)NZx86_64r   i   Z86r"   )archr"   r"   r#   is_x86   s    zread_dmi_data.<locals>.is_x86   aarch64amd64zdmidata is not supported on %sZ	dmidecodez0did not find either path %s or dmidecode command)r4   zamd64)r   r   r)   r$   r   unamer   r   r   whichr.   warningr   )r   Zsyspath_valuer2   Z
uname_archr-   r"   r"   r#   read_dmi_datav   s$    		
	r9   )NN)	cloudinitr   loggingr   Zcloudinit.utilr   r   collectionsr   r   	getLogger__name__r   r   Zkdmi__new__Z
defaults__r   r$   r)   r.   r9   r"   r"   r"   r#   <module>   s:   "