diff options
Diffstat (limited to 'scripts/check-viewer-xml')
| -rwxr-xr-x | scripts/check-viewer-xml | 104 | 
1 files changed, 104 insertions, 0 deletions
| diff --git a/scripts/check-viewer-xml b/scripts/check-viewer-xml new file mode 100755 index 0000000000..85366c02ae --- /dev/null +++ b/scripts/check-viewer-xml @@ -0,0 +1,104 @@ +#!/usr/bin/env python +from __future__ import print_function +import sys +import os +import argparse +import xml.etree.ElementTree as xml + +try: +    from llbase import llsd +except ImportError: +    try: +        from indra.base import llsd +    except ImportError: +        sys.exit("""Failed to import python llsd module from llbase or indra.base. +Try +   pip install llbase +or +   sudo pip install llbase +""") + +def warning(*objs): +    print(*objs, file=sys.stderr) +     +def xml_is_ok(file): +    # Check that the XML file is well formed. +    try : +        elements = xml.parse(file) +    except IOError as read_error: +        warning("XML not readable '%s':\n   %s" % (file, read_error)) +        return False +    except xml.ParseError as parse_error : +        warning("XML not well-formed '%s':\n   %s" % (file, parse_error.msg)) +        return False + +    root = elements.getroot() +    if root.tag == 'llsd': +        # if it's LLSD, we should be able to also validate that +        with open(file, "r") as llsd_file: +            llsd_content=llsd_file.read() +        try: +            llsd.parse(llsd_content) +        except Exception as validity_error: +            warning("LLSD not valid '%s':\n   %s" % (file, validity_error)) +            return False +    elif arg.verbosity == 'verbose': +        warning("  %s is not a document type that can be validated" % root.tag) + +    return True + +cmd_line = argparse.ArgumentParser(description='Checks all xml files found in viewer settings and cache directories ', +                                   prog='check-viewer-xml', +                                   ) +cmd_line.add_argument('directory', nargs='*', default=None, +                      help='additional directories to check') +verbosity_options=cmd_line.add_mutually_exclusive_group() +verbosity_options.add_argument('-v', '--verbose',  +                        help='verbose output', action='store_const', const='verbose', dest='verbosity') +verbosity_options.add_argument('-q', '--quiet', +                    help='output errors only', action='store_const', const='quiet', dest='verbosity', default='normal') + +arg = cmd_line.parse_args() + +if sys.platform == 'darwin': +    CheckDirs = [ os.path.expanduser('~/Library/Caches/SecondLife'), +                  os.path.expanduser('~/Library/Application Support/SecondLife'), +                  ] +elif sys.platform == 'linux2': +    CheckDirs = [ os.path.expanduser('~/.secondlife'), +                  ] +elif sys.platform == 'win32' or sys.platform == 'cygwin':   +    if os.path.isdir(os.path.expanduser('~\\AppData\\Roaming')): +        CheckDirs = [ os.path.expanduser('~\\Application\\Data\\Secondlife'), +                      os.path.expanduser('~\\AppData\\Roaming\\Secondlife'), +                      os.path.expanduser('~\\AppData\\Local\\Secondlife'), +                      ] +    else: +        sys.exit("No AppData\\Roaming directory found;\nThis script must be run in a native Windows command shell.\nRunning under cygwin does not work.") +else: +    sys.exit("unrecognized platform '%s'" % sys.platform) + +if arg.directory: +    CheckDirs.extend(arg.directory) + +checked_files = 0 +invalid_files = 0 +for root in filter(os.path.isdir, CheckDirs): +    if arg.verbosity == 'verbose': +        print("Searching '%s'" % root) +    for directory, dirs, files in os.walk(root): +        for file in files: +            if file.endswith('.xml'): +                xml_file = os.path.join(directory,file) +                if arg.verbosity == 'verbose': +                    print("Checking '%s'" % xml_file) +                checked_files += 1 +                if not xml_is_ok(xml_file): +                    invalid_files += 1 + +if arg.verbosity != 'quiet': +    print("Checked %d files, %d errors found." % (checked_files, invalid_files)) + +sys.exit(invalid_files) + +                 | 
