3 \me@sdddlZddlZddlZddlmZddlmZddlmZddl m Z m Z ej e ZdZeddd gZd:ej_ed d ed d eddeddeddeddeddeddeddeddedded d!ed"d#ed$d%ed&d'ed(d)ed*d+d,Zeeed-d.d/Zeeed-d0d1Zeeeed2d3d4Zeeed-d5d6Zeed7d8d9ZdS);N) namedtuple)Optional)subp) is_container is_FreeBSDz/sys/class/dmi/id KernelNameslinuxfreebsdZboard_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.makerZchassis_serialzsmbios.chassis.serialZchassis_versionzsmbios.chassis.versionZ sys_vendorzsmbios.system.makerZ product_namezsmbios.system.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)keyreturncCstj|}|dks|jdkr dSdjt|j}tjd|tjj |sVtjd|dSy"t |d}|j }WdQRXWn t k rtjd|dSX|dt |dd krd }y|jd jStk r}ztjd |||WYdd}~XnXdS) z/ Reads dmi data from /sys/class/dmi/id Nz{0}/{1}zquerying dmi data %szdid not find %srbzCould not read %s utf8z-utf-8 decode of content (%s) in %s failed: %s)DMIDECODE_TO_KERNELgetrformat DMI_SYS_PATHLOGdebugospathexistsopenreadPermissionErrorlendecodestripUnicodeDecodeErrorerror)r kmapZ dmi_key_pathfpZkey_dataer&/usr/lib/python3.6/dmi.py_read_dmi_syspath?s2      r(cCstj|}|dks|jdkr dStjd|jy6dd|jg}tj|\}}|j}tjd||j|Stjk r}ztjd||WYdd}~XnXdS)z/ Reads dmi data from FreeBSD's kenv(1) Nzquerying dmi data %sZkenvz-qzkenv returned '%s' for '%s'zfailed kenv cmd: %s %s)rrr rrrr ProcessExecutionError)r r#cmdresult_errr%r&r&r' _read_kenves   r-)r dmidecode_pathr cCs|yF|d|g}tj|\}}|j}tjd|||jdddkrDdS|Stjk rv}ztjd||dSd}~XnXdS)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 rrreplacer))r r.r*r+r,r%r&r&r'_call_dmidecode{s r2cCstr dStrt|St|}|dk r,|Sdd}tjd}||pN|d ks`tjd|dStj d}|rxt ||Stjd t dS) 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_x86aarch64amd64zdmidata is not supported on %sZ dmidecodez0did not find either path %s or dmidecode command)r7r8) rrr-r(runamerrrZwhichr2r)r Z syspath_valuer5Z uname_archr.r&r&r' read_dmi_datas"     r:)srcr cCs|d|kr |Stj}xbtjd|D]R}||kr@tjd|||q"t|}|sPd}tjd||||jd|d|}q"W|S)zBReplace __dmi.VARNAME__ with DMI values from either sysfs or kenv.__z__dmi\.([^_]+)__z7Ignoring invalid __dmi.%s__ in %s. Expected one of: %s.r0z'Replacing __dmi.%s__ in '%s' with '%s'.z__dmi.) rkeysrefindallrZwarningr:rr1)r;Zvalid_dmi_keysmatchZ dmi_valuer&r&r' sub_dmi_varss*rA)NN)Zloggingrr> collectionsrZtypingrZ cloudinitrZcloudinit.utilrrZ getLogger__name__rrr__new__ __defaults__rstrr(r-r2r:rAr&r&r&r'sR    &-