aboutsummaryrefslogtreecommitdiffstats
path: root/src/extras/sos-open
blob: ffc9f0513748ea47ebde01a1a531c1907b536cf6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
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)