blob: 5530f278b9b03dd138ab29c5626871d4a6dafaf8 [file] [log] [blame]
mblighc6b01ed2006-10-13 17:03:26 +00001#!/usr/bin/python
mblighe65acfb2006-12-19 01:39:38 +00002
jadmanski8cd6ab32008-06-03 15:42:11 +00003import common
4
5import os, shutil, re, glob
mblighe829ba52008-06-03 15:04:08 +00006from autotest_lib.client.common_lib import utils
7
jadmanski8cd6ab32008-06-03 15:42:11 +00008try:
jadmanski0afbb632008-06-06 21:10:57 +00009 from autotest_lib.client.bin import site_sysinfo
10 local = True
jadmanski8cd6ab32008-06-03 15:42:11 +000011except ImportError:
jadmanski0afbb632008-06-06 21:10:57 +000012 local = False
mbligh4983e602006-05-18 18:27:31 +000013
mblighafb304f2008-01-10 01:36:10 +000014# stuff to log per reboot
jadmanski0afbb632008-06-06 21:10:57 +000015files = ['/proc/pci', '/proc/meminfo', '/proc/slabinfo', '/proc/version',
jadmanski554f23f2008-09-23 14:05:08 +000016 '/proc/cpuinfo', '/proc/cmdline', '/proc/modules', '/proc/interrupts']
mblighc6998a42007-01-28 20:08:45 +000017# commands = ['lshw'] # this causes problems triggering CDROM drives
jadmanski10662972008-05-20 18:01:42 +000018commands = ['uname -a', 'lspci -vvn', 'gcc --version', 'ld --version',
19 'mount', 'hostname']
mbligh4983e602006-05-18 18:27:31 +000020path = ['/usr/bin', '/bin']
21
mblighc6998a42007-01-28 20:08:45 +000022
mbligh4983e602006-05-18 18:27:31 +000023def run_command(command, output):
jadmanski0afbb632008-06-06 21:10:57 +000024 parts = command.split(None, 1)
25 cmd = parts[0]
26 if len(parts) > 1:
27 args = parts[1]
28 else:
29 args = ''
30 for dir in path:
31 pathname = dir + '/' + cmd
32 if not os.path.exists(pathname):
33 continue
34 tmp_cmd = "%s %s > %s 2> /dev/null" % (pathname, args, output)
35 utils.system(tmp_cmd)
mblighc6998a42007-01-28 20:08:45 +000036
mbligh4983e602006-05-18 18:27:31 +000037
mblighafb304f2008-01-10 01:36:10 +000038def reboot_count():
jadmanski0afbb632008-06-06 21:10:57 +000039 if not glob.glob('*'):
40 return -1 # No reboots, initial data not logged
41 else:
42 return len(glob.glob('reboot*'))
43
44
mblighafb304f2008-01-10 01:36:10 +000045def boot_subdir(reboot_count):
jadmanski0afbb632008-06-06 21:10:57 +000046 """subdir of job sysinfo"""
47 if reboot_count == 0:
48 return '.'
49 else:
50 return 'reboot%d' % reboot_count
mbligh83ac9942007-11-05 18:59:37 +000051
mblighafb304f2008-01-10 01:36:10 +000052
53def log_per_reboot_data(sysinfo_dir):
jadmanski0afbb632008-06-06 21:10:57 +000054 """we log this data when the job starts, and again after any reboot"""
55 pwd = os.getcwd()
56 try:
57 os.chdir(sysinfo_dir)
58 subdir = boot_subdir(reboot_count() + 1)
59 if not os.path.exists(subdir):
60 os.mkdir(subdir)
61 os.chdir(os.path.join(sysinfo_dir, subdir))
62 _log_per_reboot_data()
63 finally:
64 os.chdir(pwd)
mblighc6998a42007-01-28 20:08:45 +000065
mbligh4983e602006-05-18 18:27:31 +000066
mblighafb304f2008-01-10 01:36:10 +000067def _log_per_reboot_data():
jadmanski0afbb632008-06-06 21:10:57 +000068 """system info to log before each step of the job"""
69 for command in commands:
70 run_command(command, re.sub(r'\s', '_', command))
mbligh83ac9942007-11-05 18:59:37 +000071
jadmanski0afbb632008-06-06 21:10:57 +000072 for file in files:
73 if (os.path.exists(file)):
74 shutil.copyfile(file, os.path.basename(file))
mbligh83ac9942007-11-05 18:59:37 +000075
jadmanski0afbb632008-06-06 21:10:57 +000076 utils.system('dmesg -c > dmesg', ignore_status=True)
77 utils.system('df -mP > df', ignore_status=True)
78 if local:
79 site_sysinfo.log_per_reboot_data()
mbligh83ac9942007-11-05 18:59:37 +000080
81
jadmanski30e9b592008-09-25 19:51:57 +000082def log_before_each_test(state_dict, job_sysinfo_dir, test_sysinfo_dir):
83 if os.path.exists("/var/log/messages"):
84 stat = os.stat("/var/log/messages")
85 state_dict["messages_size"] = stat.st_size
86 state_dict["messages_inode"] = stat.st_ino
87
88
89def _log_messages(state_dict):
90 """ Log all of the new data in /var/log/messages. """
91 try:
92 # log all of the new data in /var/log/messages
93 bytes_to_skip = 0
94 if "messages_size" in state_dict and "messages_inode" in state_dict:
95 current_inode = os.stat("/var/log/messages").st_ino
96 if current_inode == state_dict["messages_inode"]:
97 bytes_to_skip = state_dict["messages_size"]
98 in_messages = open("/var/log/messages")
99 in_messages.seek(bytes_to_skip)
100 out_messages = open("messages", "w")
101 out_messages.write(in_messages.read())
102 in_messages.close()
103 out_messages.close()
104 except Exception, e:
105 print "/var/log/messages collection failed with %s" % e
106
107
108def log_after_each_test(state_dict, job_sysinfo_dir, test_sysinfo_dir):
jadmanski0afbb632008-06-06 21:10:57 +0000109 """log things that change after each test (called from test.py)"""
110 pwd = os.getcwd()
111 try:
112 os.chdir(job_sysinfo_dir)
113 reboot_subdir = boot_subdir(reboot_count())
114 reboot_dir = os.path.join(job_sysinfo_dir, reboot_subdir)
115 assert os.path.exists(reboot_dir)
mbligh83ac9942007-11-05 18:59:37 +0000116
jadmanski0afbb632008-06-06 21:10:57 +0000117 os.makedirs(test_sysinfo_dir)
118 os.chdir(test_sysinfo_dir)
119 utils.system('ln -s %s reboot_current' % reboot_dir)
mbligh83ac9942007-11-05 18:59:37 +0000120
jadmanski0afbb632008-06-06 21:10:57 +0000121 utils.system('dmesg -c > dmesg', ignore_status=True)
122 utils.system('df -mP > df', ignore_status=True)
jadmanski30e9b592008-09-25 19:51:57 +0000123
124 _log_messages(state_dict)
125
jadmanski0afbb632008-06-06 21:10:57 +0000126 if local:
127 site_sysinfo.log_after_each_test()
128 finally:
129 os.chdir(pwd)
130
131
jadmanski121f5692008-08-22 20:59:25 +0000132def log_test_keyvals(test, test_sysinfo_dir):
133 """
134 Extract some useful data from the sysinfo and write it out into
135 the test keyval.
136 """
137 keyval = {}
138
139 # grab a bunch of single line files and turn them into keyvals
140 files_to_log = ["cmdline", "uname_-a"]
141 keyval_fields = ["cmdline", "uname"]
142 for filename, field in zip(files_to_log, keyval_fields):
143 path = os.path.join(test_sysinfo_dir, "reboot_current", filename)
144 if os.path.exists(path):
145 keyval["sysinfo-%s" % field] = utils.read_one_line(path)
146
147 # grab the total memory
148 path = os.path.join(test_sysinfo_dir, "reboot_current", "meminfo")
149 if os.path.exists(path):
150 mem_data = open(path).read()
151 match = re.search(r"^MemTotal:\s+(\d+) kB$", mem_data, re.MULTILINE)
152 if match:
153 keyval["sysinfo-memtotal-in-kb"] = match.group(1)
154
155 # write out the data to the test keyval file
156 test.write_test_keyval(keyval)
157
158 # call the site-specific version of this function
159 if local:
160 site_sysinfo.log_test_keyvals(test, test_sysinfo_dir)
161
162
mbligh83ac9942007-11-05 18:59:37 +0000163if __name__ == '__main__':
jadmanski0afbb632008-06-06 21:10:57 +0000164 log_per_reboot_data()