a 'Dgr@sddlZddlZddlZddlmZddlmZddlmZm Z ddl m Z m Z m Z mZeeZdZedgdZd ej_ed d ded d dedddedddedddedddedddedddedddedddedd d!ed"d#ded$d%ded&d'd(ed)d*d!ed+d,d!ed-d.dd/Zeeed0d1d2Zeeed0d3d4Zeeed0d5d6Zeeeed7d8d9Zeeed0d:d;Zeed<d=d>ZdS)?N) namedtuple)Optional) performancesubp) is_containeris_DragonFlyBSD is_FreeBSD is_OpenBSDz/sys/class/dmi/id KernelNames)linuxfreebsdopenbsd)NNNZboard_asset_tagzsmbios.planar.tagZ board_vendorzsmbios.planar.makerZ board_namezsmbios.planar.productZ board_serialzsmbios.planar.serialZ board_versionzsmbios.planar.versionZ bios_datezsmbios.bios.reldateZ bios_vendorzsmbios.bios.vendorZ bios_versionzsmbios.bios.versionZchassis_asset_tagzsmbios.chassis.tagZchassis_vendorzsmbios.chassis.makerz hw.vendorZchassis_serialzsmbios.chassis.serialzhw.uuidZchassis_versionzsmbios.chassis.versionZ sys_vendorzsmbios.system.makerZ product_namezsmbios.system.productz hw.productZproduct_serialzsmbios.system.serialZ product_uuidzsmbios.system.uuidZproduct_versionzsmbios.system.version)zbaseboard-asset-tagzbaseboard-manufacturerzbaseboard-product-namezbaseboard-serial-numberzbaseboard-versionzbios-release-datez bios-vendorz bios-versionzchassis-asset-tagzchassis-manufacturerzchassis-serial-numberzchassis-versionzsystem-manufacturerzsystem-product-namezsystem-serial-numberz system-uuidzsystem-version)keyreturnc CsFt|}|dus|jdur dSdt|j}td|tj |sVtd|dSzft d|Bt |d}| }Wdn1s0YWdn1s0YWn tytd|YdS0|dt|d d krd }z|d WSty@}ztd |||WYd}~n d}~00dS)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_PATHLOGdebugospathexistsrZTimedopenreadPermissionErrorlendecodestripUnicodeDecodeErrorerror)rkmapZ dmi_key_pathfpZkey_dataer+1/usr/lib/python3.9/site-packages/cloudinit/dmi.py_read_dmi_syspathPs:    H  r-c Cst|}|dus|jdur dStd|jz2dd|jg}t|j}td||j|WStjy}ztd||WYd}~n d}~00dS)z/ Reads dmi data from FreeBSD's kenv(1) NrZkenvz-qzkenv returned '%s' for '%s'zfailed kenv cmd: %s %s) rrr rrrstdoutr%ProcessExecutionErrorrr(cmdresultr*r+r+r, _read_kenvxs  $r3c Cst|}|dus|jdur dStd|jz2dd|jg}t|j}td||j|WStjy}ztd||WYd}~n d}~00dS)z1 Reads dmi data from OpenBSD's sysctl(8) NrZsysctlz-qnzsysctl returned '%s' for '%s'zfailed sysctl cmd: %s %s) rrr rrrr.r%r/r0r+r+r, _read_sysctls  $r4)rdmidecode_pathrc CszD|d|g}t|j}td|||dddkr@WdS|WStjyz}ztd||WYd}~dSd}~00dS)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)rr.r%rrreplacer/)rr5r1r2r*r+r+r,_call_dmidecodes r9cCstr dStstrt|Str,t|St|}|dur@|Sdd}td}||st|dvstt d|dSt d}|rt ||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)NZx86_64riZ86r+)Zarchr+r+r,is_x86szread_dmi_data..is_x86)Zaarch64Zamd64zdmidata is not supported on %sZ dmidecodez0did not find either path %s or dmidecode command)rrrr3r r4r-runamerrrwhichr9r)rZ syspath_valuer<Z uname_archr5r+r+r, read_dmi_datas&      r@)srcrcCsxd|vr |St}td|D]R}||vr>td|||q t|}|sNd}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.r7z'Replacing __dmi.%s__ in '%s' with '%s'.z__dmi.) rkeysrefindallrZwarningr@rr8)rAZvalid_dmi_keysmatchZ dmi_valuer+r+r, sub_dmi_varss.rG)ZloggingrrD collectionsrtypingrZ cloudinitrrZcloudinit.utilrrrr Z getLogger__name__rrr __new__ __defaults__rstrr-r3r4r9r@rGr+r+r+r,s|       1(0