From 136a925536dc55749de665424469d2111b14ba63 Mon Sep 17 00:00:00 2001
From: Oz Linden <oz@lindenlab.com>
Date: Thu, 2 Apr 2015 16:01:17 -0400
Subject: add script to check xml files written by the viewer

---
 scripts/check-viewer-xml | 102 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 102 insertions(+)
 create mode 100755 scripts/check-viewer-xml

(limited to 'scripts')

diff --git a/scripts/check-viewer-xml b/scripts/check-viewer-xml
new file mode 100755
index 0000000000..27c1112492
--- /dev/null
+++ b/scripts/check-viewer-xml
@@ -0,0 +1,102 @@
+#!/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':  
+    CheckDirs = [ os.path.expanduser('~\\Local Settings\\Temp'),
+                  os.path.expanduser('~\\Application\\Data\\Secondlife'),
+                  os.path.expanduser('~\\AppData\\Roaming\\Secondlife'),
+                  os.path.expanduser('~\\AppData\\Local\\Secondlife'),
+                  ]
+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)
+
+                
-- 
cgit v1.2.3