diff options
Diffstat (limited to 'cts/lab/cts-log-watcher.in')
-rw-r--r-- | cts/lab/cts-log-watcher.in | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/cts/lab/cts-log-watcher.in b/cts/lab/cts-log-watcher.in new file mode 100644 index 0000000..cee9c94 --- /dev/null +++ b/cts/lab/cts-log-watcher.in @@ -0,0 +1,84 @@ +#!@PYTHON@ +""" Remote log reader for Pacemaker's Cluster Test Suite (CTS) + +Reads a specified number of lines from the supplied offset +Returns the current offset +Contains logic for handling truncation +""" + +__copyright__ = "Copyright 2014-2020 the Pacemaker project contributors" +__license__ = "GNU General Public License version 2 or later (GPLv2+) WITHOUT ANY WARRANTY" + +import sys +import os +import fcntl + +if __name__ == '__main__': + + limit = 0 + offset = 0 + prefix = '' + filename = '/var/log/messages' + + skipthis=None + args=sys.argv[1:] + for i in range(0, len(args)): + if skipthis: + skipthis=None + continue + + elif args[i] == '-l' or args[i] == '--limit': + skipthis=1 + limit = int(args[i+1]) + + elif args[i] == '-f' or args[i] == '--filename': + skipthis=1 + filename = args[i+1] + + elif args[i] == '-o' or args[i] == '--offset': + skipthis=1 + offset = args[i+1] + + elif args[i] == '-p' or args[i] == '--prefix': + skipthis=1 + prefix = args[i+1] + + elif args[i] == '-t' or args[i] == '--tag': + skipthis=1 + + if not os.access(filename, os.R_OK): + print(prefix + 'Last read: %d, limit=%d, count=%d - unreadable' % (0, limit, 0)) + sys.exit(1) + + logfile=open(filename, 'r') + logfile.seek(0, os.SEEK_END) + newsize=logfile.tell() + + if offset != 'EOF': + offset = int(offset) + if newsize >= offset: + logfile.seek(offset) + else: + print(prefix + ('File truncated from %d to %d' % (offset, newsize))) + if (newsize*1.05) < offset: + logfile.seek(0) + # else: we probably just lost a few logs after a fencing op + # continue from the new end + # TODO: accept a timestamp and discard all messages older than it + + # Don't block when we reach EOF + fcntl.fcntl(logfile.fileno(), fcntl.F_SETFL, os.O_NONBLOCK) + + count = 0 + while True: + if logfile.tell() >= newsize: break + elif limit and count >= limit: break + + line = logfile.readline() + if not line: break + + print(line.strip()) + count += 1 + + print(prefix + 'Last read: %d, limit=%d, count=%d' % (logfile.tell(), limit, count)) + logfile.close() |