OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # | 2 # |
3 # Copyright 2010 Google Inc. All Rights Reserved. | 3 # Copyright 2010 Google Inc. All Rights Reserved. |
4 # | 4 # |
5 # Licensed under the Apache License, Version 2.0 (the "License"); | 5 # Licensed under the Apache License, Version 2.0 (the "License"); |
6 # you may not use this file except in compliance with the License. | 6 # you may not use this file except in compliance with the License. |
7 # You may abtain a copy of the license at | 7 # You may abtain a copy of the license at |
8 # | 8 # |
9 # http://www.apache.org/licenses/LICENSE-2.0 | 9 # http://www.apache.org/licenses/LICENSE-2.0 |
10 # | 10 # |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 """ | 149 """ |
150 Args: | 150 Args: |
151 hostname: string, hostname of AutoTest host. | 151 hostname: string, hostname of AutoTest host. |
152 """ | 152 """ |
153 self.h = hostname | 153 self.h = hostname |
154 self.client = paramiko.SSHClient() | 154 self.client = paramiko.SSHClient() |
155 self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) | 155 self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) |
156 | 156 |
157 | 157 |
158 def run(self): | 158 def run(self): |
159 TB.hosts[self.h]['time'] = strftime( | |
160 '%d%b%Y %H:%M:%S', localtime()) | |
161 try: | 159 try: |
162 self.client.connect(self.h, username='root', | 160 self.client.connect(self.h, username='root', |
163 key_filename=TB.privkey, timeout=TIMEOUT) | 161 key_filename=TB.privkey, timeout=TIMEOUT) |
164 TB.hosts[self.h]['status'] = True | 162 TB.hosts[self.h]['status'] = True |
165 except Exception, e: | 163 except Exception, e: |
166 TB.logger.error('Host %s: %s', self.h, e) | 164 TB.logger.error('Host %s: %s', self.h, e) |
167 TB.hosts[self.h]['status'] = False | 165 TB.hosts[self.h]['status'] = False |
168 finally: | 166 finally: |
169 if TB.hosts[self.h]['status']: | 167 if TB.hosts[self.h]['status']: |
170 self.ReadRelease() | 168 self.ReadRelease() # Must be done before UpdateRelease(). |
171 self.ReadFirmware() | 169 self.ReadFirmware() |
172 self.UpdateRelease() # Must be done before ReadResources(). | 170 self.UpdateRelease() # Must be done before ReadResources(). |
173 if TB.hosts[self.h]['status']: | 171 if TB.hosts[self.h]['status']: |
174 self.ReadResources() | 172 self.ReadResources() |
175 TB.logger.debug('Closing client for %s', self.h) | 173 TB.logger.debug('Closing client for %s', self.h) |
176 self.client.close() | 174 self.client.close() |
| 175 TB.hosts[self.h]['time'] = strftime( |
| 176 '%d%b%Y %H:%M:%S', localtime()) |
177 | 177 |
178 | 178 |
179 def ReadRelease(self): | 179 def ReadRelease(self): |
180 """Get the Chrome OS Release version.""" | 180 """Get the Chrome OS Release version.""" |
181 # The PTR key will mark the current version. | 181 # The PTR key will mark the current version. |
182 | 182 |
183 cmd = 'cat /etc/lsb-release' | 183 cmd = 'cat /etc/lsb-release' |
184 try: | 184 try: |
185 stdin, stdout, stderr = self.client.exec_command(cmd) | 185 stdin, stdout, stderr = self.client.exec_command(cmd) |
186 for line in stdout: | 186 for line in stdout: |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 # This means the release file has the wrong format, so | 259 # This means the release file has the wrong format, so |
260 # we'll just write a new one with current values. | 260 # we'll just write a new one with current values. |
261 update_file = True | 261 update_file = True |
262 lines.pop(lines.index(line)) | 262 lines.pop(lines.index(line)) |
263 else: | 263 else: |
264 # If we get here than it's probably a blank line. | 264 # If we get here than it's probably a blank line. |
265 update_file = True | 265 update_file = True |
266 lines.pop(lines.index(line)) | 266 lines.pop(lines.index(line)) |
267 | 267 |
268 if update_file: | 268 if update_file: |
269 TB.logger.info('Updating %s', relfile) | 269 TB.logger.debug('Updating %s', relfile) |
270 shutil.move(relfile, tmpfile) | 270 shutil.move(relfile, tmpfile) |
271 # Put the most recent update in the new file, and make the | 271 # Put the most recent update in the new file, and make the |
272 # PTR key to point to it. | 272 # PTR key to point to it. |
273 lines.append('%s=%s\n' % (TB.time, | 273 lines.append('%s=%s\n' % (TB.time, |
274 TB.hosts[self.h][item]['PTR'])) | 274 TB.hosts[self.h][item]['PTR'])) |
275 lines.append('PTR=%s' % TB.hosts[self.h][item]['PTR']) | 275 lines.append('PTR=%s' % TB.hosts[self.h][item]['PTR']) |
276 try: | 276 try: |
277 rf = open(relfile, 'w') | 277 rf = open(relfile, 'w') |
278 for line in lines: | 278 for line in lines: |
279 rf.write(line) | 279 rf.write(line) |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
413 t.start() | 413 t.start() |
414 | 414 |
415 # Fill the requests queue with AutoTest host objects. | 415 # Fill the requests queue with AutoTest host objects. |
416 for host in self.afe_hosts: | 416 for host in self.afe_hosts: |
417 TB.logger.debug('Placing %s in host queue.', host.hostname) | 417 TB.logger.debug('Placing %s in host queue.', host.hostname) |
418 TB.q.put(host) | 418 TB.q.put(host) |
419 | 419 |
420 | 420 |
421 if TB.graph: | 421 if TB.graph: |
422 # Graphing takes much longer, so increase the max runtime. | 422 # Graphing takes much longer, so increase the max runtime. |
423 maxtime = RUNTIME * 5 | 423 maxtime = RUNTIME * 6 |
424 else: | 424 else: |
425 maxtime = RUNTIME | 425 maxtime = RUNTIME |
426 # Queue.join() will wait for all jobs in the queue to finish, or | 426 # Queue.join() will wait for all jobs in the queue to finish, or |
427 # until the timeout value is reached. Timeout is needed because | 427 # until the timeout value is reached. Timeout is needed because |
428 # sometimes the paramiko client will hang. | 428 # sometimes the paramiko client will hang. |
429 TB.logger.debug('Joining run queue.') | 429 TB.logger.debug('Joining run queue.') |
430 TB.q.join(timeout=maxtime) | 430 TB.q.join(timeout=maxtime) |
431 TB.logger.info('%s hosts left in host queue', TB.q.qsize()) | 431 TB.logger.info('%s hosts left in host queue', TB.q.qsize()) |
432 | 432 |
433 LogLevel = TB.logger.getEffectiveLevel() | 433 LogLevel = TB.logger.getEffectiveLevel() |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
744 f.write('<td>%s<br><a href=%s.html>' % (r, r)) | 744 f.write('<td>%s<br><a href=%s.html>' % (r, r)) |
745 f.write('<img src=%s%s.png width=475 height=250></a></td>' % ( | 745 f.write('<img src=%s%s.png width=475 height=250></a></td>' % ( |
746 r,k)) | 746 r,k)) |
747 if newrow: | 747 if newrow: |
748 newrow = False | 748 newrow = False |
749 else: | 749 else: |
750 f.write('</tr>\n') | 750 f.write('</tr>\n') |
751 newrow = True | 751 newrow = True |
752 f.write('</table><p>\n') | 752 f.write('</table><p>\n') |
753 f.write('</center>\n') | 753 f.write('</center>\n') |
| 754 f.write('<H5>Last Update: %s</H5>' % TB.hosts[hostname]['time']) |
754 f.write('</BODY></HTML>') | 755 f.write('</BODY></HTML>') |
755 f.close() | 756 f.close() |
756 os.chmod(pathname[k], 0644) | 757 os.chmod(pathname[k], 0644) |
757 if not os.path.isfile(index_file): | 758 if not os.path.isfile(index_file): |
758 os.symlink(pathname[TB.rrdtimes[0]], index_file) | 759 os.symlink(pathname[TB.rrdtimes[0]], index_file) |
759 | 760 |
760 # Create HTML files for each resource for all time periods. | 761 # Create HTML files for each resource for all time periods. |
761 for r in resource_list: | 762 for r in resource_list: |
762 rrdfile = os.path.join(rrd_dir, r + '.html') | 763 rrdfile = os.path.join(rrd_dir, r + '.html') |
763 f = open(rrdfile, 'w') | 764 f = open(rrdfile, 'w') |
764 f.write('<HTML><HEAD>') | 765 f.write('<HTML><HEAD>') |
765 f.write('<center><TITLE>%s %s Resources</TITLE></HEAD>' % ( | 766 f.write('<center><TITLE>%s %s Resources</TITLE></HEAD>' % ( |
766 hostname, r)) | 767 hostname, r)) |
767 f.write('<BODY><H1>%s %s Resources</H1>' % (hostname, r)) | 768 f.write('<BODY><H1>%s %s Resources</H1>' % (hostname, r)) |
768 for i in TB.releases: | 769 for i in TB.releases: |
769 f.write('<H4>%s: %s</H4>' % (i, TB.hosts[hostname][i]['PTR'])) | 770 f.write('<H4>%s: %s</H4>' % (i, TB.hosts[hostname][i]['PTR'])) |
770 f.write('<table border=5 bgcolor=#B5B5B5>') | 771 f.write('<table border=5 bgcolor=#B5B5B5>') |
771 f.write('<tr>') | 772 f.write('<tr>') |
772 for h in TB.rrdtimes: | 773 for h in TB.rrdtimes: |
773 f.write('<td><a href="#%s"><b>%s</b></a>' % (h, h)) | 774 f.write('<td><a href="#%s"><b>%s</b></a>' % (h, h)) |
774 f.write('</table>') | 775 f.write('</table>') |
775 f.write('<HR>') | 776 f.write('<HR>') |
776 f.write('<table border=1 bgcolor=#EEEEEE>') | 777 f.write('<table border=1 bgcolor=#EEEEEE>') |
777 for h in TB.rrdtimes: | 778 for h in TB.rrdtimes: |
778 f.write('<tr><td><a name="%s"><img src=%s%s.png>' % (h, r, h)) | 779 f.write('<tr><td><a name="%s"><img src=%s%s.png>' % (h, r, h)) |
779 f.write('</a></td></tr>\n') | 780 f.write('</a></td></tr>\n') |
780 f.write('</table><p>\n') | 781 f.write('</table><p>\n') |
781 f.write('</center>\n') | 782 f.write('</center>\n') |
| 783 f.write('<H5>Last Update: %s</H5>' % TB.hosts[hostname]['time']) |
782 f.write('</BODY></HTML>') | 784 f.write('</BODY></HTML>') |
783 f.close() | 785 f.close() |
784 os.chmod(rrdfile, 0644) | 786 os.chmod(rrdfile, 0644) |
785 | 787 |
786 | 788 |
787 def ParseBattery(self, h, k): | 789 def ParseBattery(self, h, k): |
788 """Convert /proc/acpi/battery/BAT0/state to a list of strings. | 790 """Convert /proc/acpi/battery/BAT0/state to a list of strings. |
789 | 791 |
790 Args: | 792 Args: |
791 h: string, hostname of host in AutoTest. | 793 h: string, hostname of host in AutoTest. |
(...skipping 926 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1718 parser.add_option('--logfile', | 1720 parser.add_option('--logfile', |
1719 help='name of logfile [default: %default]', | 1721 help='name of logfile [default: %default]', |
1720 default='monitor.log', | 1722 default='monitor.log', |
1721 dest='logfile') | 1723 dest='logfile') |
1722 parser.add_option('--log_to_stdout', | 1724 parser.add_option('--log_to_stdout', |
1723 help='Send output to StdOut [default: %default]', | 1725 help='Send output to StdOut [default: %default]', |
1724 default=False, | 1726 default=False, |
1725 dest='log_to_stdout') | 1727 dest='log_to_stdout') |
1726 parser.add_option('--threads', | 1728 parser.add_option('--threads', |
1727 help='Number of threads to create [default: %default]', | 1729 help='Number of threads to create [default: %default]', |
1728 default=25, | 1730 default=50, |
1729 dest='threads') | 1731 dest='threads') |
1730 parser.add_option('--update', | 1732 parser.add_option('--update', |
1731 help='Collect data from hosts [default: %default]', | 1733 help='Collect data from hosts [default: %default]', |
1732 default=True, | 1734 default=True, |
1733 dest='update') | 1735 dest='update') |
1734 parser.add_option('--url', | 1736 parser.add_option('--url', |
1735 help='URL for landing page [default: %default]', | 1737 help='URL for landing page [default: %default]', |
1736 default='http://www/~chromeos-test/systemhealth/', | 1738 default='http://www/~chromeos-test/systemhealth/', |
1737 dest='url') | 1739 dest='url') |
1738 | 1740 |
(...skipping 12 matching lines...) Expand all Loading... |
1751 sysmon.BuildLandingPage() | 1753 sysmon.BuildLandingPage() |
1752 runtime = time() - start | 1754 runtime = time() - start |
1753 endtime = strftime('%H:%M:%S', localtime()) | 1755 endtime = strftime('%H:%M:%S', localtime()) |
1754 TB.logger.info('End Time: %s', endtime) | 1756 TB.logger.info('End Time: %s', endtime) |
1755 TB.logger.info('Time of run: %s seconds', runtime) | 1757 TB.logger.info('Time of run: %s seconds', runtime) |
1756 TB.logger.info('Ran with %d threads', TB.thread_num) | 1758 TB.logger.info('Ran with %d threads', TB.thread_num) |
1757 | 1759 |
1758 | 1760 |
1759 if __name__ == '__main__': | 1761 if __name__ == '__main__': |
1760 main(sys.argv) | 1762 main(sys.argv) |
OLD | NEW |