f!ddlZddlZddlZddlmZddlmZddlmZddl m Z m Z m Z m Z ejeZdZedgdZd ej&_id ed d dd eddddeddddeddddeddddeddddedddded d!dd"ed#d$dd%ed&d'd(d)ed*d+d,d-ed.d/dd0ed1d2d(d3ed4d5d6d7ed8d9d,d:ed;dd?dZd@edAeefdBZd@edAeefdCZd@edAeefdDZd@edEedAeefdFZd@edAeefdGZdHedAefdIZy)JN) namedtuple)Optional)subp) is_containeris_DragonFlyBSD is_FreeBSD is_OpenBSDz/sys/class/dmi/id KernelNames)linuxfreebsdopenbsd)NNNzbaseboard-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.versionkeyreturnctj|}| |jydjt|j}t j d|tjj|st j d|y t|d5}|j}ddddt|dz zd zk(rd } |jd jS#1swYBxYw#t$rt j d|YywxYw#t $r"}t j#d |||Yd}~yd}~wwxYw) 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@Ps/  " "3 'D |tzz)##L$**=LII$l3 77>>, ' #\2 , % !wwyH !7c(ma/0588 v&,,.. ! !  %|4   ;       sB C<C0/C<D!0C95C<<DD! E *EE ctj|}| |jytj d|j dd|jg}t j |j j}tj d||j|S#t j$r!}tj d|Yd}~yd}~wwxYw)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.rstdoutr7ProcessExecutionErrorrr:cmdresultr>s r? _read_kenvrHvs  " "3 'D |t||+II$dll35tT\\*3&&,,. /F  % %5 +S!44 5AB%%C8CCctj|}| |jytj d|j dd|jg}t j |j j}tj d||j|S#t j$r!}tj d|Yd}~yd}~wwxYw)z1 Reads dmi data from OpenBSD's sysctl(8) Nr"sysctlz-qnzsysctl returned '%s' for '%s'zfailed sysctl cmd: %s %s) r)r*r r-r.rrCr7rDrEs r? _read_sysctlrLs  " "3 'D |t||+II$dll37 -3&&,,. 164<<H  % %7 -sA66 7rIdmidecode_pathc4 |d|g}tj|jj}tj d|||j dddk(ry|S#tj $r!}tj d|Yd}~yd}~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)rrCr7r-r.replacerD)rrMrFrGr>s r?_call_dmidecoderRs z3/3&&,,. 4fcB >>#r "b (  % % 0#q9sAA#!A##B6BBctryts tr t|St r t |St |}||Sd}tjd}||s|dvstjd|ytjd}|r t||Stjdty)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. Nc4|dk(xs|ddk(xr|dddk(S)Nx86_64ri86)archs r?is_x86zread_dmi_data..is_x86s*xHDGsN$GtABx47GHr')aarch64amd64zdmidata is not supported on %s dmidecodez0did not find either path %s or dmidecode command)rrrrHr rLr@r/unamer-r.rwhichrRr,)r syspath_valuer[ uname_archrMs r? read_dmi_datards$~|(#|C  %c*M IAJ : *0D"D 2J?ZZ ,NsN33II@,O r'srcc$d|vr|Stj}tjd|D]\}||vrtj d||| t |}|sd}tjd||||jd|d|}^|S)zBReplace __dmi.VARNAME__ with DMI values from either sysfs or kenv.__z__dmi\.([^_]+)__z7Ignoring invalid __dmi.%s__ in %s. Expected one of: %s.rPz'Replacing __dmi.%s__ in '%s' with '%s'.z__dmi.) r)keysrefindallr-warningrdr.rQ)revalid_dmi_keysmatch dmi_values r? sub_dmi_varsros 3 (--/N/59  & KKI   !%( I 5     kkF5',i8%9& Jr')loggingr/ri collectionsrtypingr cloudinitrcloudinit.utilrrrr getLogger__name__r-r,r __new__ __defaults__r)strr@rHrLrRrdrorYr'r?rzs "g!# (GH #5  .;..k-t .k-t.{. .0$. N!.";}.BDI#.$K0EtL%.&14'.,K0+-.2[193.8{3T9.>;+[?.D;/E.JK0)K.P;,iQ.Vk2DW.b#3#8C=#LCHSM*chsm*chsm"-s-x}-`ccr'