initial import
--HG-- branch : lognewlines
This commit is contained in:
commit
214ab35870
1 changed files with 129 additions and 0 deletions
129
lognewlines.py
Executable file
129
lognewlines.py
Executable 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))
|
Loading…
Add table
Reference in a new issue