Add zypper-log tool
authorDominik Heidler <dheidler@suse.de>
Wed, 15 Jun 2011 08:30:44 +0000 (10:30 +0200)
committerDominik Heidler <dheidler@suse.de>
Wed, 15 Jun 2011 08:30:44 +0000 (10:30 +0200)
tools/zypper-log [new file with mode: 0755]

diff --git a/tools/zypper-log b/tools/zypper-log
new file mode 100755 (executable)
index 0000000..9a6dbe3
--- /dev/null
@@ -0,0 +1,111 @@
+#!/usr/bin/env python
+
+# This tool helps you accessing the zypper logfile
+# see --help for more details
+
+import os, string, re, bz2, zlib, sys, time, argparse
+
+filenamelen = 0
+pidlen = 0
+verlen = 0
+
+def getLogFiles(rotate = 0):
+  logfiles = []
+  global filenamelen
+  for logfile in os.listdir('/var/log/'):
+    if logfile.find('zypper.log') != -1 and logfile.find('.zypper.log') == -1 and logfile != 'zypper.log':
+      filename = os.path.join('/var/log', logfile)
+      logfiles.append(filename)
+      if len(filename) > filenamelen:
+        filenamelen = len(filename)
+  logfiles.sort()
+  filename = os.path.join('/var/log', 'zypper.log')
+  if os.path.isfile(filename):
+    logfiles.append(filename)
+    if len(filename) > filenamelen:
+      filenamelen = len(filename)
+  return logfiles[-rotate-1::]
+
+def readFile(logfile):
+  logtxt = open(logfile).read()
+  fext = logfile.split('.')[-1]
+  if fext == 'bz2':
+    logtxt = bz2.decompress(logtxt)
+  elif fext == 'gz':
+    logtxt = zlib.decompress(logtxt)
+  return logtxt
+
+def getListFromLogFiles(logfiles):
+  logindex = []
+  global pidlen, verlen
+  c = re.compile(r"===== Hi, me zypper (\d+.\d+.\d+)\s(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).+\((\d+)\).+=====\s(.+)\s=====")
+
+  for logfile in logfiles:
+    print >> sys.stderr, "Reading %s" % logfile, '.' * (filenamelen - len(logfile) + 3),
+    sys.stderr.flush()
+    for run in c.findall(readFile(logfile)):
+      if len(run[2]) > pidlen:
+        pidlen = len(run[2])
+      if len(run[0]) > verlen:
+        verlen = len(run[0])
+      logindex.append({'version': run[0],
+                       'time': time.strptime(run[1], "%Y-%m-%d %H:%M:%S"),
+                       'pid': run[2],
+                       'cmd': run[3].replace("'", "")})
+    print >> sys.stderr, "DONE"
+    sys.stderr.flush()
+  print >> sys.stderr, ""
+  sys.stderr.flush()
+  return logindex
+
+def printList(logindex, date = False):
+  global pidlen, verlen
+  rows, columns = os.popen('stty size', 'r').read().split()
+
+  print "TIME              PID", ' ' * (pidlen - 3), "VER", ' ' * (verlen - 3), "CMD"
+  for logentry in logindex:
+    if date and date != time.strftime("%Y-%m-%d", logentry['time']):
+      continue
+    logentry['ptime'] = time.strftime("%Y-%m-%d %H:%M", logentry['time'])
+    spaceleft = int(columns) - (22 + pidlen + len(logentry['version']) + len(logentry['cmd']))
+    if spaceleft < 0:
+      logentry['cmd'] = logentry['cmd'][:spaceleft-3] + '...'
+    print "%(ptime)s  %(pid)s" % logentry, ' ' * (pidlen - len(logentry['pid'])), "%(version)s" % logentry, ' ' * (verlen - len(logentry['version'])),  "%(cmd)s" % logentry
+
+def printLogByPID(logfiles, pid):
+  output = []
+  c = re.compile(r"\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} \<\d\> \w+\(%d\).+" % pid)
+
+  for logfile in logfiles:
+    print >> sys.stderr, "Reading %s" % logfile, '.' * (filenamelen - len(logfile) + 3),
+    sys.stderr.flush()
+    output.extend( c.findall(readFile(logfile)) )
+    print >> sys.stderr, "DONE"
+    sys.stderr.flush()
+  print >> sys.stderr, ""
+  sys.stderr.flush()
+  print "\n".join(output)
+
+def main():
+  parser = argparse.ArgumentParser(description='This tool helps you to access the zypper logfile. Run this command without any arguments to get a list of your zypper runs. Provide the PID-File of a zypper run as an argument to query the log for this run.')
+  parser.add_argument('-l', dest='logfile', metavar='FILE', help='Read only this file')
+  parser.add_argument('-r', dest='rotate', metavar='N', type=int, default=0, help='Read N rotated logfiles')
+  parser.add_argument('-d', dest='date', metavar='YYYY-MM-DD', help='Get runs for this day')
+  parser.add_argument('pid', metavar='PID', nargs='?', type=int, help='Get log for this PID')
+  args = parser.parse_args()
+
+  if args.logfile:
+    global filenamelen
+    filenamelen = len(args.logfile)
+    logfiles = [args.logfile]
+  else:
+    logfiles = getLogFiles(args.rotate)
+  if args.pid:
+     printLogByPID(logfiles, args.pid)
+  else:
+    logindex = getListFromLogFiles(logfiles)
+    printList(logindex, args.date)
+
+
+if __name__ == "__main__":
+  main()