From 214ab35870f2ae24ea0ed879f77276e019665d3e Mon Sep 17 00:00:00 2001 From: cecilkorik Date: Mon, 20 Nov 2006 22:10:54 +0000 Subject: [PATCH] initial import --HG-- branch : lognewlines --- lognewlines.py | 129 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100755 lognewlines.py diff --git a/lognewlines.py b/lognewlines.py new file mode 100755 index 0000000..767d4cc --- /dev/null +++ b/lognewlines.py @@ -0,0 +1,129 @@ +#!/usr/bin/python +import os +import sys +import getopt + +opts_short = ['h', 'n', 'o:', 'v', 'V'] +opts_long = ['help', 'no-update', 'output=', 'verbose', 'version'] +opts_desc = ['Displays this information', 'Does not update the pointer to where it left off', 'Where to send the new lines (defaults to stdout)', 'Displays debugging information on stderr', 'Prints version and exits'] + +def print_usage(): + sys.stderr.write("""Usage: + lognewlines [options] (logfile) + +Available options are: +""") + for i in range(0, len(opts_short)): + argstr = "-%s, --%s" + if opts_short[i][-1] == ':': + argstr = "-%s, --%s " % (opts_short[i][0], opts_long[i][:-1]) + else: + argstr = "-%s, --%s" % (opts_short[i], opts_long[i]) + argstr = ("%s " % (argstr,))[:24] + desc = opts_desc[i] + sys.stderr.write("\n %s %s" % (argstr, desc)) + + sys.stderr.write('\n') + +opts, args = getopt.getopt(sys.argv[1:], ''.join(opts_short), opts_long) + +output_f = sys.stdout +verbose = False +update_pos = True + +for o, a in opts: + if o in ('-V', '--version'): + print_version() + sys.exit(0) + elif o in ('-h', '--help'): + print_usage() + sys.exit(0) + elif o in ('-o', '--output'): + output_f = a + elif o in ('-v', '--verbose'): + verbose = True + elif o in ('-n', '--no-update'): + update_pos = False + +if len(args) != 1: + print_usage() + sys.exit(0) + +args = args[0] +prefdir = None +def make_prefs_dir(): + global prefdir + homedir = os.environ['HOME'] + pwd = open('/etc/passwd', 'r') + for pwdl in pwd: + try: + uname, upass, uid, gid, fullname, home, shell = pwdl.split(':') + except ValueError: + continue + if os.getuid() == int(uid): + homedir = home + break + + + prefdir = os.path.join(homedir, '.lognewlines') + if not os.path.exists(prefdir): + os.mkdir(prefdir) + + +if type(output_f) == str: + output_f = open(output_f, 'wb') + +make_prefs_dir() +fn = os.path.realpath(os.path.abspath(args)) +fnn = os.path.split(fn)[1] +preffn = os.path.join(prefdir, fnn) +newpf = [] +line_no = 0 +read_pos = 0 + +if os.path.exists(preffn): + pf = open(preffn, 'r') + for p in pf: + line_no += 1 + try: + path, pos = p.split(':') + except: + sys.stderr.write("Invalid pref file entry: file %s, line %d\n" % (fnn, line_no)) + continue + + if path == fn: + read_pos = int(pos) + newpf += [None] + else: + newpf += [p] + + +lf = open(fn, 'rb') +lf.seek(0, 2) +size = lf.tell() +lf.seek(0) +if size < read_pos: + """ file has been restarted from scratch! """ + while lf.tell() < size: + output_f.write(lf.read(1024)) + +elif size == read_pos: + """ no changes! """ + sys.exit(0) +else: + """ more to read! """ + lf.seek(read_pos) + while lf.tell() < size: + output_f.write(lf.read(1024)) + +""" rewrite pref file """ +try: + i = newpf.index(None) +except ValueError: + i = len(newpf) + newpf += [None] + +newpf[i] = "%s:%d\n" % (fn, size) + +pf = open(preffn, 'w') +pf.write(''.join(newpf))