summaryrefslogtreecommitdiff
path: root/scripts/template_verifier.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/template_verifier.py')
-rwxr-xr-xscripts/template_verifier.py77
1 files changed, 48 insertions, 29 deletions
diff --git a/scripts/template_verifier.py b/scripts/template_verifier.py
index 8bb5e1d76d..b44410cdd8 100755
--- a/scripts/template_verifier.py
+++ b/scripts/template_verifier.py
@@ -1,33 +1,27 @@
-#!/usr/bin/python
+#!/usr/bin/env python
"""\
@file template_verifier.py
@brief Message template compatibility verifier.
-$LicenseInfo:firstyear=2007&license=viewergpl$
+$LicenseInfo:firstyear=2007&license=viewerlgpl$
+Second Life Viewer Source Code
+Copyright (C) 2010, Linden Research, Inc.
-Copyright (c) 2007-2009, Linden Research, Inc.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation;
+version 2.1 of the License only.
-Second Life Viewer Source Code
-The source code in this file ("Source Code") is provided by Linden Lab
-to you under the terms of the GNU General Public License, version 2.0
-("GPL"), unless you have obtained a separate licensing agreement
-("Other License"), formally executed by you and Linden Lab. Terms of
-the GPL can be found in doc/GPL-license.txt in this distribution, or
-online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
-
-There are special exceptions to the terms and conditions of the GPL as
-it is applied to this Source Code. View the full text of the exception
-in the file doc/FLOSS-exception.txt in this software distribution, or
-online at
-http://secondlifegrid.net/programs/open_source/licensing/flossexception
-
-By copying, modifying or distributing this software, you acknowledge
-that you have read and understood your obligations described above,
-and agree to abide by those obligations.
-
-ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
-WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
-COMPLETENESS OR PERFORMANCE.
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
$/LicenseInfo$
"""
@@ -72,6 +66,7 @@ add_indra_lib_path()
import optparse
import os
import urllib
+import hashlib
from indra.ipc import compatibility
from indra.ipc import tokenstream
@@ -103,7 +98,7 @@ MESSAGE_TEMPLATE = 'message_template.msg'
PRODUCTION_ACCEPTABLE = (compatibility.Same, compatibility.Newer)
DEVELOPMENT_ACCEPTABLE = (
compatibility.Same, compatibility.Newer,
- compatibility.Older, compatibility.Mixed)
+ compatibility.Older, compatibility.Mixed)
MAX_MASTER_AGE = 60 * 60 * 4 # refresh master cache every 4 hours
@@ -203,8 +198,13 @@ def getuser():
import getpass
return getpass.getuser()
except ImportError:
- import win32api
- return win32api.GetUserName()
+ import ctypes
+ MAX_PATH = 260 # according to a recent WinDef.h
+ name = ctypes.create_unicode_buffer(MAX_PATH)
+ namelen = ctypes.c_int(len(name)) # len in chars, NOT bytes
+ if not ctypes.windll.advapi32.GetUserNameW(name, ctypes.byref(namelen)):
+ raise ctypes.WinError()
+ return name.value
def local_master_cache_filename():
"""Returns the location of the master template cache (which is in the system tempdir)
@@ -229,11 +229,14 @@ http://wiki.secondlife.com/wiki/Template_verifier.py
""")
parser.add_option(
'-u', '--master_url', type='string', dest='master_url',
- default='http://secondlife.com/app/message_template/master_message_template.msg',
+ default='http://bitbucket.org/lindenlab/master-message-template/raw/tip/message_template.msg',
help="""The url of the master message template.""")
parser.add_option(
'-c', '--cache_master', action='store_true', dest='cache_master',
default=False, help="""Set to true to attempt use local cached copy of the master template.""")
+ parser.add_option(
+ '-f', '--force', action='store_true', dest='force_verification',
+ default=False, help="""Set to true to skip the sha_1 check and force template verification.""")
options, args = parser.parse_args(sysargs)
@@ -270,8 +273,18 @@ http://wiki.secondlife.com/wiki/Template_verifier.py
print "current:", current_filename
current_url = 'file://%s' % current_filename
- # retrieve the contents of the local template and check for syntax
+ # retrieve the contents of the local template
current = fetch(current_url)
+ hexdigest = hashlib.sha1(current).hexdigest()
+ if not options.force_verification:
+ # Early exist if the template hasn't changed.
+ sha_url = "%s.sha1" % current_url
+ current_sha = fetch(sha_url)
+ if hexdigest == current_sha:
+ print "Message template SHA_1 has not changed."
+ sys.exit(0)
+
+ # and check for syntax
current_parsed = llmessage.parseTemplateString(current)
if options.cache_master:
@@ -302,6 +315,12 @@ http://wiki.secondlife.com/wiki/Template_verifier.py
if acceptable:
explain("--- PASS ---", compat)
+ if options.force_verification == False:
+ print "Updating sha1 to %s" % hexdigest
+ sha_filename = "%s.sha1" % current_filename
+ sha_file = open(sha_filename, 'w')
+ sha_file.write(hexdigest)
+ sha_file.close()
else:
explain("*** FAIL ***", compat)
return 1