lognewlines/lognewlines.py
cecilkorik 8f73ec7d64 changing name to "lnl"
--HG--
branch : lognewlines
2008-03-15 21:27:37 +00:00

129 lines
2.8 KiB
Python
Executable file

#!/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 <arg>" % (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))