diff options
Diffstat (limited to 'src/extras')
-rwxr-xr-x | src/extras/sos-open | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/src/extras/sos-open b/src/extras/sos-open new file mode 100755 index 00000000..ffc9f051 --- /dev/null +++ b/src/extras/sos-open @@ -0,0 +1,151 @@ +#!/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) |