TarBundle.py revision 2276
0075dcb5aeeee4864fe9f64db82c8a8202bbe6d6henning mueller#!/usr/bin/python
b0ad67a7b41855a9148f346eb5b5d2b9276796ddhenning mueller#
aead985e48027c9df1ef553b17df29dd378757aaJulian Kornberger# CDDL HEADER START
5cad3e82e8c017bc189c4cecc00541ec19a2a6e2Julian Kornberger#
9c9b4f0d0199c3b1dbff564b87435b6693b7e692Julian Kornberger# The contents of this file are subject to the terms of the
b2dbef8c73faa240d208f3ff9fb49b21d9a894a5Daniel Vale# Common Development and Distribution License (the "License").
dda6f544eb58d850394073e34ae6127498869a77Christian Clausen# You may not use this file except in compliance with the License.
b0ad67a7b41855a9148f346eb5b5d2b9276796ddhenning mueller#
b0ad67a7b41855a9148f346eb5b5d2b9276796ddhenning mueller# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b0ad67a7b41855a9148f346eb5b5d2b9276796ddhenning mueller# or http://www.opensolaris.org/os/licensing.
dda6f544eb58d850394073e34ae6127498869a77Christian Clausen# See the License for the specific language governing permissions
0075dcb5aeeee4864fe9f64db82c8a8202bbe6d6henning mueller# and limitations under the License.
cbb18f95cb8354f0c3fb44ba5134dadc7ad6b2ecJulian Kornberger#
3cd45197413df1ff1401697720f1ac9ccef8f8eehenning mueller# When distributing Covered Code, include this CDDL HEADER in each
b0ad67a7b41855a9148f346eb5b5d2b9276796ddhenning mueller# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b0ad67a7b41855a9148f346eb5b5d2b9276796ddhenning mueller# If applicable, add the following below this CDDL HEADER, with the
ecf32c9d659a1f42c730d61eaa93583c095a4fddhenning mueller# fields enclosed by brackets "[]" replaced with your own identifying
a14e1ccbd2588441fb5a59e0c82f895b5c42c298Julian Kornberger# information: Portions Copyright [yyyy] [name of copyright owner]
555b7fd96768daf9592e7ddbd4217d784b08e451henning mueller#
0772cf7b22adf46dbab68e829d6a2cd8e8d1bc2ahenning mueller# CDDL HEADER END
432ee743a5f1c5688c73446b5977b06ed97fb67cJulian Kornberger#
b9f99a06294e593ce8fb34b015e83003229db058Julian Kornberger
b3b159fb3284b66d0f8189a6a145c8163ccdae68henning mueller#
7ea9649883e1bbe8f2582db1a3c66af8b7206056henning mueller# Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
a5015ca9daa067f062e9e373c3dfafd5631560d9Julian Kornberger#
a5015ca9daa067f062e9e373c3dfafd5631560d9Julian Kornberger
631f43db46ad7d375010c3169c81764eb27270a3Julian Kornbergerimport os
631f43db46ad7d375010c3169c81764eb27270a3Julian Kornbergerimport stat
631f43db46ad7d375010c3169c81764eb27270a3Julian Kornbergerimport tarfile
631f43db46ad7d375010c3169c81764eb27270a3Julian Kornbergerimport pkg.misc as misc
631f43db46ad7d375010c3169c81764eb27270a3Julian Kornbergerfrom pkg.actions import *
ae2ba7aeef036808e81fb6449e98ce9abb0fb234Daniel Couto Vale
7dc318cbd9f8c97406b48051005f23953e9e8a25Daniel Valeclass TarBundle(object):
ae2ba7aeef036808e81fb6449e98ce9abb0fb234Daniel Couto Vale
43a0f914166a28a9d7f75ab10673dce129cb38a9Julian Kornberger def __init__(self, filename, targetpaths=()):
b0ad67a7b41855a9148f346eb5b5d2b9276796ddhenning mueller self.tf = tarfile.open(filename)
b0ad67a7b41855a9148f346eb5b5d2b9276796ddhenning mueller # XXX This could be more intelligent. Or get user input. Or
b0ad67a7b41855a9148f346eb5b5d2b9276796ddhenning mueller # extend API to take FMRI.
b0ad67a7b41855a9148f346eb5b5d2b9276796ddhenning mueller self.pkgname = os.path.basename(filename)
43a0f914166a28a9d7f75ab10673dce129cb38a9Julian Kornberger self.pkg = None
b0ad67a7b41855a9148f346eb5b5d2b9276796ddhenning mueller
b0ad67a7b41855a9148f346eb5b5d2b9276796ddhenning mueller def __del__(self):
b0ad67a7b41855a9148f346eb5b5d2b9276796ddhenning mueller self.tf.close()
b0ad67a7b41855a9148f346eb5b5d2b9276796ddhenning mueller
b0ad67a7b41855a9148f346eb5b5d2b9276796ddhenning mueller def __iter__(self):
b0ad67a7b41855a9148f346eb5b5d2b9276796ddhenning mueller for f in self.tf:
43a0f914166a28a9d7f75ab10673dce129cb38a9Julian Kornberger yield self.action(self.tf, f)
acb3db0ee20cd276e305da358a03b30666976db0Daniel Couto Vale
b0ad67a7b41855a9148f346eb5b5d2b9276796ddhenning mueller def action(self, tarfile, tarinfo):
b0ad67a7b41855a9148f346eb5b5d2b9276796ddhenning mueller if tarinfo.isreg():
8d4d8ac34f199d5c7d26694fabbfe2ab6bc0f9d9henning mueller return file.FileAction(tarfile.extractfile(tarinfo),
ecf32c9d659a1f42c730d61eaa93583c095a4fddhenning mueller mode=oct(stat.S_IMODE(tarinfo.mode)),
ecf32c9d659a1f42c730d61eaa93583c095a4fddhenning mueller owner=tarinfo.uname, group=tarinfo.gname,
ecf32c9d659a1f42c730d61eaa93583c095a4fddhenning mueller path=tarinfo.name,
ecf32c9d659a1f42c730d61eaa93583c095a4fddhenning mueller timestamp=misc.time_to_timestamp(tarinfo.mtime))
ecf32c9d659a1f42c730d61eaa93583c095a4fddhenning mueller elif tarinfo.isdir():
1b6021653a43264993b21ebb20e0119aa2fd6741henning mueller return directory.DirectoryAction(
0eae0f423c62bcc939e76f37ce7a7a9913b58422Julian Kornberger mode=oct(stat.S_IMODE(tarinfo.mode)),
0eae0f423c62bcc939e76f37ce7a7a9913b58422Julian Kornberger owner=tarinfo.uname, group=tarinfo.gname,
0eae0f423c62bcc939e76f37ce7a7a9913b58422Julian Kornberger path=tarinfo.name)
1b6021653a43264993b21ebb20e0119aa2fd6741henning mueller elif tarinfo.issym():
b0ad67a7b41855a9148f346eb5b5d2b9276796ddhenning mueller return link.LinkAction(path=tarinfo.name,
0075dcb5aeeee4864fe9f64db82c8a8202bbe6d6henning mueller target=tarinfo.linkname)
elif tarinfo.islnk():
return hardlink.HardLinkAction(path=tarinfo.name,
target=tarinfo.linkname)
else:
return unknown.UnknownAction(path=tarinfo.name)
def test(filename):
return tarfile.is_tarfile(filename)