initial import

--HG--
branch : lognewlines
This commit is contained in:
cecilkorik 2006-11-20 22:10:54 +00:00
commit 214ab35870

129
lognewlines.py Executable file
View file

@ -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 <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))