#!/usr/bin/env python # # Copyright (C) 2016 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # import os import sys import time LOG_DIR = '/tmp' def GetLatestLog(): '''Find the latest vts runner log folder in log directory and return its content. Returns: (string, string), returns the latest log file path and log content ''' folders = [os.path.join(LOG_DIR, folder_name) for folder_name in os.listdir(LOG_DIR) if os.path.isdir(os.path.join(LOG_DIR, folder_name)) and folder_name.startswith('vts-runner-log')] try: folders.sort( lambda folder1, folder2: int(os.path.getmtime(folder1) - os.path.getmtime(folder2))) folder_latest = folders[-1] log_path_latest = os.path.join(folder_latest, os.listdir(folder_latest)[0], 'latest', 'test_run_details.txt') with open(log_path_latest, 'r') as log_latest: return (log_path_latest, log_latest.read()) except Exception as e: return (None, None) def StartMonitoring(path_only): '''Pull the latest vts runner log in a loop, and print out any new contents. Args: path_only: bool, only print out the latest log path in temporary directory. ''' is_first_time = True last_log_path = None last_text = '' while True: log_path_latest, text_latest = GetLatestLog() if path_only: print log_path_latest return if log_path_latest is None: # Case: cannot find any runner log time.sleep(2) continue if last_log_path == log_path_latest: text_new = text_latest[len(last_text):] last_text = text_latest if text_new: # Case: runner log file changed if is_first_time: is_first_time = False print text_new continue lines = text_new.split('\n') for l in lines: print l time.sleep(0.6 / len(lines)) else: # Case: runner log file didn't change time.sleep(1) else: # Case: found a new runner log file last_text = '' last_log_path = log_path_latest print '\n' * 6 + '=' * 24 + 'new file' + '=' * 24 + '\n' * 6 time.sleep(1) def PrintUsage(): print 'A script to read VTS Runner\'s log from temporary directory.' print 'Usage:' print ' -h, --help: print usage.' print ' -p, --path-only: print path to the latest runner file only.' print ' You may pipe the result to vim for searching.' print ' Example: script/monitor-runner-output.py --path-only | xargs gedit' print ' -m, --monitor: print VTS runner\'s output in close to real time' print ' If no argument is provided, this script will keep pulling the latest log and print it out.' if __name__ == "__main__": argv = sys.argv path_only = False if len(argv) == 1 or argv[1] == '-h' or argv[1] == '--help': PrintUsage() exit() elif argv[1] == '-p' or argv[1] == '--path-only': path_only = True elif argv[1] == '-m' or argv[1] == '--monitor': path_only = False StartMonitoring(path_only)