#!/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)