129 lines
2.8 KiB
Python
Executable file
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))
|