aboutsummaryrefslogblamecommitdiffstats
path: root/extras/sos-open
blob: ffc9f0513748ea47ebde01a1a531c1907b536cf6 (plain) (tree)






















































































































































                                                                                                                     
#!/usr/bin/python

import os, commands, getopt, sys, tarfile

# FILES NEEDED BY CHECKSYSREPORT: /etc/redhat-release /etc/sysconfig/rhn/up2date rpm-Va installed-rpms uname lsmod

CONFIG = {}
report_dirs = []

CONFIG["outdir"] = "/tmp/sysreports"
CONFIG["extract_reports"] = []
CONFIG["spawn_terminal"] = False
if not sys.stdin.isatty(): CONFIG["spawn_terminal"] = True
else:                      CONFIG["spawn_terminal"] = False

def cat(fname):
   try:
      fp = open(fname,"r")
      print fp.read()
      fp.close()
   except: pass

try:
   opts, args = getopt.getopt(sys.argv[1:], "hi:w:vxf", ["help", "input="])
except getopt.GetoptError:
   # print help information and exit:
   usage()
   sys.exit(2)

for o, a in opts:
   if o == "-v":
      verbose = True
   if o == "-f":
      CONFIG["spawn_terminal"] = False
   if o == "-x":
      CONFIG["spawn_terminal"] = True
      sys.argv[sys.argv.index("-x")] = "-f"
   if o in ("-h", "--help"):
      usage()
      sys.exit()
   if o in ("-d"):
      CONFIG["outdir"] = a
   if o in ("-w"):
      a = os.path.abspath(a)
      try:    os.stat(a)
      except: print "ERROR: could not open", a
      else:   report_dirs.append(a)

   if o in ("-i"):
      a = os.path.abspath(a)
      try:    os.stat(a)
      except: print "ERROR: could not open", a

if CONFIG["spawn_terminal"]:
   print "spawning new terminal"
   sys.argv[0] = os.path.abspath(sys.argv[0])
   os.system("gnome-terminal -e '%s'" % (' '.join(sys.argv)))
   sys.exit()

CONFIG["extract_reports"] = [os.path.abspath(a) for a in args]

if not os.path.isdir(CONFIG["outdir"]):
   if not os.path.exists(CONFIG["outdir"]):
      exit("ERROR: working directory path exists but it's not a directory")
   else:
      try:    os.mkdir(CONFIG["outdir"])
      except: exit("ERROR: could not create working directory")

try:    os.chdir(CONFIG["outdir"])
except: exit("ERROR: could not chdir into working directory, please check permissions")

for report in CONFIG["extract_reports"]:
   report_ext = report.rsplit(".",1)[-1]

   if report_ext == "gpg":
      clear_fname = os.path.join(CONFIG["outdir"],os.path.basename(report.rsplit(".",1)[0]))
      status, output = commands.getstatusoutput("gpg --output %s %s" % (clear_fname,report))
      if status:
         sys.exit("ERROR: could not decrypt using gpg" + output	)
      report = clear_fname
      report_ext = clear_fname.rsplit(".",1)[-1]
      del clear_fname

   outdir = None
   tar = tarfile.open(report, "r")
   for tarinfo in tar:
      if tarinfo.isdir(): outdir = tarinfo.name ; break
   tar.close()

   if not outdir:
      print("INFO: archive doesn't appear to be either a sysreport or sosreport")
      cddir = os.path.basename(report)
      for sout in [ ".tar.gz", ".tgz", ".tar.bz2" ]:
         if cddir.endswith(sout): cddir = cddir[:-len(sout)]
      cddir = os.path.abspath(os.path.join(CONFIG["outdir"],"extract_" + cddir))
      outdir = cddir
   else:
      cddir = CONFIG["outdir"]
      outdir = os.path.abspath(os.path.join(CONFIG["outdir"], outdir))

   extract = True
   if os.path.isdir(outdir):
      extract = False
      yorno = False
      print "This report already seems to have been extracted in:"
      print "  " + outdir
      print
      while yorno not in ['y','n']: yorno = raw_input("Do you want to replace it with a fresh copy ? (y/n) ").lower()
      if yorno == 'y':
         print "Deleting previous copy..."
         os.system("chmod -R u+rw %s" % outdir)
         os.system("rm -rf %s" % outdir)
         extract = True

   if extract:
      print "Extracting..."
      if not os.path.isdir(cddir):
         os.mkdir(cddir)
      if report_ext == "bz2":
         status, output = commands.getstatusoutput("tar xCfj %s %s" % (cddir,report))
      elif report_ext == "gz" or report_ext == "tgz" :
         status, output = commands.getstatusoutput("tar xCfz %s %s" % (cddir,report))

      if status:
         print("ERROR: there was some problem extracting the report (%s)" % report)

   report_dirs.append(os.path.abspath(outdir))

if len(report_dirs) == 1 and os.path.isdir(report_dirs[0]):
   os.chdir(report_dirs[0])

   if os.path.isfile("sos_reports/diagnose.txt"):
      print
      print "Diagnostics messages available:"
      print
      fp = open("sos_reports/diagnose.txt","r")
      for line in fp.readlines():
         print "  " + line.strip("\n")
      fp.close()
      print

   report_dirs[0]

   print
   print "The extracted report is located in: " 
   print "  " + report_dirs[0]
   print "Once finished, press exit to return."
   print
   cat("uname")
   os.system("PS1='[SoS \W]\$ ' HOME='%s' /bin/bash -l" % (report_dirs[0]) )
   sys.exit(-1)