diff -r d63a2608b656 -r 125cd5d2cd9e tools/unpack.py --- /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()