tools/unpack.py
changeset 2 125cd5d2cd9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/unpack.py	Fri May 07 13:13:04 2010 -0500
@@ -0,0 +1,144 @@
+#!/usr/bin/python2.6
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+# Copyright (c) 2010, Oracle and/or it's affiliates.  All rights reserved.
+#
+#
+# unpack.py - an archive unpack utility
+#
+#  A simple program to uncompress and unpack source archive files into a target
+#  directory and fix permissions if requested.
+#
+
+import os
+import sys
+
+def uncompress_unpack_commands(filename, verbose=False):
+	import re
+
+	uncompress = "/bin/cat"
+
+	if (re.search("(\.bz2|\.tbz|\.tbz2)$", filename) != None):
+		uncompress = "/usr/bin/bzip2 -dc"
+	elif (re.search("(\.gz|\.tgz)$", filename) != None):
+		uncompress = "/usr/bin/gzip -dc"
+	elif (re.search("(\.Z)$", filename) != None):
+		uncompress = "/usr/bin/uncompress -c"
+	elif (re.search("(\.7z)$", filename) != None):
+		uncompress = "/usr/bin/7z --s"
+	elif (re.search("(\.zip)$", filename) != None):
+		uncompress = "/usr/bin/unzip -qo"
+
+	unpack = " | gtar -xf -"
+
+	if (re.search("(\.zip)$", filename) != None):
+		unpack = ""
+	elif (re.search("(\.jar)$", filename) != None):
+		unpack = " | jar xf -"
+
+	if (verbose == True):
+		print "command: %s %s %s" % (uncompress, filename, unpack)
+
+	return uncompress, unpack
+
+#
+# recurse down a directory tree opening permissions so that others may access
+# files in the tree.
+#
+def fixup_permissions(dir, verbose):
+	for entry in os.listdir(dir):
+		import stat
+
+		path = "%s/%s" % (dir, entry)
+
+		st = os.lstat(path)
+		mode = stat.S_IMODE(st.st_mode)
+		mode |= (stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH)
+		if stat.S_ISDIR(st.st_mode):
+			mode |= (stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
+
+		if (stat.S_IMODE(st.st_mode) != mode):
+			if (verbose == True):
+				print "Changing %s from %4.4o to %4.4o" % (path,
+						stat.S_IMODE(st.st_mode), mode)
+			os.chmod(path, mode)
+
+		if stat.S_ISDIR(st.st_mode):
+			fixup_permissions(path, verbose)
+
+
+def usage():
+	print "Usage: %s [-v|--verbose] [-f|--fix-permissions] [-r|--relocate-to (dir)] (file)" % (sys.argv[0].split('/')[-1])
+	sys.exit(1)
+
+def main():
+	import getopt
+	import sys
+	import tempfile
+
+	verbose = False
+	permissions = None
+	relocate_to = None
+
+	try:
+		opts, args = getopt.getopt(sys.argv[1:], "fr:v",
+			["fix-permissions", "relocate-to=", "verbose"])
+	except getopt.GetoptError, err:
+		print str(err)
+		usage()
+
+	for opt, arg in opts:
+		if opt in [ "-v", "--verbose" ]:
+			verbose = True
+		elif opt in [ "-f", "--fix-permissions" ]:
+			permissions = True
+		elif opt in [ "-r", "--relocate-to" ]:
+			relocate_to = arg
+		else:
+			assert False, "unknown option"
+
+	filename = ((args[0] == '/') and "%s" or "../%s") % args[0]
+	uncompress, unpack = uncompress_unpack_commands(filename)
+	tempdir = tempfile.mkdtemp(dir='.')
+
+	# extract the archive contents
+	if (verbose == True):	
+		print "cd %s ; %s %s%s" % (tempdir, uncompress, filename,
+						unpack)
+	os.system("cd %s ; %s %s%s" % (tempdir, uncompress, filename, unpack))
+
+	# open up the permissions on what we extracted
+	if permissions:
+		fixup_permissions(tempdir, verbose)
+
+	if (relocate_to == None):
+		# move everything in the tempdir here
+		for entry in os.listdir(tempdir):
+			path= "%s/%s" % (tempdir, entry)
+			os.renames(path, entry)
+	else:
+		# rename the tempdir and open it's permissions
+		os.renames(tempdir, relocate_to)
+		os.chmod(relocate_to, 0755)
+
+
+if __name__ == "__main__":
+	main()