o x[hB@sddlZddlZddlZddlmZmZddlmZmZddl m Z m Z m Z m Z eeZdZGdddeZided d dd ed d ddeddddeddddeddddeddddeddddedddd ed!d"dd#ed$d%d&d'ed(d)d*d+ed,d-dd.ed/d0d&d1ed2d3d4d5ed6d7d*d8ed9d:d*d;eded?eefd@dAZd>ed?eefdBdCZd>ed?eefdDdEZd>edFed?eefdGdHZd>ed?eefdIdJZdKed?efdLdMZdS)NN) NamedTupleOptional) performancesubp) is_containeris_DragonFlyBSD is_FreeBSD is_OpenBSDz/sys/class/dmi/idc@s.eZdZUeed<eeed<eeed<dS) KernelNameslinuxfreebsdopenbsdN)__name__ __module__ __qualname__str__annotations__rrr//usr/lib/python3/dist-packages/cloudinit/dmi.pyr s  r zbaseboard-asset-tagboard_asset_tagzsmbios.planar.tagzbaseboard-manufacturer board_vendorzsmbios.planar.makerzbaseboard-product-name board_namezsmbios.planar.productzbaseboard-serial-number board_serialzsmbios.planar.serialzbaseboard-version board_versionzsmbios.planar.versionzbios-release-date bios_datezsmbios.bios.reldatez bios-vendor bios_vendorzsmbios.bios.vendorz bios-version bios_versionzsmbios.bios.versionzchassis-asset-tagchassis_asset_tagzsmbios.chassis.tagzchassis-manufacturerchassis_vendorzsmbios.chassis.makerz hw.vendorzchassis-serial-numberchassis_serialzsmbios.chassis.serialzhw.uuidzchassis-versionchassis_versionzsmbios.chassis.versionzsystem-manufacturer sys_vendorzsmbios.system.makerzsystem-product-name product_namezsmbios.system.productz hw.productzsystem-serial-numberproduct_serialzsmbios.system.serialz system-uuid product_uuidzsmbios.system.uuidzsystem-versionproduct_versionzsmbios.system.versionkeyreturnc CsBt|}|dus|jdurdSdt|j}td|tj |s+td|dSz3t d|!t |d }| }Wdn1sIwYWdn1sXwYWntyntd|YdSw|dt|d d kr}d }z|d WSty}ztd |||WYd}~dSd}~ww)z/ Reads dmi data from /sys/class/dmi/id Nz{0}/{1}querying dmi data %szdid not find %szReading rbzCould not read %s utf8z-utf-8 decode of content (%s) in %s failed: %s)DMIDECODE_TO_KERNELgetr format DMI_SYS_PATHLOGdebugospathexistsrTimedopenreadPermissionErrorlendecodestripUnicodeDecodeErrorerror)r&kmap dmi_key_pathfpkey_dataerrr_read_dmi_syspathSsH       rFc Ct|}|dus|jdurdStd|jzdd|jg}t|j}td||j|WStjyK}ztd||WYd}~dSd}~ww)z/ Reads dmi data from FreeBSD's kenv(1) Nr(kenvz-qzkenv returned '%s' for '%s'zfailed kenv cmd: %s %s) r/r0r r3r4rstdoutr>ProcessExecutionErrorr&rAcmdresultrErrr _read_kenv{  rNc CrG)z1 Reads dmi data from OpenBSD's sysctl(8) Nr(sysctlz-qnzsysctl returned '%s' for '%s'zfailed sysctl cmd: %s %s) r/r0r r3r4rrIr>rJrKrrr _read_sysctlrOrQdmidecode_pathc Cs|z"|d|g}t|j}td|||dddkr WdS|WStjy=}ztd||WYd}~dSd}~ww)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'.zfailed dmidecode cmd: %s %sN)rrIr>r3r4replacerJ)r&rRrLrMrErrr_call_dmidecodes rVcCstrdSts trt|Strt|St|}|dur |Sdd}td}||s:|dvs:t d|dSt d}|rFt ||St dtdS) 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. NcSs$|dkp|ddko|dddkS)Nx86_64ri86r)archrrris_x86s$zread_dmi_data..is_x86)aarch64amd64zdmidata is not supported on %s dmidecodez0did not find either path %s or dmidecode command)rrrrNr rQrFr5unamer3r4rwhichrVr2)r& syspath_valuer\ uname_archrRrrr read_dmi_datas&      resrccCsxd|vr|St}td|D])}||vrtd|||qt|}|s'd}td||||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.rTz'Replacing __dmi.%s__ in '%s' with '%s'.z__dmi.) r/keysrefindallr3warningrer4rU)rfvalid_dmi_keysmatch dmi_valuerrr sub_dmi_varss.ro)loggingr5ritypingrr cloudinitrrcloudinit.utilrrrr getLoggerrr3r2r r/rrFrNrQrVrerorrrrs       "%(+1(0