diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/msgfmt.py | 203 | ||||
-rwxr-xr-x | tools/sos-open | 151 |
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) |