܍~cddlZddlmZddlmZddlmZddlmZddl m Z m Z ej e ZdZedd d gZd ej_id ed ddedddedddedddedddedddedd d!ed"d#d$ed%d&d'ed(d)d*ed+d,d-ed.d/d0ed1d2d3ed4d5d6ed7d8d9ed:d;d<ed=d>Zd?ed@eefdAZd?ed@eefdBZd?edCed@eefdDZd?ed@eefdEZdS)FN) namedtuple)Optional)log)subp) is_container is_FreeBSDz/sys/class/dmi/id KernelNameslinuxfreebsd)NNzbaseboard-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.makerzchassis-serial-numberchassis_serialzsmbios.chassis.serialzchassis-versionchassis_versionzsmbios.chassis.versionzsystem-manufacturer sys_vendorzsmbios.system.makerzsystem-product-name product_namezsmbios.system.productzsystem-serial-numberproduct_serialzsmbios.system.serialz system-uuid product_uuidzsmbios.system.uuidzsystem-versionproduct_versionzsmbios.system.versionkeyreturnct|}||jdSdt|j}t d|tj |st d|dS t|d5}| }dddn #1swxYwYn,#t$rt d|YdSwxYw|dt|dz zd zkrd } |d S#t $r'}t d |||Yd}~nd}~wwxYwdS) z/ Reads dmi data from /sys/class/dmi/id Nz{0}/{1}querying dmi data %szdid not find %srbzCould not read %s utf8z-utf-8 decode of content (%s) in %s failed: %s)DMIDECODE_TO_KERNELgetr format DMI_SYS_PATHLOGdebugospathexistsopenreadPermissionErrorlendecodestripUnicodeDecodeErrorerror)rkmap dmi_key_pathfpkey_dataes //usr/lib/python3/dist-packages/cloudinit/dmi.py_read_dmi_syspathr>>s  " "3 ' 'D |tz)t##L$*==LII$l333 7>>, ' ' #\222t , % % !wwyyH ! ! ! ! ! ! ! ! ! ! ! ! ! ! !  %|444tt 7c(mma/05888 v&&,,...     ;             4sNC.C CCCCC%DD&&E E>E99E>ct|}||jdStd|j dd|jg}t j|\}}|}td||j|S#t j$r&}td||Yd}~nd}~wwxYwdS)z/ Reads dmi data from FreeBSD's kenv(1) Nr kenvz-qzkenv returned '%s' for '%s'zfailed kenv cmd: %s %s)r'r(r r+r,rr5ProcessExecutionError)rr8cmdresult_errr<s r= _read_kenvrEds  " "3 ' 'D |t|+tII$dl3335tT\*3 /FFF  %555 +S!444444445 4sABC.CCdmidecode_pathcJ |d|g}tj|\}}|}td|||dddkrdS|S#tj$r'}td||Yd}~dSd}~wwxYw)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)rr5r+r,replacerA)rrFrBrCrDr<s r=_call_dmidecoderKzs z3/3 4fcBBB >>#r " "b ( (2  % 0#q999tttttsA&A,*A,,B";BB"ctrdStrt|St|}||Sd}t jd}||s!|dvst d|dStj 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. NcB|dkp|ddko |dddkS)Nx86_64ri86)archs r=is_x86zread_dmi_data..is_x86s,xHDGsN$GtABBx47GHr%)aarch64amd64zdmidata is not supported on %s dmidecodez0did not find either path %s or dmidecode command) rrrEr>r-unamer+r,rwhichrKr*)r syspath_valuerT uname_archrFs r= read_dmi_datar]s$~~t||#%c**M IIIAJ F:  *0D"D"D 2J???tZ ,,N4sN333II@,OOO 4r%)r- collectionsrtypingr cloudinitrloggingrcloudinit.utilrr getLogger__name__r+r*r __new__ __defaults__r'strr>rErKr]rRr%r=rhs3 """"""$$$$$$33333333g!!# j)(<== #/  $;;'8:MNN$kk-$ kk- ${{.  $_6MNN$HH$;;}.BCC$KK0EFF$1$$KK0%$*[[1+$0{{31$6;;|5JKK7$8;;/9$>KK0?$D;;~/CDDE$Fkk"35LMMG$N#3#8C=####LCHSM,chsm$*s*x}******r%