blob: 1a52f7291b8c1b88f48a06f9908d4223370964a4 [file] [log] [blame]
"""
Utilities for gathering information on the host machine for inclusion with
results.
"""
import re
from lnt.testing.util.commands import capture, fatal
# All the things we care to probe about the system, and whether to track with
# the machine or run. This is a list of (sysctl, kind) where kind is one of:
# machine - key should always be part of machine
# machdep - key should be part of machine, unless --no-machdep-info is set
# run - key should always be part of run
sysctl_info_table = [
('hw.activecpu', 'machine'),
('hw.availcpu', 'machine'),
('hw.busfrequency', 'machine'),
('hw.busfrequency_max', 'machine'),
('hw.busfrequency_min', 'machine'),
('hw.byteorder', 'machine'),
('hw.cacheconfig', 'machine'),
('hw.cachelinesize', 'machine'),
('hw.cachesize', 'machine'),
('hw.cpu64bit_capable', 'machine'),
('hw.cpufamily', 'machine'),
('hw.cpufrequency', 'machine'),
('hw.cpufrequency_max', 'machine'),
('hw.cpufrequency_min', 'machine'),
('hw.cpusubtype', 'machine'),
('hw.cputype', 'machine'),
('hw.epoch', 'machine'),
('hw.l1dcachesize', 'machine'),
('hw.l1icachesize', 'machine'),
('hw.l2cachesize', 'machine'),
('hw.l2settings', 'machine'),
('hw.logicalcpu', 'machine'),
('hw.logicalcpu_max', 'machine'),
('hw.machine', 'machine'),
('hw.memsize', 'machine'),
('hw.model', 'machine'),
('hw.ncpu', 'machine'),
('hw.optional.floatingpoint', 'machine'),
('hw.optional.mmx', 'machine'),
('hw.optional.sse', 'machine'),
('hw.optional.sse2', 'machine'),
('hw.optional.sse3', 'machine'),
('hw.optional.sse4_1', 'machine'),
('hw.optional.sse4_2', 'machine'),
('hw.optional.supplementalsse3', 'machine'),
('hw.optional.x86_64', 'machine'),
('hw.packages', 'machine'),
('hw.pagesize', 'machine'),
('hw.physicalcpu', 'machine'),
('hw.physicalcpu_max', 'machine'),
('hw.physmem', 'machine'),
('hw.tbfrequency', 'machine'),
('hw.usermem', 'run'),
('hw.vectorunit', 'machine'),
('kern.aiomax', 'machine'),
('kern.aioprocmax', 'machine'),
('kern.aiothreads', 'machine'),
('kern.argmax', 'machine'),
('kern.boottime', 'run'),
('kern.clockrate: hz', 'machine'),
('kern.coredump', 'machine'),
('kern.corefile', 'machine'),
('kern.delayterm', 'machine'),
('kern.hostid', 'machine'),
('kern.hostname', 'machdep'),
('kern.job_control', 'machine'),
('kern.maxfiles', 'machine'),
('kern.maxfilesperproc', 'machine'),
('kern.maxproc', 'machine'),
('kern.maxprocperuid', 'machine'),
('kern.maxvnodes', 'machine'),
('kern.netboot', 'machine'),
('kern.ngroups', 'machine'),
('kern.nisdomainname', 'machine'),
('kern.nx', 'machine'),
('kern.osrelease', 'machine'),
('kern.osrevision', 'machine'),
('kern.ostype', 'machine'),
('kern.osversion', 'machine'),
('kern.posix1version', 'machine'),
('kern.procname', 'machine'),
('kern.rage_vnode', 'machine'),
('kern.safeboot', 'machine'),
('kern.saved_ids', 'machine'),
('kern.securelevel', 'machine'),
('kern.shreg_private', 'machine'),
('kern.speculative_reads_disabled', 'machine'),
('kern.sugid_coredump', 'machine'),
('kern.thread_name', 'machine'),
('kern.usrstack', 'run'),
('kern.usrstack64', 'run'),
('kern.version', 'machine'),
('machdep.cpu.address_bits.physical', 'machine'),
('machdep.cpu.address_bits.virtual', 'machine'),
('machdep.cpu.arch_perf.events', 'machine'),
('machdep.cpu.arch_perf.events_number', 'machine'),
('machdep.cpu.arch_perf.fixed_number', 'machine'),
('machdep.cpu.arch_perf.fixed_width', 'machine'),
('machdep.cpu.arch_perf.number', 'machine'),
('machdep.cpu.arch_perf.version', 'machine'),
('machdep.cpu.arch_perf.width', 'machine'),
('machdep.cpu.brand', 'machine'),
('machdep.cpu.brand_string', 'machine'),
('machdep.cpu.cache.L2_associativity', 'machine'),
('machdep.cpu.cache.linesize', 'machine'),
('machdep.cpu.cache.size', 'machine'),
('machdep.cpu.core_count', 'machine'),
('machdep.cpu.cores_per_package', 'machine'),
('machdep.cpu.extfamily', 'machine'),
('machdep.cpu.extfeature_bits', 'machine'),
('machdep.cpu.extfeatures', 'machine'),
('machdep.cpu.extmodel', 'machine'),
('machdep.cpu.family', 'machine'),
('machdep.cpu.feature_bits', 'machine'),
('machdep.cpu.features', 'machine'),
('machdep.cpu.logical_per_package', 'machine'),
('machdep.cpu.max_basic', 'machine'),
('machdep.cpu.max_ext', 'machine'),
('machdep.cpu.microcode_version', 'machine'),
('machdep.cpu.model', 'machine'),
('machdep.cpu.mwait.extensions', 'machine'),
('machdep.cpu.mwait.linesize_max', 'machine'),
('machdep.cpu.mwait.linesize_min', 'machine'),
('machdep.cpu.mwait.sub_Cstates', 'machine'),
('machdep.cpu.signature', 'machine'),
('machdep.cpu.stepping', 'machine'),
('machdep.cpu.thermal.ACNT_MCNT', 'machine'),
('machdep.cpu.thermal.dynamic_acceleration', 'machine'),
('machdep.cpu.thermal.sensor', 'machine'),
('machdep.cpu.thermal.thresholds', 'machine'),
('machdep.cpu.thread_count', 'machine'),
('machdep.cpu.tlb.data.large', 'machine'),
('machdep.cpu.tlb.data.large_level1', 'machine'),
('machdep.cpu.tlb.data.small', 'machine'),
('machdep.cpu.tlb.data.small_level1', 'machine'),
('machdep.cpu.tlb.inst.large', 'machine'),
('machdep.cpu.tlb.inst.small', 'machine'),
('machdep.cpu.vendor', 'machine'),
]
def _get_mac_addresses():
lines = capture(['ifconfig']).strip()
current_ifc = None
for ln in lines.split('\n'):
if ln.startswith('\t'):
if current_ifc is None:
fatal('unexpected ifconfig output')
if ln.startswith('\tether '):
yield current_ifc, ln[len('\tether '):].strip()
else:
current_ifc, = re.match(r'([A-Za-z0-9]*): .*', ln).groups()
def get_machine_information(use_machine_dependent_info=False):
machine_info = {}
run_info = {}
info_targets = {
'machdep': (run_info, machine_info)[use_machine_dependent_info],
'machine': machine_info,
'run': run_info,
}
for name, target in sysctl_info_table:
info_targets[target][name] = capture(['sysctl', '-n', name],
include_stderr=True).strip()
for ifc, addr in _get_mac_addresses():
# Ignore virtual machine mac addresses.
if ifc.startswith('vmnet'):
continue
info_targets['machdep']['mac_addr.%s' % ifc] = addr
return machine_info, run_info