lognewlines/lnl
cecilkorik 46c2d6b380 Made ready for distribution
--HG--
branch : lognewlines
2008-03-15 21:35:07 +00:00

133 lines
2.8 KiB
Text
Executable file

e!/usr/bin/python
import os
import sys
import getopt
__author__ = "Cecil <codeninja@iambitter.org>"
__version__ = "1.0"
__licence__ = "GPL"
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, '.lnl')
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))