mbligh | c6b01ed | 2006-10-13 17:03:26 +0000 | [diff] [blame] | 1 | #!/usr/bin/python |
mbligh | e65acfb | 2006-12-19 01:39:38 +0000 | [diff] [blame] | 2 | |
jadmanski | 8cd6ab3 | 2008-06-03 15:42:11 +0000 | [diff] [blame] | 3 | import common |
| 4 | |
| 5 | import os, shutil, re, glob |
mbligh | e829ba5 | 2008-06-03 15:04:08 +0000 | [diff] [blame] | 6 | from autotest_lib.client.common_lib import utils |
| 7 | |
jadmanski | 8cd6ab3 | 2008-06-03 15:42:11 +0000 | [diff] [blame] | 8 | try: |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 9 | from autotest_lib.client.bin import site_sysinfo |
| 10 | local = True |
jadmanski | 8cd6ab3 | 2008-06-03 15:42:11 +0000 | [diff] [blame] | 11 | except ImportError: |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 12 | local = False |
mbligh | 4983e60 | 2006-05-18 18:27:31 +0000 | [diff] [blame] | 13 | |
mbligh | afb304f | 2008-01-10 01:36:10 +0000 | [diff] [blame] | 14 | # stuff to log per reboot |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 15 | files = ['/proc/pci', '/proc/meminfo', '/proc/slabinfo', '/proc/version', |
jadmanski | 554f23f | 2008-09-23 14:05:08 +0000 | [diff] [blame] | 16 | '/proc/cpuinfo', '/proc/cmdline', '/proc/modules', '/proc/interrupts'] |
mbligh | c6998a4 | 2007-01-28 20:08:45 +0000 | [diff] [blame] | 17 | # commands = ['lshw'] # this causes problems triggering CDROM drives |
jadmanski | 1066297 | 2008-05-20 18:01:42 +0000 | [diff] [blame] | 18 | commands = ['uname -a', 'lspci -vvn', 'gcc --version', 'ld --version', |
| 19 | 'mount', 'hostname'] |
mbligh | 4983e60 | 2006-05-18 18:27:31 +0000 | [diff] [blame] | 20 | path = ['/usr/bin', '/bin'] |
| 21 | |
mbligh | c6998a4 | 2007-01-28 20:08:45 +0000 | [diff] [blame] | 22 | |
mbligh | 4983e60 | 2006-05-18 18:27:31 +0000 | [diff] [blame] | 23 | def run_command(command, output): |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 24 | 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) |
mbligh | c6998a4 | 2007-01-28 20:08:45 +0000 | [diff] [blame] | 36 | |
mbligh | 4983e60 | 2006-05-18 18:27:31 +0000 | [diff] [blame] | 37 | |
mbligh | afb304f | 2008-01-10 01:36:10 +0000 | [diff] [blame] | 38 | def reboot_count(): |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 39 | if not glob.glob('*'): |
| 40 | return -1 # No reboots, initial data not logged |
| 41 | else: |
| 42 | return len(glob.glob('reboot*')) |
| 43 | |
| 44 | |
mbligh | afb304f | 2008-01-10 01:36:10 +0000 | [diff] [blame] | 45 | def boot_subdir(reboot_count): |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 46 | """subdir of job sysinfo""" |
| 47 | if reboot_count == 0: |
| 48 | return '.' |
| 49 | else: |
| 50 | return 'reboot%d' % reboot_count |
mbligh | 83ac994 | 2007-11-05 18:59:37 +0000 | [diff] [blame] | 51 | |
mbligh | afb304f | 2008-01-10 01:36:10 +0000 | [diff] [blame] | 52 | |
| 53 | def log_per_reboot_data(sysinfo_dir): |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 54 | """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) |
mbligh | c6998a4 | 2007-01-28 20:08:45 +0000 | [diff] [blame] | 65 | |
mbligh | 4983e60 | 2006-05-18 18:27:31 +0000 | [diff] [blame] | 66 | |
mbligh | afb304f | 2008-01-10 01:36:10 +0000 | [diff] [blame] | 67 | def _log_per_reboot_data(): |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 68 | """system info to log before each step of the job""" |
| 69 | for command in commands: |
| 70 | run_command(command, re.sub(r'\s', '_', command)) |
mbligh | 83ac994 | 2007-11-05 18:59:37 +0000 | [diff] [blame] | 71 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 72 | for file in files: |
| 73 | if (os.path.exists(file)): |
| 74 | shutil.copyfile(file, os.path.basename(file)) |
mbligh | 83ac994 | 2007-11-05 18:59:37 +0000 | [diff] [blame] | 75 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 76 | 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() |
mbligh | 83ac994 | 2007-11-05 18:59:37 +0000 | [diff] [blame] | 80 | |
| 81 | |
jadmanski | 30e9b59 | 2008-09-25 19:51:57 +0000 | [diff] [blame] | 82 | def 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 | |
| 89 | def _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 | |
| 108 | def log_after_each_test(state_dict, job_sysinfo_dir, test_sysinfo_dir): |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 109 | """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) |
mbligh | 83ac994 | 2007-11-05 18:59:37 +0000 | [diff] [blame] | 116 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 117 | os.makedirs(test_sysinfo_dir) |
| 118 | os.chdir(test_sysinfo_dir) |
| 119 | utils.system('ln -s %s reboot_current' % reboot_dir) |
mbligh | 83ac994 | 2007-11-05 18:59:37 +0000 | [diff] [blame] | 120 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 121 | utils.system('dmesg -c > dmesg', ignore_status=True) |
| 122 | utils.system('df -mP > df', ignore_status=True) |
jadmanski | 30e9b59 | 2008-09-25 19:51:57 +0000 | [diff] [blame] | 123 | |
| 124 | _log_messages(state_dict) |
| 125 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 126 | if local: |
| 127 | site_sysinfo.log_after_each_test() |
| 128 | finally: |
| 129 | os.chdir(pwd) |
| 130 | |
| 131 | |
jadmanski | 121f569 | 2008-08-22 20:59:25 +0000 | [diff] [blame] | 132 | def 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 | |
mbligh | 83ac994 | 2007-11-05 18:59:37 +0000 | [diff] [blame] | 163 | if __name__ == '__main__': |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 164 | log_per_reboot_data() |