pkgplan.py revision 235
#
# 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
# 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 2007 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
import errno
import itertools
import os
"""A package plan takes two package FMRIs and an Image, and produces the
set of actions required to take the Image from the origin FMRI to the
destination FMRI.
If the destination FMRI is None, the package is removed.
"""
self.origin_fmri = None
self.destination_fmri = None
return s
raise RuntimeError, "already installed"
raise RuntimeError, "not installed"
if self.origin_fmri == None:
return True
return False
return False
return True
def get_actions(self):
raise NotImplementedError()
def get_nactions(self):
"""Determine the actions required to transition the package."""
# if origin unset, determine if we're dealing with an previously
# installed version or if we're dealing with the null package
#
# XXX Perhaps make the pkgplan creator make this explicit, so we
# don't have to check?
f = None
if not self.origin_fmri:
try:
self.origin_fmri = f
except LookupError:
pass
# Try to load the filter used for the last install of the
# package.
self.origin_filters = []
if self.origin_fmri:
try:
except IOError, e:
raise
else:
self.origin_filters = [
for l in f.readlines()
]
# Assume that origin actions are unique, but make sure that
# destination ones are.
if ddups:
def get_xferstats(self):
if nf > 0:
return True
else:
return False
def get_xfername(self):
if self.destination_fmri:
if self.origin_fmri:
return None
def preexecute(self):
"""Perform actions required prior to installation or removal of a package.
This method executes each action's preremove() or preinstall()
methods, as well as any package-wide steps that need to be taken
at such a time.
"""
flist = None
if flist_supported:
# retrieval step
if self.destination_fmri == None:
try:
except OSError, e:
raise
if dest:
else:
try:
except filelist.FileListException:
flist = None
continue
flist = None
if flist is None:
# Get any remaining files
if flist:
try:
except filelist.FileListException:
pass
flist = None
if flist_supported:
"""Perform actions for installation or removal of a package.
This method executes each action's remove() or install()
methods.
"""
# record that we are in an intermediate state
# It might be nice to have a single action.execute() method, but
# I can't think of an example where it would make especially
# good sense (i.e., where "remove" is as similar to "upgrade" as
# is "install"). We could accomplish this by having a
# NoneAction, whose execute() method would call the remove()
# method of the passed-in src action.
# Execute installs
try:
except Exception, e:
print "Action install failed for '%s' (%s):\n %s: %s" % \
raise
# Execute updates
try:
except Exception, e:
print "Action upgrade failed for '%s' (%s):\n %s: %s" % \
raise
# Execute removals
try:
except Exception, e:
print "Action removal failed for '%s' (%s):\n %s: %s" % \
raise
def postexecute(self):
"""Perform actions required after installation or removal of a package.
This method executes each action's postremove() or postinstall()
methods, as well as any package-wide steps that need to be taken
at such a time.
"""
# record that package states are consistent
if dest:
else:
# In the case of an upgrade, remove the installation turds from
# the origin's directory.
# XXX should this just go in preexecute?
try:
except OSError, e:
raise
if self.destination_fmri != None:
# Save the filters we used to install the package, so
# they can be referenced later.
f.writelines([
filter + "\n"
])
f.close()