aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/msgfmt.py203
-rwxr-xr-xtools/sos-open151
2 files changed, 151 insertions, 203 deletions
diff --git a/tools/msgfmt.py b/tools/msgfmt.py
deleted file mode 100644
index 8a2d4e66..00000000
--- a/tools/msgfmt.py
+++ /dev/null
@@ -1,203 +0,0 @@
-#! /usr/bin/env python
-# -*- coding: iso-8859-1 -*-
-# Written by Martin v. Löwis <loewis@informatik.hu-berlin.de>
-
-"""Generate binary message catalog from textual translation description.
-
-This program converts a textual Uniforum-style message catalog (.po file) into
-a binary GNU catalog (.mo file). This is essentially the same function as the
-GNU msgfmt program, however, it is a simpler implementation.
-
-Usage: msgfmt.py [OPTIONS] filename.po
-
-Options:
- -o file
- --output-file=file
- Specify the output file to write to. If omitted, output will go to a
- file named filename.mo (based off the input file name).
-
- -h
- --help
- Print this message and exit.
-
- -V
- --version
- Display version information and exit.
-"""
-
-import sys
-import os
-import getopt
-import struct
-import array
-
-__version__ = "1.1"
-
-MESSAGES = {}
-
-
-
-def usage(code, msg=''):
- print >> sys.stderr, __doc__
- if msg:
- print >> sys.stderr, msg
- sys.exit(code)
-
-
-
-def add(id, str, fuzzy):
- "Add a non-fuzzy translation to the dictionary."
- global MESSAGES
- if not fuzzy and str:
- MESSAGES[id] = str
-
-
-
-def generate():
- "Return the generated output."
- global MESSAGES
- keys = MESSAGES.keys()
- # the keys are sorted in the .mo file
- keys.sort()
- offsets = []
- ids = strs = ''
- for id in keys:
- # For each string, we need size and file offset. Each string is NUL
- # terminated; the NUL does not count into the size.
- offsets.append((len(ids), len(id), len(strs), len(MESSAGES[id])))
- ids += id + '\0'
- strs += MESSAGES[id] + '\0'
- output = ''
- # The header is 7 32-bit unsigned integers. We don't use hash tables, so
- # the keys start right after the index tables.
- # translated string.
- keystart = 7*4+16*len(keys)
- # and the values start after the keys
- valuestart = keystart + len(ids)
- koffsets = []
- voffsets = []
- # The string table first has the list of keys, then the list of values.
- # Each entry has first the size of the string, then the file offset.
- for o1, l1, o2, l2 in offsets:
- koffsets += [l1, o1+keystart]
- voffsets += [l2, o2+valuestart]
- offsets = koffsets + voffsets
- output = struct.pack("Iiiiiii",
- 0x950412deL, # Magic
- 0, # Version
- len(keys), # # of entries
- 7*4, # start of key index
- 7*4+len(keys)*8, # start of value index
- 0, 0) # size and offset of hash table
- output += array.array("i", offsets).tostring()
- output += ids
- output += strs
- return output
-
-
-
-def make(filename, outfile):
- ID = 1
- STR = 2
-
- # Compute .mo name from .po name and arguments
- if filename.endswith('.po'):
- infile = filename
- else:
- infile = filename + '.po'
- if outfile is None:
- outfile = os.path.splitext(infile)[0] + '.mo'
-
- try:
- lines = open(infile).readlines()
- except IOError, msg:
- print >> sys.stderr, msg
- sys.exit(1)
-
- section = None
- fuzzy = 0
-
- # Parse the catalog
- lno = 0
- for l in lines:
- lno += 1
- # If we get a comment line after a msgstr, this is a new entry
- if l[0] == '#' and section == STR:
- add(msgid, msgstr, fuzzy)
- section = None
- fuzzy = 0
- # Record a fuzzy mark
- if l[:2] == '#,' and l.find('fuzzy'):
- fuzzy = 1
- # Skip comments
- if l[0] == '#':
- continue
- # Now we are in a msgid section, output previous section
- if l.startswith('msgid'):
- if section == STR:
- add(msgid, msgstr, fuzzy)
- section = ID
- l = l[5:]
- msgid = msgstr = ''
- # Now we are in a msgstr section
- elif l.startswith('msgstr'):
- section = STR
- l = l[6:]
- # Skip empty lines
- l = l.strip()
- if not l:
- continue
- # XXX: Does this always follow Python escape semantics?
- l = eval(l)
- if section == ID:
- msgid += l
- elif section == STR:
- msgstr += l
- else:
- print >> sys.stderr, 'Syntax error on %s:%d' % (infile, lno), \
- 'before:'
- print >> sys.stderr, l
- sys.exit(1)
- # Add last entry
- if section == STR:
- add(msgid, msgstr, fuzzy)
-
- # Compute output
- output = generate()
-
- try:
- open(outfile,"wb").write(output)
- except IOError,msg:
- print >> sys.stderr, msg
-
-
-
-def main():
- try:
- opts, args = getopt.getopt(sys.argv[1:], 'hVo:',
- ['help', 'version', 'output-file='])
- except getopt.error, msg:
- usage(1, msg)
-
- outfile = None
- # parse options
- for opt, arg in opts:
- if opt in ('-h', '--help'):
- usage(0)
- elif opt in ('-V', '--version'):
- print >> sys.stderr, "msgfmt.py", __version__
- sys.exit(0)
- elif opt in ('-o', '--output-file'):
- outfile = arg
- # do it
- if not args:
- print >> sys.stderr, 'No input file given'
- print >> sys.stderr, "Try `msgfmt --help' for more information."
- return
-
- for filename in args:
- make(filename, outfile)
-
-
-if __name__ == '__main__':
- main()
diff --git a/tools/sos-open b/tools/sos-open
new file mode 100755
index 00000000..ffc9f051
--- /dev/null
+++ b/tools/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)