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