#!/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: lnl [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))