userland-unpack revision 3293
6a01f2d5ec2024b68edd1d42056b41a88dc0a935aaron#!/usr/bin/python2.6
7a95e47ff0d0e4306df0901d56131b49dca5691etrawick#
62af8654f682ca4913636bae099bec0befab985ctrawick# CDDL HEADER START
62af8654f682ca4913636bae099bec0befab985ctrawick#
62af8654f682ca4913636bae099bec0befab985ctrawick# The contents of this file are subject to the terms of the
62af8654f682ca4913636bae099bec0befab985ctrawick# Common Development and Distribution License (the "License").
1e557a77c091a1d2f2872872a7c20e9f2ffccbc1aaron# You may not use this file except in compliance with the License.
1e557a77c091a1d2f2872872a7c20e9f2ffccbc1aaron#
1e557a77c091a1d2f2872872a7c20e9f2ffccbc1aaron# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
1e557a77c091a1d2f2872872a7c20e9f2ffccbc1aaron# or http://www.opensolaris.org/os/licensing.
5e98e52df07f59be456af01ebf46d81defef2385trawick# See the License for the specific language governing permissions
5e98e52df07f59be456af01ebf46d81defef2385trawick# and limitations under the License.
5e98e52df07f59be456af01ebf46d81defef2385trawick#
5e98e52df07f59be456af01ebf46d81defef2385trawick# When distributing Covered Code, include this CDDL HEADER in each
7a95e47ff0d0e4306df0901d56131b49dca5691etrawick# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
7a95e47ff0d0e4306df0901d56131b49dca5691etrawick# If applicable, add the following below this CDDL HEADER, with the
1e557a77c091a1d2f2872872a7c20e9f2ffccbc1aaron# fields enclosed by brackets "[]" replaced with your own identifying
7a95e47ff0d0e4306df0901d56131b49dca5691etrawick# information: Portions Copyright [yyyy] [name of copyright owner]
b393bdb2e1eabbe4b9b37c5eaeeeca799b2eb324stoddard#
b393bdb2e1eabbe4b9b37c5eaeeeca799b2eb324stoddard# CDDL HEADER END
b393bdb2e1eabbe4b9b37c5eaeeeca799b2eb324stoddard#
6f912b4ad14f622aa8d57f887c8c745e13ff6dbfjerenkrantz# Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe#
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe#
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe# unpack.py - an archive unpack utility
3cd826b00280881e5a2f03d8ec1f8d55802b93dewrowe#
435c423bdcfa61ff871a9e289d1140f2bac839b8brianp# A simple program to uncompress and unpack source archive files into a target
435c423bdcfa61ff871a9e289d1140f2bac839b8brianp# directory and fix permissions if requested.
435c423bdcfa61ff871a9e289d1140f2bac839b8brianp#
435c423bdcfa61ff871a9e289d1140f2bac839b8brianp
bf9e1eb04f8b0af835d15ac1d0ebcd8a154474cfjerenkrantzimport os
e93cea6246ce30bf9791530a15c56f9e2eecf9cbianhimport sys
e93cea6246ce30bf9791530a15c56f9e2eecf9cbianh
f65342c1467751310036d4f9d75f554eaaf01cc6wrowedef uncompress_unpack_commands(filename, verbose=False):
f65342c1467751310036d4f9d75f554eaaf01cc6wrowe import re
960eba6c6d512880c3ed0516f5d15c6e7bc7581ajerenkrantz
960eba6c6d512880c3ed0516f5d15c6e7bc7581ajerenkrantz uncompress = "/bin/cat"
960eba6c6d512880c3ed0516f5d15c6e7bc7581ajerenkrantz
45613d36b9466a48def0498cffa07f48980720f8jerenkrantz if (re.search("(\.bz2|\.tbz|\.tbz2)$", filename) != None):
45613d36b9466a48def0498cffa07f48980720f8jerenkrantz uncompress = "/usr/bin/bzip2 -dc"
45613d36b9466a48def0498cffa07f48980720f8jerenkrantz elif (re.search("(\.gz|\.tgz)$", filename) != None):
6f912b4ad14f622aa8d57f887c8c745e13ff6dbfjerenkrantz uncompress = "/usr/bin/gzip -dc"
6f912b4ad14f622aa8d57f887c8c745e13ff6dbfjerenkrantz elif (re.search("(\.Z)$", filename) != None):
1abe6003aeb198cc97263503bceed457a6c2cb4aaaron uncompress = "/usr/bin/uncompress -c"
1abe6003aeb198cc97263503bceed457a6c2cb4aaaron elif (re.search("(\.7z)$", filename) != None):
1abe6003aeb198cc97263503bceed457a6c2cb4aaaron uncompress = "/usr/bin/7z --s"
cbd8d35ca8d9780f1081f30ebfe4abda44cab7ebianh elif (re.search("(\.xz)$", filename) != None):
cbd8d35ca8d9780f1081f30ebfe4abda44cab7ebianh uncompress = "/usr/bin/xz -dc"
cbd8d35ca8d9780f1081f30ebfe4abda44cab7ebianh elif (re.search("(\.zip)$", filename) != None):
cbd8d35ca8d9780f1081f30ebfe4abda44cab7ebianh uncompress = "/usr/bin/unzip -qo"
cbd8d35ca8d9780f1081f30ebfe4abda44cab7ebianh elif (re.search("(\.gem)$", filename) != None):
cbd8d35ca8d9780f1081f30ebfe4abda44cab7ebianh uncompress = "/usr/bin/gem unpack"
0dc14774d2c21baf6123fcafdb853af5be1d97edwrowe
3ad5a1fa75e728431fa7b8e3d8a74bcadcd79d4dlars unpack = " | gtar -xf -"
3ad5a1fa75e728431fa7b8e3d8a74bcadcd79d4dlars
3ad5a1fa75e728431fa7b8e3d8a74bcadcd79d4dlars if (re.search("(\.zip)$", filename) != None):
3fde4c273ea649d1320ec9c51e7d096cd9340a94jerenkrantz unpack = ""
3fde4c273ea649d1320ec9c51e7d096cd9340a94jerenkrantz elif (re.search("(\.jar)$", filename) != None):
3fde4c273ea649d1320ec9c51e7d096cd9340a94jerenkrantz unpack = " | jar xf -"
75eee56d2eaac9c27d32fc46b90bb6b1eac85359trawick elif (re.search("(\.gem)$", filename) != None):
75eee56d2eaac9c27d32fc46b90bb6b1eac85359trawick unpack = ""
0dc14774d2c21baf6123fcafdb853af5be1d97edwrowe
0dc14774d2c21baf6123fcafdb853af5be1d97edwrowe if (verbose == True):
741a54303329728b27fe347447a362e1c576135etrawick print "command: %s %s %s" % (uncompress, filename, unpack)
0dc14774d2c21baf6123fcafdb853af5be1d97edwrowe
9f62694a8b4e2b88994a14555d144b3836b311cfstoddard return uncompress, unpack
9f62694a8b4e2b88994a14555d144b3836b311cfstoddard
9f62694a8b4e2b88994a14555d144b3836b311cfstoddard#
9f62694a8b4e2b88994a14555d144b3836b311cfstoddard# recurse down a directory tree opening permissions so that others may access
52489511342e4ff3fe399e57f29d38e5c4227bc8trawick# files in the tree.
52489511342e4ff3fe399e57f29d38e5c4227bc8trawick#
52489511342e4ff3fe399e57f29d38e5c4227bc8trawickdef fixup_permissions(dir, verbose):
52489511342e4ff3fe399e57f29d38e5c4227bc8trawick for entry in os.listdir(dir):
8864d6f5f4744b5d2b638e2a53e2660bcf8b5ab5dougm import stat
8864d6f5f4744b5d2b638e2a53e2660bcf8b5ab5dougm
8864d6f5f4744b5d2b638e2a53e2660bcf8b5ab5dougm path = "%s/%s" % (dir, entry)
ea512a4af20e6b6e6931de4929d54d93f03a0139ianh
1e83c8de3aa48b316b28057d53995272baf1260cwrowe st = os.lstat(path)
1dfb5e008f35ed13c343b7f6306675e33c399792gstein mode = stat.S_IMODE(st.st_mode)
1dfb5e008f35ed13c343b7f6306675e33c399792gstein mode |= (stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH)
1dfb5e008f35ed13c343b7f6306675e33c399792gstein if stat.S_ISDIR(st.st_mode):
1dfb5e008f35ed13c343b7f6306675e33c399792gstein mode |= (stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
eadb64379834961679105b7fd4178253fbb9f95dtrawick
eadb64379834961679105b7fd4178253fbb9f95dtrawick if (stat.S_IMODE(st.st_mode) != mode):
eadb64379834961679105b7fd4178253fbb9f95dtrawick if (verbose == True):
eadb64379834961679105b7fd4178253fbb9f95dtrawick print "Changing %s from %4.4o to %4.4o" % (path,
eadb64379834961679105b7fd4178253fbb9f95dtrawick stat.S_IMODE(st.st_mode), mode)
c7e917aa56886c47bfe061c5e9f603a5aaef0d87trawick os.chmod(path, mode)
c7e917aa56886c47bfe061c5e9f603a5aaef0d87trawick
c7e917aa56886c47bfe061c5e9f603a5aaef0d87trawick if stat.S_ISDIR(st.st_mode):
b8daf4c5ea3d5bb2111b1b021de6d3cd891e403bcoar fixup_permissions(path, verbose)
b8daf4c5ea3d5bb2111b1b021de6d3cd891e403bcoar
b8daf4c5ea3d5bb2111b1b021de6d3cd891e403bcoar
b8daf4c5ea3d5bb2111b1b021de6d3cd891e403bcoardef usage():
b8daf4c5ea3d5bb2111b1b021de6d3cd891e403bcoar print "Usage: %s [-v|--verbose] [-f|--fix-permissions] [-r|--relocate-to (dir)] (file)" % (sys.argv[0].split('/')[-1])
6b6083e6518007139257ee449c2af3032d2437d0trawick sys.exit(1)
6b6083e6518007139257ee449c2af3032d2437d0trawick
6b6083e6518007139257ee449c2af3032d2437d0trawickdef main():
88dd056b9863502bba82c2889a0c4cde9fc0ba93trawick import getopt
88dd056b9863502bba82c2889a0c4cde9fc0ba93trawick import sys
88dd056b9863502bba82c2889a0c4cde9fc0ba93trawick import tempfile
88dd056b9863502bba82c2889a0c4cde9fc0ba93trawick
7ef3a1797818c6d25efe8c5fadb5eec3b965a6fabrianp verbose = False
7ef3a1797818c6d25efe8c5fadb5eec3b965a6fabrianp permissions = None
7ef3a1797818c6d25efe8c5fadb5eec3b965a6fabrianp relocate_to = None
1e83c8de3aa48b316b28057d53995272baf1260cwrowe
1e83c8de3aa48b316b28057d53995272baf1260cwrowe try:
1e83c8de3aa48b316b28057d53995272baf1260cwrowe opts, args = getopt.getopt(sys.argv[1:], "fr:v",
1e83c8de3aa48b316b28057d53995272baf1260cwrowe ["fix-permissions", "relocate-to=", "verbose"])
1e83c8de3aa48b316b28057d53995272baf1260cwrowe except getopt.GetoptError, err:
1e83c8de3aa48b316b28057d53995272baf1260cwrowe print str(err)
1e83c8de3aa48b316b28057d53995272baf1260cwrowe usage()
1e83c8de3aa48b316b28057d53995272baf1260cwrowe
1e83c8de3aa48b316b28057d53995272baf1260cwrowe for opt, arg in opts:
1e83c8de3aa48b316b28057d53995272baf1260cwrowe if opt in [ "-v", "--verbose" ]:
7f683bb300df767164724ebc664f339ac396b434dougm verbose = True
7f683bb300df767164724ebc664f339ac396b434dougm elif opt in [ "-f", "--fix-permissions" ]:
7f683bb300df767164724ebc664f339ac396b434dougm permissions = True
7f683bb300df767164724ebc664f339ac396b434dougm elif opt in [ "-r", "--relocate-to" ]:
7f683bb300df767164724ebc664f339ac396b434dougm relocate_to = arg
7f683bb300df767164724ebc664f339ac396b434dougm else:
7f683bb300df767164724ebc664f339ac396b434dougm assert False, "unknown option"
26dfa083a1662d57ba7cc410eec4e0696b9be469wrowe
26dfa083a1662d57ba7cc410eec4e0696b9be469wrowe filename = ((args[0] == '/') and "%s" or "../%s") % args[0]
26dfa083a1662d57ba7cc410eec4e0696b9be469wrowe uncompress, unpack = uncompress_unpack_commands(filename)
26dfa083a1662d57ba7cc410eec4e0696b9be469wrowe tempdir = tempfile.mkdtemp(dir='.')
4760aa1f19600972cf531ad7da73c1ee5a0225cedougm
4760aa1f19600972cf531ad7da73c1ee5a0225cedougm # extract the archive contents
87a1c79b7b37702a254920ca5214fb282a4fb085dougm if (verbose == True):
994c3fbc3335e8fe883b1ce4515efc0c85061cdfaaron print "cd %s ; %s %s%s" % (tempdir, uncompress, filename,
d5d164b22a2004abed640cb52fc275f00ed92f69jerenkrantz unpack)
e93d563852e1fa7a8c73af3b807916b41942d2f6dreid os.system("cd %s ; %s %s%s" % (tempdir, uncompress, filename, unpack))
e93d563852e1fa7a8c73af3b807916b41942d2f6dreid
e93d563852e1fa7a8c73af3b807916b41942d2f6dreid # open up the permissions on what we extracted
e93d563852e1fa7a8c73af3b807916b41942d2f6dreid if permissions:
e93d563852e1fa7a8c73af3b807916b41942d2f6dreid fixup_permissions(tempdir, verbose)
525508562a53864b78cf8da91ac13be9c072bba7jerenkrantz
525508562a53864b78cf8da91ac13be9c072bba7jerenkrantz if (relocate_to == None):
525508562a53864b78cf8da91ac13be9c072bba7jerenkrantz # move everything in the tempdir here
f1fe10268cdadb775eef841aa4fa7305291d35fdtrawick for entry in os.listdir(tempdir):
f1fe10268cdadb775eef841aa4fa7305291d35fdtrawick path= "%s/%s" % (tempdir, entry)
f1fe10268cdadb775eef841aa4fa7305291d35fdtrawick os.renames(path, entry)
f1fe10268cdadb775eef841aa4fa7305291d35fdtrawick else:
f04ad0ba7fe0eea5ea7a92f852cef75747ab2090trawick # rename the tempdir and open it's permissions
f04ad0ba7fe0eea5ea7a92f852cef75747ab2090trawick os.renames(tempdir, relocate_to)
f04ad0ba7fe0eea5ea7a92f852cef75747ab2090trawick os.chmod(relocate_to, 0755)
65a1588701f9e5d0f62261d0da85733a23edc92ftrawick
65a1588701f9e5d0f62261d0da85733a23edc92ftrawick
65a1588701f9e5d0f62261d0da85733a23edc92ftrawickif __name__ == "__main__":
65a1588701f9e5d0f62261d0da85733a23edc92ftrawick main()
65a1588701f9e5d0f62261d0da85733a23edc92ftrawick