SolarisPackageDirBundle.py revision 443
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#!/usr/bin/python2.4
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# CDDL HEADER START
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# The contents of this file are subject to the terms of the
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# Common Development and Distribution License (the "License").
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# You may not use this file except in compliance with the License.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# or http://www.opensolaris.org/os/licensing.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# See the License for the specific language governing permissions
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# and limitations under the License.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen# When distributing Covered Code, include this CDDL HEADER in each
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen# If applicable, add the following below this CDDL HEADER, with the
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen# fields enclosed by brackets "[]" replaced with your own identifying
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen# information: Portions Copyright [yyyy] [name of copyright owner]
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen#
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen# CDDL HEADER END
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen#
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen#
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen# Copyright 2008 Sun Microsystems, Inc. All rights reserved.
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen# Use is subject to license terms.
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen#
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainenimport os
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainenimport pkg.misc as misc
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainenfrom pkg.sysvpkg import SolarisPackage
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainenfrom pkg.cpiofile import CpioFile
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenfrom pkg.actions import *
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenclass SolarisPackageDirBundle(object):
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen
16f816d3f3c32ae3351834253f52ddd0212bcbf3Timo Sirainen def __init__(self, filename):
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.pkg = SolarisPackage(filename)
98c1cf256927e254f0c092acd2ddcd7ea50bd009Timo Sirainen self.pkgname = self.pkg.pkginfo["PKG"]
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.filename = filename
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen def __iter__(self):
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen faspac = []
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if "faspac" in self.pkg.pkginfo:
98c1cf256927e254f0c092acd2ddcd7ea50bd009Timo Sirainen faspac = self.pkg.pkginfo["faspac"]
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen # Want to access the manifest as a dict.
98c1cf256927e254f0c092acd2ddcd7ea50bd009Timo Sirainen pkgmap = {}
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen for p in self.pkg.manifest:
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen pkgmap[p.pathname] = p
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen def j(path):
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen return os.path.join(self.pkg.basedir, path)
7a6b45405fb1544ac476e6eb1402a70cc1ddcdcfTimo Sirainen
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen faspac_contents = set()
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen for klass in faspac:
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen cf = CpioFile.open(os.path.join(
98c1cf256927e254f0c092acd2ddcd7ea50bd009Timo Sirainen self.filename, "archive", klass + ".bz2"))
98c1cf256927e254f0c092acd2ddcd7ea50bd009Timo Sirainen for ci in cf:
f7d43647acc6dc80064c8c4cacf5bf86f754c530Timo Sirainen faspac_contents.add(j(ci.name))
98c1cf256927e254f0c092acd2ddcd7ea50bd009Timo Sirainen yield self.action(pkgmap[j(ci.name)],
98c1cf256927e254f0c092acd2ddcd7ea50bd009Timo Sirainen ci.extractfile())
98c1cf256927e254f0c092acd2ddcd7ea50bd009Timo Sirainen
98c1cf256927e254f0c092acd2ddcd7ea50bd009Timo Sirainen # Remove BASEDIR from the path. The extra work is because if
98c1cf256927e254f0c092acd2ddcd7ea50bd009Timo Sirainen # BASEDIR is not empty (non-"/"), then we probably need to strip
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen # an extra slash from the beginning of the path, but if BASEDIR
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen # is "" ("/" in the pkginfo file), then we don't need to do
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen # anything extra.
8153fdec343e40e2a78f5c12353e89b994b28f74Timo Sirainen def r(path, type):
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen if type == "i":
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen return path
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen p = path[len(self.pkg.basedir):]
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen if p[0] == "/":
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen p = p[1:]
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen return p
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen for p in self.pkg.manifest:
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen # Just do the files that remain. Only regular file
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen # types end up compressed; so skip them and only them.
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen # Files with special characters in their names may not
39775ad03c459efe64cce924658da5094ba417e1Timo Sirainen # end up in the faspac archive, so we still need to emit
39775ad03c459efe64cce924658da5094ba417e1Timo Sirainen # the ones that aren't.
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen if p.type in "fev" and p.klass in faspac and \
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen p.pathname in faspac_contents:
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen continue
39775ad03c459efe64cce924658da5094ba417e1Timo Sirainen
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen # These are the only valid file types in SysV packages
84e1634acc701d14e358e27f1beff5ad74f5004aTimo Sirainen if p.type in "fevbcdxpls":
445f9e31c6c3aa6c0a72be8565da8f6e594d24fbTimo Sirainen yield self.action(p, os.path.join(self.filename,
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen "reloc", r(p.pathname, p.type)))
39775ad03c459efe64cce924658da5094ba417e1Timo Sirainen elif p.type == "i":
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen yield self.action(p, os.path.join(self.filename,
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen "install", r(p.pathname, p.type)))
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen def action(self, mapline, data):
39775ad03c459efe64cce924658da5094ba417e1Timo Sirainen if mapline.type in "fev":
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen return file.FileAction(data, mode=mapline.mode,
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen owner=mapline.owner, group=mapline.group,
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen path=mapline.pathname,
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen timestamp=misc.time_to_timestamp(int(mapline.modtime)))
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen elif mapline.type in "dx":
9e59a1f3f095b3099478562cf3f3970a24736970Timo Sirainen return directory.DirectoryAction(mode=mapline.mode,
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen owner=mapline.owner, group=mapline.group,
178511b57faa7c3f8203dd8b7e4059d00cbfc23aTimo Sirainen path=mapline.pathname)
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen elif mapline.type == "s":
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen return link.LinkAction(path=mapline.pathname,
2e937ed8585299b2e879a28314902a5f644813d2Timo Sirainen target=mapline.target)
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen elif mapline.type == "l":
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen return hardlink.HardLinkAction(path=mapline.pathname,
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen target=mapline.target)
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen elif mapline.type == "i" and mapline.pathname == "copyright":
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen return license.LicenseAction(data,
4d25408732be27e91f0430f71e87242760c2517cTimo Sirainen license="%s.copyright" % self.pkgname,
e68309fcfa2eaa88217fd51e7b4900fc9c20ef5dTimo Sirainen path=mapline.pathname)
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen else:
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen return unknown.UnknownAction(path=mapline.pathname)
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen
e5c08648676d1989f6e70b95e5990c26b3e8b96bTimo Sirainendef test(filename):
4d25408732be27e91f0430f71e87242760c2517cTimo Sirainen if os.path.isfile(os.path.join(filename, "pkginfo")) and \
c3412ddeb9abc13f99d3caf50faf76cd99f7e9d2Timo Sirainen os.path.isfile(os.path.join(filename, "pkgmap")):
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen return True
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen return False
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen