#!/usr/bin/env python # # Copyright (C) 2003-2011 Upi Tamminen # import getopt import os import struct import sys import time OP_OPEN, OP_CLOSE, OP_WRITE, OP_EXEC = 1, 2, 3, 4 TYPE_INPUT, TYPE_OUTPUT, TYPE_INTERACT = 1, 2, 3 def playlog(fd, settings): ssize = struct.calcsize('= (3,): stdout = sys.stdout.buffer else: stdout = sys.stdout while 1: try: (op, tty, length, dir, sec, usec) = \ struct.unpack(' settings['maxdelay']: sleeptime = settings['maxdelay'] if settings['maxdelay'] > 0: time.sleep(sleeptime) prevtime = curtime if settings['colorify'] and color: stdout.write(color) stdout.write(data) if settings['colorify'] and color: stdout.write('\033[0m') color = None sys.stdout.flush() elif str(tty) == str(currtty) and op == OP_CLOSE: break def help(brief=0): print('Usage: %s [-bfhi] [-m secs] [-w file] ...\n' % \ os.path.basename(sys.argv[0])) if not brief: print(' -f keep trying to read the log until it\'s closed') print(' -m maximum delay in seconds, to avoid' + \ ' boredom or fast-forward\n' + \ ' to the end. (default is 3.0)') print(' -i show the input stream instead of output') print(' -b show both input and output streams') print(' -c colorify the output stream based on what streams are being received') print(' -h display this help\n') sys.exit(1) if __name__ == '__main__': settings = { 'tail': 0, 'maxdelay': 3.0, 'input_only': 0, 'both_dirs': 0, 'colorify': 0, } try: optlist, args = getopt.getopt(sys.argv[1:], 'fhibcm:w:', ['help']) except getopt.GetoptError as error: print('Error: %s\n' % error) help() for o, a in optlist: if o == '-f': settings['tail'] = 1 elif o == '-m': settings['maxdelay'] = float(a) # takes decimals elif o == '-i': settings['input_only'] = 1 elif o == '-b': settings['both_dirs'] = 1 elif o in ['-h', '--help']: help() elif o == '-c': settings['colorify'] = 1 if len(args) < 1: help() try: for logfile in args: logfd = open(logfile, 'rb') playlog(logfd, settings) except IOError: print("\n\n[!] Couldn't open log file (%s)!" % logfile) sys.exit(2)