src/modules/client/image.py
author Brock Pytlik <brock.pytlik@oracle.com>
Thu, 05 May 2011 11:56:47 -0700
changeset 2331 cc898866d552
parent 2330 9451b3f28f4c
child 2335 33734ca16f74
permissions -rw-r--r--
18257 signed packages with variants fail pkg verify
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1516
8c950a3b4171 10485 move pkg(5) to Python 2.6
Rich Burridge <rich.burridge@sun.com>
parents: 1507
diff changeset
     1
#!/usr/bin/python
19
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
     2
#
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
     3
# CDDL HEADER START
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
     4
#
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
     5
# The contents of this file are subject to the terms of the
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
     6
# Common Development and Distribution License (the "License").
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
     7
# You may not use this file except in compliance with the License.
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
     8
#
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
     9
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    10
# or http://www.opensolaris.org/os/licensing.
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    11
# See the License for the specific language governing permissions
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    12
# and limitations under the License.
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    13
#
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    14
# When distributing Covered Code, include this CDDL HEADER in each
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    15
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    16
# If applicable, add the following below this CDDL HEADER, with the
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    17
# fields enclosed by brackets "[]" replaced with your own identifying
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    18
# information: Portions Copyright [yyyy] [name of copyright owner]
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    19
#
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    20
# CDDL HEADER END
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    21
#
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    22
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
    23
#
2183
21ae45e8dfcf 17581 There should be a way of removing a package as part of upgrade
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2178
diff changeset
    24
# Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
    25
#
19
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    26
1771
0965309e1d22 14654 temporary download directory is created regardless of use and never removed
Danek Duvall <danek.duvall@sun.com>
parents: 1755
diff changeset
    27
import atexit
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
    28
import copy
1549
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
    29
import datetime
161
e0322fe7842c Simplify and correct the package matching code.
Danek Duvall <danek.duvall@sun.com>
parents: 157
diff changeset
    30
import errno
26
ab188d4682d5 catalog processing begins
"Stephen Hahn <sch@sun.com>"
parents: 22
diff changeset
    31
import os
838
aafbe4737188 3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 835
diff changeset
    32
import platform
aafbe4737188 3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 835
diff changeset
    33
import shutil
1859
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
    34
import stat
838
aafbe4737188 3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 835
diff changeset
    35
import tempfile
aafbe4737188 3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 835
diff changeset
    36
import time
45
8a3f00dea14f catalog refresh; basic catalog listing; precise manifest pulls
Stephen Hahn <sch@sun.com>
parents: 39
diff changeset
    37
import urllib
479
de75c17238ff 2951 Client should check if its SSL certificates have expired
johansen <johansen@sun.com>
parents: 462
diff changeset
    38
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
    39
from contextlib import contextmanager
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
    40
from pkg.client import global_settings
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
    41
logger = global_settings.logger
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
    42
1755
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1736
diff changeset
    43
import pkg.actions
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
    44
import pkg.catalog
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
    45
import pkg.client.api_errors            as apx
2135
6eeb55920e13 3419 history command -- ability to specify dates or date ranges desired
Tim Foster <tim.s.foster@oracle.com>
parents: 2105
diff changeset
    46
import pkg.client.bootenv               as bootenv
1191
a48bee2a4b2e 305 http_proxy value needs more checking for valid url syntax
johansen <johansen@sun.com>
parents: 1158
diff changeset
    47
import pkg.client.history               as history
a48bee2a4b2e 305 http_proxy value needs more checking for valid url syntax
johansen <johansen@sun.com>
parents: 1158
diff changeset
    48
import pkg.client.imageconfig           as imageconfig
a48bee2a4b2e 305 http_proxy value needs more checking for valid url syntax
johansen <johansen@sun.com>
parents: 1158
diff changeset
    49
import pkg.client.imageplan             as imageplan
a48bee2a4b2e 305 http_proxy value needs more checking for valid url syntax
johansen <johansen@sun.com>
parents: 1158
diff changeset
    50
import pkg.client.pkgplan               as pkgplan
a48bee2a4b2e 305 http_proxy value needs more checking for valid url syntax
johansen <johansen@sun.com>
parents: 1158
diff changeset
    51
import pkg.client.progress              as progress
a48bee2a4b2e 305 http_proxy value needs more checking for valid url syntax
johansen <johansen@sun.com>
parents: 1158
diff changeset
    52
import pkg.client.publisher             as publisher
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
    53
import pkg.client.sigpolicy             as sigpolicy
1977
1e2b423ee045 16565 transport module init exposes latent bug in packagemanager
johansen <johansen@opensolaris.org>
parents: 1974
diff changeset
    54
import pkg.client.transport.transport   as transport
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
    55
import pkg.config                       as cfg
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 302
diff changeset
    56
import pkg.fmri
2043
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
    57
import pkg.lockfile                     as lockfile
1191
a48bee2a4b2e 305 http_proxy value needs more checking for valid url syntax
johansen <johansen@sun.com>
parents: 1158
diff changeset
    58
import pkg.manifest                     as manifest
a48bee2a4b2e 305 http_proxy value needs more checking for valid url syntax
johansen <johansen@sun.com>
parents: 1158
diff changeset
    59
import pkg.misc                         as misc
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
    60
import pkg.nrlock
1191
a48bee2a4b2e 305 http_proxy value needs more checking for valid url syntax
johansen <johansen@sun.com>
parents: 1158
diff changeset
    61
import pkg.portable                     as portable
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
    62
import pkg.server.catalog
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
    63
import pkg.smf                          as smf
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
    64
import pkg.pkgsubprocess                as subprocess
539
7486304966c5 1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents: 537
diff changeset
    65
import pkg.version
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
    66
import M2Crypto as m2
2228
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
    67
import simplejson as json
104
ecfc64baf22e add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents: 87
diff changeset
    68
1328
5c3747a4fe0a 9387 pkg fix should honor reboot-needed flag
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1288
diff changeset
    69
from pkg.client.debugvalues import DebugValues
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
    70
from pkg.client.imagetypes import IMG_USER, IMG_ENTIRE
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
    71
from pkg.misc import EmptyI, EmptyDict
19
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    72
26
ab188d4682d5 catalog processing begins
"Stephen Hahn <sch@sun.com>"
parents: 22
diff changeset
    73
img_user_prefix = ".org.opensolaris,pkg"
30
f06ad6cb4b3f stop using flavour terminology
Stephen Hahn <sch@sun.com>
parents: 29
diff changeset
    74
img_root_prefix = "var/pkg"
26
ab188d4682d5 catalog processing begins
"Stephen Hahn <sch@sun.com>"
parents: 22
diff changeset
    75
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
    76
IMG_PUB_DIR = "publisher"
419
a38f1ed7cf76 1867 'pkg list' takes *WAY* too long
Danek Duvall <danek.duvall@sun.com>
parents: 418
diff changeset
    77
19
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    78
class Image(object):
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    79
        """An Image object is a directory tree containing the laid-down contents
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    80
        of a self-consistent graph of Packages.
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    81
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    82
        An Image has a root path.
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    83
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    84
        An Image of type IMG_ENTIRE does not have a parent Image.  Other Image
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    85
        types must have a parent Image.  The external state of the parent Image
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    86
        must be accessible from the Image's context, or duplicated within the
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    87
        Image (IMG_PARTIAL for zones, for instance).
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    88
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    89
        The parent of a user Image can be a partial Image.  The parent of a
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    90
        partial Image must be an entire Image.
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    91
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    92
        An Image of type IMG_USER stores its external state at self.root +
26
ab188d4682d5 catalog processing begins
"Stephen Hahn <sch@sun.com>"
parents: 22
diff changeset
    93
        ".org.opensolaris,pkg".
19
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    94
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    95
        An Image of type IMG_ENTIRE or IMG_PARTIAL stores its external state at
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    96
        self.root + "/var/pkg".
c5d16aa074bf begin comments on Image object
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    97
26
ab188d4682d5 catalog processing begins
"Stephen Hahn <sch@sun.com>"
parents: 22
diff changeset
    98
        An Image needs to be able to have a different repository set than the
ab188d4682d5 catalog processing begins
"Stephen Hahn <sch@sun.com>"
parents: 22
diff changeset
    99
        system's root Image.
ab188d4682d5 catalog processing begins
"Stephen Hahn <sch@sun.com>"
parents: 22
diff changeset
   100
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   101
        For image format details, see section 5.3 of doc/on-disk-format.txt
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   102
        in the pkg(5) gate.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   103
        """
26
ab188d4682d5 catalog processing begins
"Stephen Hahn <sch@sun.com>"
parents: 22
diff changeset
   104
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   105
        # Class constants
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   106
        CURRENT_VERSION = 4
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   107
        IMG_CATALOG_KNOWN = "known"
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   108
        IMG_CATALOG_INSTALLED = "installed"
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   109
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
   110
        # This is a transitory state used for temporary package sources to
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
   111
        # indicate that the package entry should be removed if it does not
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
   112
        # also have PKG_STATE_INSTALLED.  This state must not be written
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
   113
        # to disk.
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
   114
        PKG_STATE_ALT_SOURCE = 99
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
   115
1369
e86145680c34 11359 catalog should offer lazy-load mechanism for action metadata
Shawn Walker <srw@sun.com>
parents: 1358
diff changeset
   116
        # Please note that the values of these PKG_STATE constants should not
e86145680c34 11359 catalog should offer lazy-load mechanism for action metadata
Shawn Walker <srw@sun.com>
parents: 1358
diff changeset
   117
        # be changed as it would invalidate existing catalog data stored in the
e86145680c34 11359 catalog should offer lazy-load mechanism for action metadata
Shawn Walker <srw@sun.com>
parents: 1358
diff changeset
   118
        # image.  This means that if a constant is removed, the values of the
e86145680c34 11359 catalog should offer lazy-load mechanism for action metadata
Shawn Walker <srw@sun.com>
parents: 1358
diff changeset
   119
        # other constants should not change, etc.
e86145680c34 11359 catalog should offer lazy-load mechanism for action metadata
Shawn Walker <srw@sun.com>
parents: 1358
diff changeset
   120
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   121
        # This state indicates that a package is present in a repository
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   122
        # catalog.
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   123
        PKG_STATE_KNOWN = 0
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   124
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   125
        # This is a transitory state used to indicate that a package is no
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   126
        # longer present in a repository catalog; it is only used to clear
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   127
        # PKG_STATE_KNOWN.
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   128
        PKG_STATE_UNKNOWN = 1
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   129
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   130
        # This state indicates that a package is installed.
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   131
        PKG_STATE_INSTALLED = 2
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   132
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   133
        # This is a transitory state used to indicate that a package is no
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   134
        # longer installed; it is only used to clear PKG_STATE_INSTALLED.
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   135
        PKG_STATE_UNINSTALLED = 3
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   136
        PKG_STATE_UPGRADABLE = 4
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   137
1369
e86145680c34 11359 catalog should offer lazy-load mechanism for action metadata
Shawn Walker <srw@sun.com>
parents: 1358
diff changeset
   138
        # These states are used to indicate the package's related catalog
e86145680c34 11359 catalog should offer lazy-load mechanism for action metadata
Shawn Walker <srw@sun.com>
parents: 1358
diff changeset
   139
        # version.  This is helpful to consumers of the catalog data so that
e86145680c34 11359 catalog should offer lazy-load mechanism for action metadata
Shawn Walker <srw@sun.com>
parents: 1358
diff changeset
   140
        # they can be aware of what metadata may not immediately available
e86145680c34 11359 catalog should offer lazy-load mechanism for action metadata
Shawn Walker <srw@sun.com>
parents: 1358
diff changeset
   141
        # (require manifest retrieval) based on the catalog version.
e86145680c34 11359 catalog should offer lazy-load mechanism for action metadata
Shawn Walker <srw@sun.com>
parents: 1358
diff changeset
   142
        PKG_STATE_V0 = 6
e86145680c34 11359 catalog should offer lazy-load mechanism for action metadata
Shawn Walker <srw@sun.com>
parents: 1358
diff changeset
   143
        PKG_STATE_V1 = 7
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   144
1461
fdf40c8c6765 820 Need a way to obsolete packages
Danek Duvall <danek.duvall@sun.com>
parents: 1449
diff changeset
   145
        PKG_STATE_OBSOLETE = 8
fdf40c8c6765 820 Need a way to obsolete packages
Danek Duvall <danek.duvall@sun.com>
parents: 1449
diff changeset
   146
        PKG_STATE_RENAMED = 9
fdf40c8c6765 820 Need a way to obsolete packages
Danek Duvall <danek.duvall@sun.com>
parents: 1449
diff changeset
   147
1970
60471574c487 16238 client api should ignore invalid and not yet supported packages
Shawn Walker <shawn.walker@oracle.com>
parents: 1895
diff changeset
   148
        # These states are used to indicate why a package was rejected and
60471574c487 16238 client api should ignore invalid and not yet supported packages
Shawn Walker <shawn.walker@oracle.com>
parents: 1895
diff changeset
   149
        # is not available for packaging operations.
60471574c487 16238 client api should ignore invalid and not yet supported packages
Shawn Walker <shawn.walker@oracle.com>
parents: 1895
diff changeset
   150
        PKG_STATE_UNSUPPORTED = 10      # Package contains invalid or
60471574c487 16238 client api should ignore invalid and not yet supported packages
Shawn Walker <shawn.walker@oracle.com>
parents: 1895
diff changeset
   151
                                        # unsupported metadata.
60471574c487 16238 client api should ignore invalid and not yet supported packages
Shawn Walker <shawn.walker@oracle.com>
parents: 1895
diff changeset
   152
1370
face1fe579ab 11400 image objects should always have a root
Brock Pytlik <bpytlik@sun.com>
parents: 1369
diff changeset
   153
        def __init__(self, root, user_provided_dir=False, progtrack=None,
2092
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   154
            should_exist=True, imgtype=None, force=False,
2158
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
   155
            augment_ta_from_parent_image=True, allow_ondisk_upgrade=None,
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   156
            allow_ambiguous=False, props=misc.EmptyDict):
1370
face1fe579ab 11400 image objects should always have a root
Brock Pytlik <bpytlik@sun.com>
parents: 1369
diff changeset
   157
                if should_exist:
face1fe579ab 11400 image objects should always have a root
Brock Pytlik <bpytlik@sun.com>
parents: 1369
diff changeset
   158
                        assert(imgtype is None)
face1fe579ab 11400 image objects should always have a root
Brock Pytlik <bpytlik@sun.com>
parents: 1369
diff changeset
   159
                        assert(not force)
face1fe579ab 11400 image objects should always have a root
Brock Pytlik <bpytlik@sun.com>
parents: 1369
diff changeset
   160
                else:
face1fe579ab 11400 image objects should always have a root
Brock Pytlik <bpytlik@sun.com>
parents: 1369
diff changeset
   161
                        assert(imgtype is not None)
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   162
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
   163
                # Alternate package sources.
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
   164
                self.__alt_pkg_pub_map = None
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
   165
                self.__alt_pubs = None
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
   166
                self.__alt_known_cat = None
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
   167
                self.__alt_pkg_sources_loaded = False
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
   168
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   169
                # Indicates whether automatic image format upgrades of the
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   170
                # on-disk format are allowed.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   171
                self.allow_ondisk_upgrade = allow_ondisk_upgrade
2158
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
   172
                self.allow_ambiguous = allow_ambiguous
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   173
                self.__upgraded = False
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   174
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   175
                # Must happen after upgraded assignment.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   176
                self.__init_catalogs()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   177
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   178
                self.attrs = { "Build-Release": "5.11" } # XXX real data needed
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   179
                self.blocking_locks = False
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
   180
                self.cfg = None
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   181
                self.history = history.History()
556
1c3526ca7b9e 2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents: 554
diff changeset
   182
                self.imageplan = None # valid after evaluation succeeds
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   183
                self.img_prefix = None
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   184
                self.imgdir = None
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   185
                self.index_dir = None
1370
face1fe579ab 11400 image objects should always have a root
Brock Pytlik <bpytlik@sun.com>
parents: 1369
diff changeset
   186
                self.root = root
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   187
                self.version = -1
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   188
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   189
                # Can have multiple read cache dirs...
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   190
                self.__read_cache_dirs = []
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   191
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   192
                # ...but only one global write cache dir and incoming write dir.
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   193
                self.__write_cache_dir = None
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   194
                self.__user_cache_dir = None
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   195
                self._incoming_cache_dir = None
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   196
2148
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
   197
                # Set if write_cache is actually a tree like /var/pkg/publisher
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
   198
                # instead of a flat cache.
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
   199
                self.__write_cache_root = None
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
   200
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   201
                self.__lock = pkg.nrlock.NRLock()
2043
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
   202
                self.__lockfile = None
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   203
                self.__sig_policy = None
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   204
                self.__trust_anchors = None
1370
face1fe579ab 11400 image objects should always have a root
Brock Pytlik <bpytlik@sun.com>
parents: 1369
diff changeset
   205
2105
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
   206
                # cache for presence of boot-archive
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
   207
                self.__boot_archive = None
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
   208
2003
16461c9acfee 1637 user action should be more robust against missing ftpusers file (and others)
Danek Duvall <danek.duvall@oracle.com>
parents: 1977
diff changeset
   209
                # When users and groups are added before their database files
16461c9acfee 1637 user action should be more robust against missing ftpusers file (and others)
Danek Duvall <danek.duvall@oracle.com>
parents: 1977
diff changeset
   210
                # have been installed, the actions store them temporarily in the
16461c9acfee 1637 user action should be more robust against missing ftpusers file (and others)
Danek Duvall <danek.duvall@oracle.com>
parents: 1977
diff changeset
   211
                # image, in these members.
16461c9acfee 1637 user action should be more robust against missing ftpusers file (and others)
Danek Duvall <danek.duvall@oracle.com>
parents: 1977
diff changeset
   212
                self._users = set()
16461c9acfee 1637 user action should be more robust against missing ftpusers file (and others)
Danek Duvall <danek.duvall@oracle.com>
parents: 1977
diff changeset
   213
                self._groups = set()
16461c9acfee 1637 user action should be more robust against missing ftpusers file (and others)
Danek Duvall <danek.duvall@oracle.com>
parents: 1977
diff changeset
   214
                self._usersbyname = {}
16461c9acfee 1637 user action should be more robust against missing ftpusers file (and others)
Danek Duvall <danek.duvall@oracle.com>
parents: 1977
diff changeset
   215
                self._groupsbyname = {}
16461c9acfee 1637 user action should be more robust against missing ftpusers file (and others)
Danek Duvall <danek.duvall@oracle.com>
parents: 1977
diff changeset
   216
2228
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
   217
                # Set of pkg stems being avoided
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
   218
                self.__avoid_set = None
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
   219
                self.__avoid_set_altered = False
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
   220
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
   221
                # set of pkg stems subject to group
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
   222
                # dependency but removed because obsolete
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
   223
                self.__group_obsolete = None
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
   224
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   225
                self.__property_overrides = { "property": props }
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   226
1370
face1fe579ab 11400 image objects should always have a root
Brock Pytlik <bpytlik@sun.com>
parents: 1369
diff changeset
   227
                # Transport operations for this image
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1970
diff changeset
   228
                self.transport = transport.Transport(
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1970
diff changeset
   229
                    transport.ImageTransportCfg(self))
1370
face1fe579ab 11400 image objects should always have a root
Brock Pytlik <bpytlik@sun.com>
parents: 1369
diff changeset
   230
face1fe579ab 11400 image objects should always have a root
Brock Pytlik <bpytlik@sun.com>
parents: 1369
diff changeset
   231
                if should_exist:
face1fe579ab 11400 image objects should always have a root
Brock Pytlik <bpytlik@sun.com>
parents: 1369
diff changeset
   232
                        self.find_root(self.root, user_provided_dir,
face1fe579ab 11400 image objects should always have a root
Brock Pytlik <bpytlik@sun.com>
parents: 1369
diff changeset
   233
                            progtrack)
face1fe579ab 11400 image objects should always have a root
Brock Pytlik <bpytlik@sun.com>
parents: 1369
diff changeset
   234
                else:
face1fe579ab 11400 image objects should always have a root
Brock Pytlik <bpytlik@sun.com>
parents: 1369
diff changeset
   235
                        if not force and self.image_type(self.root) != None:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   236
                                raise apx.ImageAlreadyExists(self.root)
1370
face1fe579ab 11400 image objects should always have a root
Brock Pytlik <bpytlik@sun.com>
parents: 1369
diff changeset
   237
                        if not force and os.path.exists(self.root) and \
face1fe579ab 11400 image objects should always have a root
Brock Pytlik <bpytlik@sun.com>
parents: 1369
diff changeset
   238
                            len(os.listdir(self.root)) > 0:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   239
                                raise apx.CreatingImageInNonEmptyDir(self.root)
1370
face1fe579ab 11400 image objects should always have a root
Brock Pytlik <bpytlik@sun.com>
parents: 1369
diff changeset
   240
                        self.__set_dirs(root=self.root, imgtype=imgtype,
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
   241
                            progtrack=progtrack, purge=True)
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   242
674
e740c8c3bed1 166 os.makedirs() does not set directory mode
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 664
diff changeset
   243
                # right now we don't explicitly set dir/file modes everywhere;
e740c8c3bed1 166 os.makedirs() does not set directory mode
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 664
diff changeset
   244
                # set umask to proper value to prevent problems w/ overly
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
   245
                # locked down umask.
674
e740c8c3bed1 166 os.makedirs() does not set directory mode
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 664
diff changeset
   246
                os.umask(0022)
e740c8c3bed1 166 os.makedirs() does not set directory mode
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 664
diff changeset
   247
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   248
                # Determine identity of client executable if appropriate.
2092
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   249
                self.__cmddir = None
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   250
                if global_settings.client_args[0]:
2092
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   251
                        cmdpath = os.path.join(os.getcwd(),
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   252
                            global_settings.client_args[0])
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   253
                        cmdpath = os.path.realpath(cmdpath)
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   254
                        self.__cmddir = os.path.dirname(os.path.realpath(
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   255
                            cmdpath))
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   256
2092
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   257
                self.augment_ta_from_parent_image = augment_ta_from_parent_image
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   258
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
   259
        def __catalog_loaded(self, name):
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
   260
                """Returns a boolean value indicating whether the named catalog
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
   261
                has already been loaded.  This is intended to be used as an
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
   262
                optimization function to determine which catalog to request."""
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
   263
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
   264
                return name in self.__catalogs
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
   265
1463
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
   266
        def __init_catalogs(self):
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
   267
                """Initializes default catalog state.  Actual data is provided
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
   268
                on demand via get_catalog()"""
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
   269
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   270
                if self.__upgraded and self.version < 3:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   271
                        # Ignore request; transformed catalog data only exists
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   272
                        # in memory and can't be reloaded from disk.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   273
                        return
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   274
1463
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
   275
                # This is used to cache image catalogs.
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
   276
                self.__catalogs = {}
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
   277
                self.__alt_pkg_sources_loaded = False
1463
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
   278
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   279
        @property
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   280
        def signature_policy(self):
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   281
                """Returns the signature policy for this image."""
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   282
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   283
                if self.__sig_policy is not None:
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   284
                        return self.__sig_policy
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
   285
                txt = self.cfg.get_policy_str(imageconfig.SIGNATURE_POLICY)
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
   286
                names = self.cfg.get_property("property",
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
   287
                    "signature-required-names")
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   288
                self.__sig_policy = sigpolicy.Policy.policy_factory(txt, names)
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   289
                return self.__sig_policy
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   290
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   291
        @property
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   292
        def trust_anchors(self):
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   293
                """Return a dictionary mapping subject hashes for certificates
2092
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   294
                this image trusts to those certs.  The image trusts those
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   295
                trust anchors in its trust_anchor_dir and those in the from
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   296
                which pkg was run."""
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   297
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   298
                if self.__trust_anchors is not None:
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   299
                        return self.__trust_anchors
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   300
2092
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   301
                user_set_ta_loc = True
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
   302
                rel_dir = self.get_property("trust-anchor-directory")
2092
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   303
                if rel_dir[0] == "/":
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   304
                        rel_dir = rel_dir[1:]
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   305
                trust_anchor_loc = os.path.join(self.root, rel_dir)
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   306
                loc_is_dir = os.path.isdir(trust_anchor_loc)
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   307
                pkg_trust_anchors = {}
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   308
                if self.__cmddir and self.augment_ta_from_parent_image:
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   309
                        pkg_trust_anchors = Image(self.__cmddir,
2158
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
   310
                            augment_ta_from_parent_image=False,
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
   311
                            allow_ambiguous=True).trust_anchors
2092
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   312
                if not loc_is_dir and os.path.exists(trust_anchor_loc):
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   313
                        raise apx.InvalidPropertyValue(_("The trust "
2092
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   314
                            "anchors for the image were expected to be found "
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   315
                            "in %s, but that is not a directory.  Please set "
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   316
                            "the image property 'trust-anchor-directory' to "
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   317
                            "the correct path.") % trust_anchor_loc)
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   318
                self.__trust_anchors = {}
2092
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   319
                if loc_is_dir:
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   320
                        for fn in os.listdir(trust_anchor_loc):
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   321
                                pth = os.path.join(trust_anchor_loc, fn)
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   322
                                if os.path.islink(pth):
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   323
                                        continue
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   324
                                trusted_ca = m2.X509.load_cert(pth)
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   325
                                # M2Crypto's subject hash doesn't match
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   326
                                # openssl's subject hash so recompute it so all
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   327
                                # hashes are in the same universe.
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   328
                                s = trusted_ca.get_subject().as_hash()
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   329
                                self.__trust_anchors.setdefault(s, [])
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   330
                                self.__trust_anchors[s].append(trusted_ca)
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   331
                for s in pkg_trust_anchors:
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   332
                        if s not in self.__trust_anchors:
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
   333
                                self.__trust_anchors[s] = pkg_trust_anchors[s]
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   334
                return self.__trust_anchors
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   335
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
   336
        @property
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   337
        def locked(self):
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   338
                """Returns a boolean value indicating whether the image is
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   339
                currently locked."""
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   340
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   341
                return self.__lock and self.__lock.locked
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   342
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   343
        @contextmanager
2154
68e263d9287c 17417 t_pkg_history test unnecessarily wants a unique timestamp
Tim Foster <tim.s.foster@oracle.com>
parents: 2152
diff changeset
   344
        def locked_op(self, op, allow_unprivileged=False, new_history_op=True):
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   345
                """Helper method for executing an image-modifying operation
2154
68e263d9287c 17417 t_pkg_history test unnecessarily wants a unique timestamp
Tim Foster <tim.s.foster@oracle.com>
parents: 2152
diff changeset
   346
                that needs locking.  It automatically handles calling
68e263d9287c 17417 t_pkg_history test unnecessarily wants a unique timestamp
Tim Foster <tim.s.foster@oracle.com>
parents: 2152
diff changeset
   347
                log_operation_start and log_operation_end by default.  Locking
68e263d9287c 17417 t_pkg_history test unnecessarily wants a unique timestamp
Tim Foster <tim.s.foster@oracle.com>
parents: 2152
diff changeset
   348
                behaviour is controlled by the blocking_locks image property.
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   349
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   350
                'allow_unprivileged' is an optional boolean value indicating
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   351
                that permissions-related exceptions should be ignored when
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   352
                attempting to obtain the lock as the related operation will
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   353
                still work correctly even though the image cannot (presumably)
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   354
                be modified.
2154
68e263d9287c 17417 t_pkg_history test unnecessarily wants a unique timestamp
Tim Foster <tim.s.foster@oracle.com>
parents: 2152
diff changeset
   355
68e263d9287c 17417 t_pkg_history test unnecessarily wants a unique timestamp
Tim Foster <tim.s.foster@oracle.com>
parents: 2152
diff changeset
   356
                'new_history_op' indicates whether we should handle history
68e263d9287c 17417 t_pkg_history test unnecessarily wants a unique timestamp
Tim Foster <tim.s.foster@oracle.com>
parents: 2152
diff changeset
   357
                operations.
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   358
                """
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   359
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   360
                error = None
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   361
                self.lock(allow_unprivileged=allow_unprivileged)
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   362
                try:
2141
3757a0f8a7d1 17385 history should store uuids for boot environments
Tim Foster <tim.s.foster@oracle.com>
parents: 2135
diff changeset
   363
                        be_name, be_uuid = \
3757a0f8a7d1 17385 history should store uuids for boot environments
Tim Foster <tim.s.foster@oracle.com>
parents: 2135
diff changeset
   364
                            bootenv.BootEnv.get_be_name(self.root)
2154
68e263d9287c 17417 t_pkg_history test unnecessarily wants a unique timestamp
Tim Foster <tim.s.foster@oracle.com>
parents: 2152
diff changeset
   365
                        if new_history_op:
68e263d9287c 17417 t_pkg_history test unnecessarily wants a unique timestamp
Tim Foster <tim.s.foster@oracle.com>
parents: 2152
diff changeset
   366
                                self.history.log_operation_start(op,
68e263d9287c 17417 t_pkg_history test unnecessarily wants a unique timestamp
Tim Foster <tim.s.foster@oracle.com>
parents: 2152
diff changeset
   367
                                    be_name=be_name, be_uuid=be_uuid)
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   368
                        yield
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   369
                except apx.ImageLockedError, e:
2043
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
   370
                        # Don't unlock the image if the call failed to
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
   371
                        # get the lock.
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   372
                        error = e
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   373
                        raise
2043
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
   374
                except Exception, e:
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
   375
                        error = e
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
   376
                        self.unlock()
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
   377
                        raise
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
   378
                else:
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
   379
                        self.unlock()
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   380
                finally:
2154
68e263d9287c 17417 t_pkg_history test unnecessarily wants a unique timestamp
Tim Foster <tim.s.foster@oracle.com>
parents: 2152
diff changeset
   381
                        if new_history_op:
68e263d9287c 17417 t_pkg_history test unnecessarily wants a unique timestamp
Tim Foster <tim.s.foster@oracle.com>
parents: 2152
diff changeset
   382
                                self.history.log_operation_end(error=error)
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   383
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   384
        def lock(self, allow_unprivileged=False):
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   385
                """Locks the image in preparation for an image-modifying
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   386
                operation.  Raises an ImageLockedError exception on failure.
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   387
                Locking behaviour is controlled by the blocking_locks image
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   388
                property.
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   389
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   390
                'allow_unprivileged' is an optional boolean value indicating
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   391
                that permissions-related exceptions should be ignored when
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   392
                attempting to obtain the lock as the related operation will
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   393
                still work correctly even though the image cannot (presumably)
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   394
                be modified.
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   395
                """
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   396
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   397
                blocking = self.blocking_locks
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   398
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   399
                # First, attempt to obtain a thread lock.
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   400
                if not self.__lock.acquire(blocking=blocking):
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   401
                        raise apx.ImageLockedError()
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   402
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   403
                try:
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   404
                        # Attempt to obtain a file lock.
2043
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
   405
                        self.__lockfile.lock(blocking=blocking)
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
   406
                except EnvironmentError, e:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   407
                        exc = None
2043
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
   408
                        if e.errno == errno.ENOENT:
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
   409
                                return
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
   410
                        if e.errno == errno.EACCES:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   411
                                exc = apx.PermissionsException(e.filename)
2043
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
   412
                        elif e.errno == errno.EROFS:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   413
                                exc = apx.ReadOnlyFileSystemException(
2043
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
   414
                                    e.filename)
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
   415
                        else:
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   416
                                self.__lock.release()
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   417
                                raise
2043
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
   418
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   419
                        if exc and not allow_unprivileged:
2043
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
   420
                                self.__lock.release()
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   421
                                raise exc
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   422
                except:
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   423
                        # If process lock fails, ensure thread lock is released.
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   424
                        self.__lock.release()
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   425
                        raise
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   426
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   427
        def unlock(self):
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   428
                """Unlocks the image."""
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   429
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   430
                try:
2043
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
   431
                        if self.__lockfile:
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
   432
                                self.__lockfile.unlock()
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   433
                finally:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   434
                        self.__lock.release()
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   435
582
303fa3b78f93 3588 Ensure that users don't image-create over top of an image
Brad Hall <bhall@eng.sun.com>
parents: 577
diff changeset
   436
        def image_type(self, d):
303fa3b78f93 3588 Ensure that users don't image-create over top of an image
Brad Hall <bhall@eng.sun.com>
parents: 577
diff changeset
   437
                """Returns the type of image at directory: d; or None"""
303fa3b78f93 3588 Ensure that users don't image-create over top of an image
Brad Hall <bhall@eng.sun.com>
parents: 577
diff changeset
   438
                rv = None
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   439
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   440
                def is_image(sub_d, prefix):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   441
                        # First check for new image configuration file.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   442
                        if os.path.isfile(os.path.join(sub_d, prefix,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   443
                            "pkg5.image")):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   444
                                # Regardless of directory structure, assume
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   445
                                # this is an image for now.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   446
                                return True
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   447
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   448
                        if not os.path.isfile(os.path.join(sub_d, prefix,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   449
                            "cfg_cache")):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   450
                                # For older formats, if configuration is
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   451
                                # missing, this can't be an image.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   452
                                return False
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   453
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   454
                        # Configuration exists, but for older formats,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   455
                        # all of these directories have to exist.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   456
                        for n in ("state", "pkg"):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   457
                                if not os.path.isdir(os.path.join(sub_d, prefix,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   458
                                    n)):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   459
                                        return False
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   460
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   461
                        return True
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   462
582
303fa3b78f93 3588 Ensure that users don't image-create over top of an image
Brad Hall <bhall@eng.sun.com>
parents: 577
diff changeset
   463
                if os.path.isdir(os.path.join(d, img_user_prefix)) and \
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   464
                    is_image(d, img_user_prefix):
582
303fa3b78f93 3588 Ensure that users don't image-create over top of an image
Brad Hall <bhall@eng.sun.com>
parents: 577
diff changeset
   465
                        rv = IMG_USER
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   466
                elif os.path.isdir(os.path.join(d, img_root_prefix)) and \
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   467
                    is_image(d, img_root_prefix):
582
303fa3b78f93 3588 Ensure that users don't image-create over top of an image
Brad Hall <bhall@eng.sun.com>
parents: 577
diff changeset
   468
                        rv = IMG_ENTIRE
303fa3b78f93 3588 Ensure that users don't image-create over top of an image
Brad Hall <bhall@eng.sun.com>
parents: 577
diff changeset
   469
                return rv
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
   470
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   471
        def find_root(self, d, exact_match=False, progtrack=None):
289
c2e63370fb2b 160 Make IPS cross-platform for use across other supported OS's
Tom Mueller <Tom.Mueller@Sun.COM>
parents: 285
diff changeset
   472
                # Ascend from the given directory d to find first
1370
face1fe579ab 11400 image objects should always have a root
Brock Pytlik <bpytlik@sun.com>
parents: 1369
diff changeset
   473
                # encountered image.  If exact_match is true, if the
561
be1ad23e7704 1651 pkg treats -R <bogus-dir> as "use the image at /"
Brock Pytlik <bpytlik@sun.com>
parents: 560
diff changeset
   474
                # image found doesn't match startd, raise an
be1ad23e7704 1651 pkg treats -R <bogus-dir> as "use the image at /"
Brock Pytlik <bpytlik@sun.com>
parents: 560
diff changeset
   475
                # ImageNotFoundException.
1370
face1fe579ab 11400 image objects should always have a root
Brock Pytlik <bpytlik@sun.com>
parents: 1369
diff changeset
   476
289
c2e63370fb2b 160 Make IPS cross-platform for use across other supported OS's
Tom Mueller <Tom.Mueller@Sun.COM>
parents: 285
diff changeset
   477
                startd = d
c2e63370fb2b 160 Make IPS cross-platform for use across other supported OS's
Tom Mueller <Tom.Mueller@Sun.COM>
parents: 285
diff changeset
   478
                # eliminate problem if relative path such as "." is passed in
c2e63370fb2b 160 Make IPS cross-platform for use across other supported OS's
Tom Mueller <Tom.Mueller@Sun.COM>
parents: 285
diff changeset
   479
                d = os.path.realpath(d)
2158
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
   480
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
   481
                live_root = DebugValues.get_value("simulate_live_root")
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
   482
                if not live_root:
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
   483
                        live_root = "/"
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
   484
26
ab188d4682d5 catalog processing begins
"Stephen Hahn <sch@sun.com>"
parents: 22
diff changeset
   485
                while True:
582
303fa3b78f93 3588 Ensure that users don't image-create over top of an image
Brad Hall <bhall@eng.sun.com>
parents: 577
diff changeset
   486
                        imgtype = self.image_type(d)
2158
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
   487
                        if imgtype in (IMG_USER, IMG_ENTIRE):
561
be1ad23e7704 1651 pkg treats -R <bogus-dir> as "use the image at /"
Brock Pytlik <bpytlik@sun.com>
parents: 560
diff changeset
   488
                                if exact_match and \
be1ad23e7704 1651 pkg treats -R <bogus-dir> as "use the image at /"
Brock Pytlik <bpytlik@sun.com>
parents: 560
diff changeset
   489
                                    os.path.realpath(startd) != \
be1ad23e7704 1651 pkg treats -R <bogus-dir> as "use the image at /"
Brock Pytlik <bpytlik@sun.com>
parents: 560
diff changeset
   490
                                    os.path.realpath(d):
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   491
                                        raise apx.ImageNotFoundException(
561
be1ad23e7704 1651 pkg treats -R <bogus-dir> as "use the image at /"
Brock Pytlik <bpytlik@sun.com>
parents: 560
diff changeset
   492
                                            exact_match, startd, d)
2158
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
   493
                                if not exact_match and d != live_root and \
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
   494
                                    not self.allow_ambiguous and \
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
   495
                                    portable.osname == "sunos":
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
   496
                                        # On Solaris, consider an image found
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
   497
                                        # somewhere other than the live root an
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
   498
                                        # an error if an exact match wasn't
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
   499
                                        # requested.  (This prevents accidental
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
   500
                                        # use of nested images.) It is not
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
   501
                                        # desirable to do this on other
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
   502
                                        # platforms as non-root images are the
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
   503
                                        # norm.
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
   504
                                        raise apx.ImageLocationAmbiguous(d,
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
   505
                                            live_root=live_root)
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   506
                                self.__set_dirs(imgtype=imgtype, root=d,
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   507
                                    progtrack=progtrack)
26
ab188d4682d5 catalog processing begins
"Stephen Hahn <sch@sun.com>"
parents: 22
diff changeset
   508
                                return
ab188d4682d5 catalog processing begins
"Stephen Hahn <sch@sun.com>"
parents: 22
diff changeset
   509
289
c2e63370fb2b 160 Make IPS cross-platform for use across other supported OS's
Tom Mueller <Tom.Mueller@Sun.COM>
parents: 285
diff changeset
   510
                        # XXX follow symlinks or not?
c2e63370fb2b 160 Make IPS cross-platform for use across other supported OS's
Tom Mueller <Tom.Mueller@Sun.COM>
parents: 285
diff changeset
   511
                        oldpath = d
c2e63370fb2b 160 Make IPS cross-platform for use across other supported OS's
Tom Mueller <Tom.Mueller@Sun.COM>
parents: 285
diff changeset
   512
                        d = os.path.normpath(os.path.join(d, os.path.pardir))
26
ab188d4682d5 catalog processing begins
"Stephen Hahn <sch@sun.com>"
parents: 22
diff changeset
   513
289
c2e63370fb2b 160 Make IPS cross-platform for use across other supported OS's
Tom Mueller <Tom.Mueller@Sun.COM>
parents: 285
diff changeset
   514
                        # Make sure we are making progress and aren't in an
c2e63370fb2b 160 Make IPS cross-platform for use across other supported OS's
Tom Mueller <Tom.Mueller@Sun.COM>
parents: 285
diff changeset
   515
                        # infinite loop.
c2e63370fb2b 160 Make IPS cross-platform for use across other supported OS's
Tom Mueller <Tom.Mueller@Sun.COM>
parents: 285
diff changeset
   516
                        #
c2e63370fb2b 160 Make IPS cross-platform for use across other supported OS's
Tom Mueller <Tom.Mueller@Sun.COM>
parents: 285
diff changeset
   517
                        # (XXX - Need to deal with symlinks here too)
c2e63370fb2b 160 Make IPS cross-platform for use across other supported OS's
Tom Mueller <Tom.Mueller@Sun.COM>
parents: 285
diff changeset
   518
                        if d == oldpath:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   519
                                raise apx.ImageNotFoundException(
596
f4519e2a99bc 3704 InventoryException raised if optional dependencies not in catalog
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 583
diff changeset
   520
                                    exact_match, startd, d)
26
ab188d4682d5 catalog processing begins
"Stephen Hahn <sch@sun.com>"
parents: 22
diff changeset
   521
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   522
        def __load_config(self):
104
ecfc64baf22e add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents: 87
diff changeset
   523
                """Load this image's cached configuration from the default
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   524
                location.  This function should not be called anywhere other
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   525
                than __set_dirs()."""
104
ecfc64baf22e add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents: 87
diff changeset
   526
ecfc64baf22e add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents: 87
diff changeset
   527
                # XXX Incomplete with respect to doc/image.txt description of
ecfc64baf22e add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents: 87
diff changeset
   528
                # configuration.
ecfc64baf22e add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents: 87
diff changeset
   529
ecfc64baf22e add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents: 87
diff changeset
   530
                if self.root == None:
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   531
                        raise RuntimeError("self.root must be set")
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   532
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   533
                version = None
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   534
                if self.version > -1:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   535
                        if self.version >= 3:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   536
                                # Configuration version is currently 3
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   537
                                # for all v3 images and newer.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   538
                                version = 3
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   539
                        else:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   540
                                version = self.version
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   541
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   542
                self.cfg = imageconfig.ImageConfig(self.__cfgpathname,
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   543
                    self.root, version=version,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   544
                    overrides=self.__property_overrides)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   545
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   546
                if self.__upgraded:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   547
                        self.cfg = imageconfig.BlendedConfig(self.cfg,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   548
                            self.get_catalog(self.IMG_CATALOG_INSTALLED).\
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   549
                                get_package_counts_by_pub(),
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   550
                            self.imgdir, self.transport,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   551
                            self.cfg.get_policy("use-system-repo"))
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   552
551
233f0eeddd02 856 Image properties
Tom Mueller <Tom.Mueller@sun.com>
parents: 548
diff changeset
   553
        def save_config(self):
1143
71becfca5cfd 8777 image-create traceback with --no-refresh
Shawn Walker <srw@sun.com>
parents: 1141
diff changeset
   554
                # First, create the image directories if they haven't been, so
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
   555
                # the configuration file can be written.
1143
71becfca5cfd 8777 image-create traceback with --no-refresh
Shawn Walker <srw@sun.com>
parents: 1141
diff changeset
   556
                self.mkdirs()
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
   557
                self.cfg.write()
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   558
                if self.is_liveroot() and \
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   559
                    smf.get_state("svc:/system/pkg/sysrepo:default") in \
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   560
                    (smf.SMF_SVC_TMP_ENABLED, smf.SMF_SVC_ENABLED):
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   561
                        smf.refresh(["svc:/system/pkg/sysrepo:default"])
2330
9451b3f28f4c 17558 pkg configuration can't be updated if a publisher source points to down NFS server
Shawn Walker <shawn.walker@oracle.com>
parents: 2310
diff changeset
   562
9451b3f28f4c 17558 pkg configuration can't be updated if a publisher source points to down NFS server
Shawn Walker <shawn.walker@oracle.com>
parents: 2310
diff changeset
   563
                # This ensures all old transport configuration is thrown away.
9451b3f28f4c 17558 pkg configuration can't be updated if a publisher source points to down NFS server
Shawn Walker <shawn.walker@oracle.com>
parents: 2310
diff changeset
   564
                self.transport = transport.Transport(
9451b3f28f4c 17558 pkg configuration can't be updated if a publisher source points to down NFS server
Shawn Walker <shawn.walker@oracle.com>
parents: 2310
diff changeset
   565
                    transport.ImageTransportCfg(self))
551
233f0eeddd02 856 Image properties
Tom Mueller <Tom.Mueller@sun.com>
parents: 548
diff changeset
   566
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   567
        def mkdirs(self, root=None, version=None):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   568
                """Create any missing parts of the image's directory structure.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   569
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   570
                'root' is an optional path to a directory to create the new
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   571
                image structure in.  If not provided, the current image
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   572
                directory is the default.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   573
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   574
                'version' is an optional integer value indicating the version
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   575
                of the structure to create.  If not provided, the current image
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   576
                version is the default.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   577
                """
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   578
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   579
                if not root:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   580
                        root = self.imgdir
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   581
                if not version:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   582
                        version = self.version
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   583
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   584
                if version == self.CURRENT_VERSION:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   585
                        img_dirs = ["cache/index", "cache/publisher",
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   586
                            "cache/tmp", "gui_cache", "history", "license",
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   587
                            "lost+found", "publisher", "ssl", "state/installed",
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   588
                            "state/known"]
2183
21ae45e8dfcf 17581 There should be a way of removing a package as part of upgrade
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2178
diff changeset
   589
                else:
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   590
                        img_dirs = ["download", "file", "gui_cache", "history",
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   591
                            "index", "lost+found", "pkg", "publisher",
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   592
                            "state/installed", "state/known", "tmp"]
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   593
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   594
                for sd in img_dirs:
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   595
                        try:
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   596
                                misc.makedirs(os.path.join(root, sd))
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
   597
                        except EnvironmentError, e:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   598
                                raise apx._convert_error(e)
29
f621f1df0849 fix install target; correct imports for module renames
"Stephen Hahn <sch@sun.com>"
parents: 26
diff changeset
   599
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
   600
        def __set_dirs(self, imgtype, root, progtrack=None, purge=False):
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   601
                # Ensure upgraded status is reset.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   602
                self.__upgraded = False
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   603
554
fe196874250d 3508 zone install should utilize/populate global zone d/l cache
Dan Price <dp@eng.sun.com>
parents: 552
diff changeset
   604
                self.type = imgtype
22
379f0f6809ff pkgsend open, pkgsend add file, pkgsend close; Transaction object
"Stephen Hahn <sch@sun.com>"
parents: 19
diff changeset
   605
                self.root = root
379f0f6809ff pkgsend open, pkgsend add file, pkgsend close; Transaction object
"Stephen Hahn <sch@sun.com>"
parents: 19
diff changeset
   606
                if self.type == IMG_USER:
271
ec8a7669bff2 659 package that delivers existing automounter mountpoint fails installation
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 268
diff changeset
   607
                        self.img_prefix = img_user_prefix
22
379f0f6809ff pkgsend open, pkgsend add file, pkgsend close; Transaction object
"Stephen Hahn <sch@sun.com>"
parents: 19
diff changeset
   608
                else:
271
ec8a7669bff2 659 package that delivers existing automounter mountpoint fails installation
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 268
diff changeset
   609
                        self.img_prefix = img_root_prefix
993
7cfbab7739c3 588 directory remove of cwd fails due to EPERM or EINVAL
Danek Duvall <danek.duvall@sun.com>
parents: 988
diff changeset
   610
2330
9451b3f28f4c 17558 pkg configuration can't be updated if a publisher source points to down NFS server
Shawn Walker <shawn.walker@oracle.com>
parents: 2310
diff changeset
   611
                # Use a new Transport object every time location is changed.
9451b3f28f4c 17558 pkg configuration can't be updated if a publisher source points to down NFS server
Shawn Walker <shawn.walker@oracle.com>
parents: 2310
diff changeset
   612
                self.transport = transport.Transport(
9451b3f28f4c 17558 pkg configuration can't be updated if a publisher source points to down NFS server
Shawn Walker <shawn.walker@oracle.com>
parents: 2310
diff changeset
   613
                    transport.ImageTransportCfg(self))
9451b3f28f4c 17558 pkg configuration can't be updated if a publisher source points to down NFS server
Shawn Walker <shawn.walker@oracle.com>
parents: 2310
diff changeset
   614
993
7cfbab7739c3 588 directory remove of cwd fails due to EPERM or EINVAL
Danek Duvall <danek.duvall@sun.com>
parents: 988
diff changeset
   615
                # Change directory to the root of the image so that we can
7cfbab7739c3 588 directory remove of cwd fails due to EPERM or EINVAL
Danek Duvall <danek.duvall@sun.com>
parents: 988
diff changeset
   616
                # remove any directories beneath us.  If we're changing the
7cfbab7739c3 588 directory remove of cwd fails due to EPERM or EINVAL
Danek Duvall <danek.duvall@sun.com>
parents: 988
diff changeset
   617
                # image, don't chdir, as we're likely changing to a new BE
7cfbab7739c3 588 directory remove of cwd fails due to EPERM or EINVAL
Danek Duvall <danek.duvall@sun.com>
parents: 988
diff changeset
   618
                # and want to be able to unmount it later.
999
04c29b9c97a0 7811 pkg image-create no longer creates image path if it doesn't exist
Danek Duvall <danek.duvall@sun.com>
parents: 996
diff changeset
   619
                if not self.imgdir and os.path.isdir(root):
993
7cfbab7739c3 588 directory remove of cwd fails due to EPERM or EINVAL
Danek Duvall <danek.duvall@sun.com>
parents: 988
diff changeset
   620
                        os.chdir(root)
7cfbab7739c3 588 directory remove of cwd fails due to EPERM or EINVAL
Danek Duvall <danek.duvall@sun.com>
parents: 988
diff changeset
   621
1133
2c28e4526a6e 8720 image-create with a non-absolute path can cause strange results
Shawn Walker <srw@sun.com>
parents: 1125
diff changeset
   622
                        # The specified root may have been a relative path.
2c28e4526a6e 8720 image-create with a non-absolute path can cause strange results
Shawn Walker <srw@sun.com>
parents: 1125
diff changeset
   623
                        self.root = os.getcwd()
2c28e4526a6e 8720 image-create with a non-absolute path can cause strange results
Shawn Walker <srw@sun.com>
parents: 1125
diff changeset
   624
1402
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
   625
                if not os.path.isabs(self.root):
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
   626
                        self.root = os.path.abspath(self.root)
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
   627
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   628
                # If current image is locked, then it should be unlocked
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   629
                # and then relocked after the imgdir is changed.  This
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   630
                # ensures that alternate BE scenarios work.
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   631
                relock = self.imgdir and self.locked
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   632
                if relock:
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   633
                        self.unlock()
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   634
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   635
                # Must set imgdir first.
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
   636
                self.imgdir = os.path.join(self.root, self.img_prefix)
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   637
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   638
                # Force a reset of version.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   639
                self.version = -1
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   640
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   641
                # Assume version 4+ configuration location.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   642
                self.__cfgpathname = os.path.join(self.imgdir, "pkg5.image")
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   643
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   644
                # In the case of initial image creation, purge is specified
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   645
                # to ensure that when an image is created over an existing
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   646
                # one, any old data is removed first.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   647
                if purge and os.path.exists(self.imgdir):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   648
                        for entry in os.listdir(self.imgdir):
2178
7c123147a909 17680 image creation should preserve ssl directory if it already exists
Shawn Walker <shawn.walker@oracle.com>
parents: 2158
diff changeset
   649
                                if entry == "ssl":
7c123147a909 17680 image creation should preserve ssl directory if it already exists
Shawn Walker <shawn.walker@oracle.com>
parents: 2158
diff changeset
   650
                                        # Preserve certs and keys directory
7c123147a909 17680 image creation should preserve ssl directory if it already exists
Shawn Walker <shawn.walker@oracle.com>
parents: 2158
diff changeset
   651
                                        # as a special exception.
7c123147a909 17680 image creation should preserve ssl directory if it already exists
Shawn Walker <shawn.walker@oracle.com>
parents: 2158
diff changeset
   652
                                        continue
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   653
                                epath = os.path.join(self.imgdir, entry)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   654
                                try:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   655
                                        if os.path.isdir(epath):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   656
                                                shutil.rmtree(epath)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   657
                                        else:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   658
                                                portable.remove(epath)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   659
                                except EnvironmentError, e:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   660
                                        raise apx._convert_error(e)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   661
                elif not purge:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   662
                        # Determine if the version 4 configuration file exists.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   663
                        if not os.path.exists(self.__cfgpathname):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   664
                                self.__cfgpathname = os.path.join(self.imgdir,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   665
                                    "cfg_cache")
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   666
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   667
                # Load the image configuration.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   668
                self.__load_config()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   669
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   670
                if not purge:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   671
                        try:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   672
                                self.version = int(self.cfg.get_property("image",
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   673
                                    "version"))
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   674
                        except (cfg.PropertyConfigError, ValueError):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   675
                                # If version couldn't be read from
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   676
                                # configuration, then allow fallback
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   677
                                # path below to set things right.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   678
                                self.version = -1
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   679
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   680
                if self.version <= 0:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   681
                        # If version doesn't exist, attempt to determine version
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   682
                        # based on structure.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   683
                        pub_root = os.path.join(self.imgdir, IMG_PUB_DIR)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   684
                        if purge:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   685
                                # This is a new image.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   686
                                self.version = self.CURRENT_VERSION
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   687
                        elif os.path.exists(pub_root):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   688
                                cache_root = os.path.join(self.imgdir, "cache")
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   689
                                if os.path.exists(cache_root):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   690
                                        # The image must be corrupted, as the
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   691
                                        # version should have been loaded from
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   692
                                        # configuration.  For now, raise an
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   693
                                        # exception.  In the future, this
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   694
                                        # behaviour should probably be optional
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   695
                                        # so that pkg fix or pkg verify can
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   696
                                        # still use the image.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   697
                                        raise apx.UnsupportedImageError(
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   698
                                            self.root)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   699
                                else:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   700
                                        # Assume version 3 image.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   701
                                        self.version = 3
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   702
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   703
                                # Reload image configuration again now that
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   704
                                # version has been determined so that property
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   705
                                # definitions match.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   706
                                self.__load_config()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   707
                        elif os.path.exists(os.path.join(self.imgdir,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   708
                            "catalog")):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   709
                                self.version = 2
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   710
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   711
                                # Reload image configuration again now that
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   712
                                # version has been determined so that property
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   713
                                # definitions match.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   714
                                self.__load_config()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   715
                        else:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   716
                                # Format is too old or invalid.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   717
                                raise apx.UnsupportedImageError(self.root)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   718
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   719
                if self.version > self.CURRENT_VERSION or self.version < 2:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   720
                        # Image is too new or too old.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   721
                        raise apx.UnsupportedImageError(self.root)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   722
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   723
                # Ensure image version matches determined one; this must
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   724
                # be set *after* the version checks above.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   725
                self.cfg.set_property("image", "version", self.version)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   726
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   727
                # Remaining dirs may now be set.
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   728
                if self.version == self.CURRENT_VERSION:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   729
                        self.__tmpdir = os.path.join(self.imgdir, "cache",
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   730
                            "tmp")
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   731
                else:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   732
                        self.__tmpdir = os.path.join(self.imgdir, "tmp")
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   733
                self._statedir = os.path.join(self.imgdir, "state")
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   734
                self.update_index_dir()
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   735
539
7486304966c5 1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents: 537
diff changeset
   736
                self.history.root_dir = self.imgdir
2043
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
   737
                self.__lockfile = lockfile.LockFile(os.path.join(self.imgdir,
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
   738
                    "lock"), set_lockstr=lockfile.client_lock_set_str,
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
   739
                    get_lockstr=lockfile.client_lock_get_str,
2183
21ae45e8dfcf 17581 There should be a way of removing a package as part of upgrade
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2178
diff changeset
   740
                    failure_exc=apx.ImageLockedError,
2043
852501e586d0 14615 image-update claims failure for un-aquired lock and still succeeds
johansen <johansen@opensolaris.org>
parents: 2035
diff changeset
   741
                    provide_mutex=False)
2183
21ae45e8dfcf 17581 There should be a way of removing a package as part of upgrade
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2178
diff changeset
   742
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   743
                if relock:
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   744
                        self.lock()
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
   745
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   746
                # Setup cache directories.
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   747
                self.__read_cache_dirs = []
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   748
                self._incoming_cache_dir = None
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   749
                self.__user_cache_dir = None
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   750
                self.__write_cache_dir = None
2148
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
   751
                self.__write_cache_root = None
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
   752
                # The user specified cache is used as an additional place to
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
   753
                # read cache data from, but as the only place to store new
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
   754
                # cache data.
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
   755
                if "PKG_CACHEROOT" in os.environ:
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
   756
                        # If set, cache is structured like /var/pkg/publisher.
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
   757
                        # get_cachedirs() will build paths for each publisher's
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
   758
                        # cache using this directory.
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
   759
                        self.__user_cache_dir = os.path.normpath(
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
   760
                            os.environ["PKG_CACHEROOT"])
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
   761
                        self.__write_cache_root = self.__user_cache_dir
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
   762
                elif "PKG_CACHEDIR" in os.environ:
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
   763
                        # If set, cache is a flat structure that is used for
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
   764
                        # all publishers.
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   765
                        self.__user_cache_dir = os.path.normpath(
554
fe196874250d 3508 zone install should utilize/populate global zone d/l cache
Dan Price <dp@eng.sun.com>
parents: 552
diff changeset
   766
                            os.environ["PKG_CACHEDIR"])
2148
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
   767
                        self.__write_cache_dir = self.__user_cache_dir
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
   768
                        # Since the cache structure is flat, add it to the
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
   769
                        # list of global read caches.
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
   770
                        self.__read_cache_dirs.append(self.__user_cache_dir)
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
   771
                if self.__user_cache_dir:
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   772
                        self._incoming_cache_dir = os.path.join(
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   773
                            self.__user_cache_dir,
2148
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
   774
                            "incoming-%d" % os.getpid())
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   775
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   776
                if self.version < 4:
2205
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
   777
                        self.__action_cache_dir = self.temporary_dir()
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
   778
                else:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
   779
                        self.__action_cache_dir = os.path.join(self.imgdir,
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
   780
                            "cache")
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
   781
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
   782
                if self.version < 4:
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   783
                        if not self.__user_cache_dir:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   784
                                self.__write_cache_dir = os.path.join(
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   785
                                    self.imgdir, "download")
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   786
                                self._incoming_cache_dir = os.path.join(
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   787
                                    self.__write_cache_dir,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   788
                                    "incoming-%d" % os.getpid())
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   789
                        self.__read_cache_dirs.append(os.path.normpath(
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   790
                            os.path.join(self.imgdir, "download")))
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   791
                elif not self._incoming_cache_dir:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   792
                        # Only a global incoming cache exists for newer images.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   793
                        self._incoming_cache_dir = os.path.join(self.imgdir,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   794
                            "cache", "incoming-%d" % os.getpid())
554
fe196874250d 3508 zone install should utilize/populate global zone d/l cache
Dan Price <dp@eng.sun.com>
parents: 552
diff changeset
   795
1503
78d56b8ee320 12698 download directory must be accessible to non-privileged users
johansen <johansen@sun.com>
parents: 1463
diff changeset
   796
                # Test if we have the permissions to create the cache
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   797
                # incoming directory in this hierarchy.  If not, we'll need to
1503
78d56b8ee320 12698 download directory must be accessible to non-privileged users
johansen <johansen@sun.com>
parents: 1463
diff changeset
   798
                # move it somewhere else.
78d56b8ee320 12698 download directory must be accessible to non-privileged users
johansen <johansen@sun.com>
parents: 1463
diff changeset
   799
                try:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   800
                        os.makedirs(self._incoming_cache_dir)
1503
78d56b8ee320 12698 download directory must be accessible to non-privileged users
johansen <johansen@sun.com>
parents: 1463
diff changeset
   801
                except EnvironmentError, e:
78d56b8ee320 12698 download directory must be accessible to non-privileged users
johansen <johansen@sun.com>
parents: 1463
diff changeset
   802
                        if e.errno == errno.EACCES or e.errno == errno.EROFS:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   803
                                self.__write_cache_dir = tempfile.mkdtemp(
1672
3a71439a03f3 13021 file manager exceptions should be api exceptions
Shawn Walker <srw@sun.com>
parents: 1631
diff changeset
   804
                                    prefix="download-%d-" % os.getpid())
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   805
                                self._incoming_cache_dir = os.path.normpath(
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   806
                                    os.path.join(self.__write_cache_dir,
1672
3a71439a03f3 13021 file manager exceptions should be api exceptions
Shawn Walker <srw@sun.com>
parents: 1631
diff changeset
   807
                                    "incoming-%d" % os.getpid()))
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   808
                                self.__read_cache_dirs.append(
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   809
                                    self.__write_cache_dir)
1771
0965309e1d22 14654 temporary download directory is created regardless of use and never removed
Danek Duvall <danek.duvall@sun.com>
parents: 1755
diff changeset
   810
                                # There's no image cleanup hook, so we'll just
0965309e1d22 14654 temporary download directory is created regardless of use and never removed
Danek Duvall <danek.duvall@sun.com>
parents: 1755
diff changeset
   811
                                # remove this directory on process exit.
1783
94b0b7ed81ea 14800 traceback on exit when PKG_CACHEDIR is set but not writable
Danek Duvall <danek.duvall@sun.com>
parents: 1779
diff changeset
   812
                                atexit.register(shutil.rmtree,
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   813
                                    self.__write_cache_dir, ignore_errors=True)
1503
78d56b8ee320 12698 download directory must be accessible to non-privileged users
johansen <johansen@sun.com>
parents: 1463
diff changeset
   814
                else:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
   815
                        os.removedirs(self._incoming_cache_dir)
1503
78d56b8ee320 12698 download directory must be accessible to non-privileged users
johansen <johansen@sun.com>
parents: 1463
diff changeset
   816
1358
6fec8fbc15a6 11324 package state written to parent boot environment during image-update
Shawn Walker <srw@sun.com>
parents: 1353
diff changeset
   817
                # Forcibly discard image catalogs so they can be re-loaded
6fec8fbc15a6 11324 package state written to parent boot environment during image-update
Shawn Walker <srw@sun.com>
parents: 1353
diff changeset
   818
                # from the new location if they are already loaded.  This
6fec8fbc15a6 11324 package state written to parent boot environment during image-update
Shawn Walker <srw@sun.com>
parents: 1353
diff changeset
   819
                # also prevents scribbling on image state information in
6fec8fbc15a6 11324 package state written to parent boot environment during image-update
Shawn Walker <srw@sun.com>
parents: 1353
diff changeset
   820
                # the wrong location.
1463
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
   821
                self.__init_catalogs()
1358
6fec8fbc15a6 11324 package state written to parent boot environment during image-update
Shawn Walker <srw@sun.com>
parents: 1353
diff changeset
   822
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   823
                # Prepare publishers for transport usage; this must be done
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   824
                # just before configuration is written and transport caches
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   825
                # are reset, but after all of the directory setup work done
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   826
                # above.  This must be done before the format is updated.
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   827
                for pub in self.gen_publishers(inc_disabled=True):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   828
                        pub.meta_root = self._get_publisher_meta_root(
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   829
                            pub.prefix)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   830
                        pub.transport = self.transport
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   831
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   832
                # Upgrade the image's format if needed.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   833
                self.update_format(allow_unprivileged=True,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   834
                    progtrack=progtrack)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   835
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   836
                # If we haven't loaded the system publisher configuration, do
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   837
                # that now.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   838
                if isinstance(self.cfg, imageconfig.ImageConfig):
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   839
                        self.cfg = imageconfig.BlendedConfig(self.cfg,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   840
                            self.get_catalog(self.IMG_CATALOG_INSTALLED).\
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   841
                                get_package_counts_by_pub(),
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   842
                            self.imgdir, self.transport,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   843
                            self.cfg.get_policy("use-system-repo"))
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   844
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   845
                        # This must be done again because new publishers may
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   846
                        # have been added.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   847
                        for pub in self.gen_publishers(inc_disabled=True):
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   848
                                pub.meta_root = self._get_publisher_meta_root(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   849
                                    pub.prefix)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   850
                                pub.transport = self.transport
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   851
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   852
                        # Check to see if any system publishers have been
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   853
                        # removed.  If they have, remove their metadata and
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   854
                        # rebuild the catalogs.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   855
                        changed = False
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   856
                        for p in self.cfg.removed_pubs:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   857
                                p.meta_root = self._get_publisher_meta_root(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   858
                                    p.prefix)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   859
                                self.remove_publisher_metadata(p, rebuild=False)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   860
                                changed = True
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   861
                        if changed:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   862
                                self.__rebuild_image_catalogs()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   863
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   864
                if purge:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   865
                        # Configuration shouldn't be written again unless this
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   866
                        # is an image creation operation (hence the purge).
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   867
                        self.save_config()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   868
2228
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
   869
                # load image avoid pkg set
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
   870
                self.__avoid_set_load()
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
   871
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   872
        def update_format(self, allow_unprivileged=False, progtrack=None):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   873
                """Transform the existing image structure and its data to
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   874
                the newest format.  Callers are responsible for locking.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   875
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   876
                'allow_unprivileged' is an optional boolean indicating
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   877
                whether a fallback to an in-memory only upgrade should
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   878
                be performed if a PermissionsException is encountered
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   879
                during the operation.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   880
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   881
                'progtrack' is an optional ProgressTracker object.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   882
                """
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   883
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   884
                if self.version == self.CURRENT_VERSION:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   885
                        # Already upgraded.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   886
                        self.__upgraded = True
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   887
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   888
                        # If pre-upgrade data still exists; fire off a
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   889
                        # process to dump it so execution can continue.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   890
                        orig_root = self.imgdir + ".old"
2152
623da55258c6 17453 /var/pkg/repo should be preserved during image format upgrades and not used as a default depot location
Shawn Walker <shawn.walker@oracle.com>
parents: 2149
diff changeset
   891
                        nullf = open(os.devnull, "w")
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   892
                        if os.path.exists(orig_root):
2152
623da55258c6 17453 /var/pkg/repo should be preserved during image format upgrades and not used as a default depot location
Shawn Walker <shawn.walker@oracle.com>
parents: 2149
diff changeset
   893
                                # Ensure all output is discarded; it really
623da55258c6 17453 /var/pkg/repo should be preserved during image format upgrades and not used as a default depot location
Shawn Walker <shawn.walker@oracle.com>
parents: 2149
diff changeset
   894
                                # doesn't matter if this succeeds.
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   895
                                subprocess.Popen("rm -rf %s" % orig_root,
2152
623da55258c6 17453 /var/pkg/repo should be preserved during image format upgrades and not used as a default depot location
Shawn Walker <shawn.walker@oracle.com>
parents: 2149
diff changeset
   896
                                    shell=True, stdout=nullf, stderr=nullf)
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   897
                        return False
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   898
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   899
                if not progtrack:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   900
                        progtrack = progress.QuietProgressTracker()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   901
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   902
                # Not technically 'caching', but close enough ...
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   903
                progtrack.cache_catalogs_start()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   904
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   905
                # Upgrade catalog data if needed.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   906
                self.__upgrade_catalogs()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   907
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   908
                # Data conversion finished.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   909
                self.__upgraded = True
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   910
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   911
                # Determine if on-disk portion of the upgrade is allowed.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   912
                if self.allow_ondisk_upgrade == False:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   913
                        return True
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   914
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   915
                if self.allow_ondisk_upgrade is None and self.type != IMG_USER:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   916
                        if not self.is_liveroot() and not self.is_zone():
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   917
                                # By default, don't update image format if it
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   918
                                # is not the live root, and is not for a zone.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   919
                                self.allow_ondisk_upgrade = False
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   920
                                return True
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   921
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   922
                # The logic to perform the on-disk upgrade is in its own
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   923
                # function so that it can easily be wrapped with locking logic.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   924
                with self.locked_op("update-format",
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   925
                    allow_unprivileged=allow_unprivileged):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   926
                        self.__upgrade_image_format(progtrack,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   927
                            allow_unprivileged=allow_unprivileged)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   928
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   929
                progtrack.cache_catalogs_done()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   930
                return True
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   931
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   932
        def __upgrade_catalogs(self):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   933
                """Private helper function for update_format."""
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   934
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   935
                if self.version >= 3:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   936
                        # Nothing to do.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   937
                        return
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   938
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   939
                def installed_file_publisher(filepath):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   940
                        """Find the pkg's installed file named by filepath.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   941
                        Return the publisher that installed this package."""
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   942
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   943
                        f = file(filepath)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   944
                        try:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   945
                                flines = f.readlines()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   946
                                version, pub = flines
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   947
                                version = version.strip()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   948
                                pub = pub.strip()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   949
                                f.close()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   950
                        except ValueError:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   951
                                # If ValueError occurs, the installed file is of
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   952
                                # a previous format.  For upgrades to work, it's
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   953
                                # necessary to assume that the package was
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   954
                                # installed from the highest ranked publisher.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   955
                                # Here, the publisher is setup to record that.
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   956
                                if flines:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   957
                                        pub = flines[0]
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   958
                                        pub = pub.strip()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   959
                                        newpub = "%s_%s" % (
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   960
                                            pkg.fmri.PREF_PUB_PFX, pub)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   961
                                else:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   962
                                        newpub = "%s_%s" % (
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   963
                                            pkg.fmri.PREF_PUB_PFX,
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
   964
                                            self.get_highest_ranked_publisher())
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   965
                                pub = newpub
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   966
                        assert pub
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   967
                        return pub
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   968
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   969
                # First, load the old package state information.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   970
                installed_state_dir = "%s/state/installed" % self.imgdir
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   971
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   972
                # If the state directory structure has already been created,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   973
                # loading information from it is fast.  The directory is
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   974
                # populated with files, named by their (url-encoded) FMRI,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   975
                # which point to the "installed" file in the corresponding
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   976
                # directory under /var/pkg.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   977
                installed = {}
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   978
                def add_installed_entry(f):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   979
                        path = "%s/pkg/%s/installed" % \
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   980
                            (self.imgdir, f.get_dir_path())
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   981
                        pub = installed_file_publisher(path)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   982
                        f.set_publisher(pub)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   983
                        installed[f.pkg_name] = f
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   984
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   985
                for pl in os.listdir(installed_state_dir):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   986
                        fmristr = "%s" % urllib.unquote(pl)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   987
                        f = pkg.fmri.PkgFmri(fmristr)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   988
                        add_installed_entry(f)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   989
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   990
                # Create the new image catalogs.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   991
                kcat = pkg.catalog.Catalog(batch_mode=True,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   992
                    manifest_cb=self._manifest_cb, sign=False)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   993
                icat = pkg.catalog.Catalog(batch_mode=True,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   994
                    manifest_cb=self._manifest_cb, sign=False)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   995
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   996
                # XXX For backwards compatibility, 'upgradability' of packages
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   997
                # is calculated and stored based on whether a given pkg stem
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   998
                # matches the newest version in the catalog.  This is quite
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
   999
                # expensive (due to overhead), but at least the cost is
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1000
                # consolidated here.  This comparison is also cross-publisher,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1001
                # as it used to be.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1002
                newest = {}
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1003
                old_pub_cats = []
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  1004
                for pub in self.gen_publishers():
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1005
                        try:
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1006
                                old_cat = pkg.server.catalog.ServerCatalog(
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1007
                                    pub.meta_root, read_only=True,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1008
                                    publisher=pub.prefix)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1009
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1010
                                old_pub_cats.append((pub, old_cat))
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1011
                                for f in old_cat.fmris():
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1012
                                        nver = newest.get(f.pkg_name, None)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1013
                                        newest[f.pkg_name] = max(nver,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1014
                                            f.version)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1015
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1016
                        except EnvironmentError, e:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1017
                                # If a catalog file is just missing, ignore it.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1018
                                # If there's a worse error, make sure the user
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1019
                                # knows about it.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1020
                                if e.errno != errno.ENOENT:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1021
                                        raise
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1022
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1023
                # Next, load the existing catalog data and convert it.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1024
                pub_cats = []
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1025
                for pub, old_cat in old_pub_cats:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1026
                        new_cat = pub.catalog
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1027
                        new_cat.batch_mode = True
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1028
                        new_cat.sign = False
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1029
                        if new_cat.exists:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1030
                                new_cat.destroy()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1031
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1032
                        # First convert the old publisher catalog to
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1033
                        # the new format.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1034
                        for f in old_cat.fmris():
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1035
                                new_cat.add_package(f)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1036
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1037
                                # Now populate the image catalogs.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1038
                                states = [self.PKG_STATE_KNOWN,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1039
                                    self.PKG_STATE_V0]
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1040
                                mdata = { "states": states }
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1041
                                if f.version != newest[f.pkg_name]:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1042
                                        states.append(self.PKG_STATE_UPGRADABLE)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1043
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1044
                                inst_fmri = installed.get(f.pkg_name, None)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1045
                                if inst_fmri and \
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1046
                                    inst_fmri.version == f.version and \
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1047
                                    pkg.fmri.is_same_publisher(f.publisher,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1048
                                    inst_fmri.publisher):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1049
                                        states.append(self.PKG_STATE_INSTALLED)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1050
                                        if inst_fmri.preferred_publisher():
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1051
                                                # Strip the PREF_PUB_PFX.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1052
                                                inst_fmri.set_publisher(
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1053
                                                    inst_fmri.get_publisher())
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1054
                                        icat.add_package(f, metadata=mdata)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1055
                                        del installed[f.pkg_name]
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1056
                                kcat.add_package(f, metadata=mdata)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1057
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1058
                        # Normally, the Catalog's attributes are automatically
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1059
                        # populated as a result of catalog operations.  But in
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1060
                        # this case, the new Catalog's attributes should match
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1061
                        # those of the old catalog.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1062
                        old_lm = old_cat.last_modified()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1063
                        if old_lm:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1064
                                # Can be None for empty v0 catalogs.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1065
                                old_lm = pkg.catalog.ts_to_datetime(old_lm)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1066
                        new_cat.last_modified = old_lm
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1067
                        new_cat.version = 0
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1068
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1069
                        # Add to the list of catalogs to save.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1070
                        new_cat.batch_mode = False
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1071
                        pub_cats.append(new_cat)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1072
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1073
                # Discard the old catalog objects.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1074
                old_pub_cats = None
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1075
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1076
                for f in installed.values():
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1077
                        # Any remaining FMRIs need to be added to all of the
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1078
                        # image catalogs.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1079
                        states = [self.PKG_STATE_INSTALLED, self.PKG_STATE_V0]
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1080
                        mdata = { "states": states }
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1081
                        # This package may be installed from a publisher that
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1082
                        # is no longer known or has been disabled.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1083
                        if f.pkg_name in newest and \
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1084
                            f.version != newest[f.pkg_name]:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1085
                                states.append(self.PKG_STATE_UPGRADABLE)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1086
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1087
                        if f.preferred_publisher():
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1088
                                # Strip the PREF_PUB_PFX.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1089
                                f.set_publisher(f.get_publisher())
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1090
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1091
                        icat.add_package(f, metadata=mdata)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1092
                        kcat.add_package(f, metadata=mdata)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1093
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1094
                for cat in pub_cats + [kcat, icat]:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1095
                        cat.finalize()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1096
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1097
                # Cache converted catalogs so that operations can function as
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1098
                # expected if the on-disk format of the catalogs isn't upgraded.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1099
                self.__catalogs[self.IMG_CATALOG_KNOWN] = kcat
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1100
                self.__catalogs[self.IMG_CATALOG_INSTALLED] = icat
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1101
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1102
        def __upgrade_image_format(self, progtrack, allow_unprivileged=False):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1103
                """Private helper function for update_format."""
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1104
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1105
                try:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1106
                        # Ensure Image directory structure is valid.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1107
                        self.mkdirs()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1108
                except apx.PermissionsException, e:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1109
                        if not allow_unprivileged:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1110
                                raise
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1111
                        # An unprivileged user is attempting to use the
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1112
                        # new client with an old image.  Since none of
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1113
                        # the changes can be saved, warn the user and
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1114
                        # then return.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1115
                        #
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1116
                        # Raising an exception here would be a decidedly
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1117
                        # bad thing as it would disrupt find_root, etc.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1118
                        return
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1119
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1120
                # This has to be done after the permissions check above.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1121
                # First, create a new temporary root to store the converted
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1122
                # image metadata.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1123
                tmp_root = self.imgdir + ".new"
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1124
                try:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1125
                        shutil.rmtree(tmp_root)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1126
                except EnvironmentError, e:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1127
                        if e.errno in (errno.EROFS, errno.EPERM) and \
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1128
                            allow_unprivileged:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1129
                                # Bail.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1130
                                return
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1131
                        if e.errno != errno.ENOENT:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1132
                                raise apx._convert_error(e)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1133
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1134
                try:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1135
                        self.mkdirs(root=tmp_root, version=self.CURRENT_VERSION)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1136
                except apx.PermissionsException, e:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1137
                        # Same handling needed as above; but not after this.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1138
                        if not allow_unprivileged:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1139
                                raise
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1140
                        return
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1141
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1142
                def linktree(src_root, dest_root):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1143
                        if not os.path.exists(src_root):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1144
                                # Nothing to do.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1145
                                return
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1146
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1147
                        for entry in os.listdir(src_root):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1148
                                src = os.path.join(src_root, entry)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1149
                                dest = os.path.join(dest_root, entry)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1150
                                if os.path.isdir(src):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1151
                                        # Recurse into directory to link
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1152
                                        # its contents.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1153
                                        misc.makedirs(dest)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1154
                                        linktree(src, dest)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1155
                                        continue
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1156
                                # Link source file into target dest.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1157
                                assert os.path.isfile(src)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1158
                                try:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1159
                                        os.link(src, dest)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1160
                                except EnvironmentError, e:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1161
                                        raise apx._convert_error(e)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1162
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1163
                # Next, link history data into place.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1164
                linktree(self.history.path, os.path.join(tmp_root,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1165
                    "history"))
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1166
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1167
                # Next, link index data into place.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1168
                linktree(self.index_dir, os.path.join(tmp_root,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1169
                    "cache", "index"))
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1170
2152
623da55258c6 17453 /var/pkg/repo should be preserved during image format upgrades and not used as a default depot location
Shawn Walker <shawn.walker@oracle.com>
parents: 2149
diff changeset
  1171
                # Next, link ssl data into place.
623da55258c6 17453 /var/pkg/repo should be preserved during image format upgrades and not used as a default depot location
Shawn Walker <shawn.walker@oracle.com>
parents: 2149
diff changeset
  1172
                linktree(os.path.join(self.imgdir, "ssl"),
623da55258c6 17453 /var/pkg/repo should be preserved during image format upgrades and not used as a default depot location
Shawn Walker <shawn.walker@oracle.com>
parents: 2149
diff changeset
  1173
                    os.path.join(tmp_root, "ssl"))
623da55258c6 17453 /var/pkg/repo should be preserved during image format upgrades and not used as a default depot location
Shawn Walker <shawn.walker@oracle.com>
parents: 2149
diff changeset
  1174
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1175
                # Next, write state data into place.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1176
                if self.version < 3:
2183
21ae45e8dfcf 17581 There should be a way of removing a package as part of upgrade
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2178
diff changeset
  1177
                        # Image state and publisher metadata
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1178
                        tmp_state_root = os.path.join(tmp_root, "state")
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1179
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1180
                        # Update image catalog locations.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1181
                        kcat = self.get_catalog(self.IMG_CATALOG_KNOWN)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1182
                        icat = self.get_catalog(self.IMG_CATALOG_INSTALLED)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1183
                        kcat.meta_root = os.path.join(tmp_state_root,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1184
                            self.IMG_CATALOG_KNOWN)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1185
                        icat.meta_root = os.path.join(tmp_state_root,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1186
                            self.IMG_CATALOG_INSTALLED)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1187
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1188
                        # Assume that since mkdirs succeeded that the remaining
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1189
                        # data can be saved and the image structure can be
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1190
                        # upgraded.  But first, attempt to save the image
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1191
                        # catalogs.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1192
                        for cat in icat, kcat:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1193
                                misc.makedirs(cat.meta_root)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1194
                                cat.save()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1195
                else:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1196
                        # For version 3 and newer images, just link existing
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1197
                        # state information into place.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1198
                        linktree(self._statedir, os.path.join(tmp_root,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1199
                            "state"))
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1200
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1201
                # Reset each publisher's meta_root and ensure its complete
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1202
                # directory structure is intact.  Then either link in or
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1203
                # write out the metadata for each publisher.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1204
                for pub in self.gen_publishers():
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1205
                        old_root = pub.meta_root
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1206
                        old_cat_root = pub.catalog_root
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1207
                        old_cert_root = pub.cert_root
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1208
                        pub.meta_root = os.path.join(tmp_root,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1209
                            IMG_PUB_DIR, pub.prefix)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1210
                        pub.create_meta_root()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1211
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1212
                        if self.version < 3:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1213
                                # Should be loaded in memory and transformed
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1214
                                # already, so just need to be written out.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1215
                                pub.catalog.save()
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1216
                                continue
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  1217
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1218
                        # Now link any catalog or cert files from the old root
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1219
                        # into the new root.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1220
                        linktree(old_cat_root, pub.catalog_root)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1221
                        linktree(old_cert_root, pub.cert_root)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1222
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1223
                        # Finally, create a directory for the publisher's
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1224
                        # manifests to live in.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1225
                        misc.makedirs(os.path.join(pub.meta_root, "pkg"))
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1226
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1227
                # Next, link licenses and manifests of installed packages into
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1228
                # new image dir.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1229
                for pfmri in self.gen_installed_pkgs():
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1230
                        # Link licenses.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1231
                        mdir = self.get_manifest_dir(pfmri)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1232
                        for entry in os.listdir(mdir):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1233
                                if not entry.startswith("license."):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1234
                                        continue
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1235
                                src = os.path.join(mdir, entry)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1236
                                if os.path.isdir(src):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1237
                                        # Ignore broken licenses.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1238
                                        continue
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1239
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1240
                                # For conversion, ensure destination link uses
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1241
                                # encoded license name to match how new image
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1242
                                # format stores licenses.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1243
                                dest = os.path.join(tmp_root, "license",
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1244
                                    pfmri.get_dir_path(stemonly=True),
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1245
                                    urllib.quote(entry, ""))
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1246
                                misc.makedirs(os.path.dirname(dest))
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1247
                                try:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1248
                                        os.link(src, dest)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1249
                                except EnvironmentError, e:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1250
                                        raise apx._convert_error(e)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1251
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1252
                        # Link manifest.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1253
                        src = self.get_manifest_path(pfmri)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1254
                        dest = os.path.join(tmp_root, "publisher",
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1255
                            pfmri.publisher, "pkg", pfmri.get_dir_path())
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1256
                        misc.makedirs(os.path.dirname(dest))
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1257
                        try:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1258
                                os.link(src, dest)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1259
                        except EnvironmentError, e:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1260
                                raise apx._convert_error(e)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1261
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1262
                # Next, copy the old configuration into the new location using
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1263
                # the new name.  The configuration is copied instead of being
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1264
                # linked so that any changes to configuration as a result of
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1265
                # the upgrade won't be written into the old image directory.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1266
                src = os.path.join(self.imgdir, "disabled_auth")
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1267
                if os.path.exists(src):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1268
                        dest = os.path.join(tmp_root, "disabled_auth")
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1269
                        portable.copyfile(src, dest)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1270
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1271
                src = self.cfg.target
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1272
                dest = os.path.join(tmp_root, "pkg5.image")
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1273
                try:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1274
                        portable.copyfile(src, dest)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1275
                except EnvironmentError, e:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1276
                        raise apx._convert_error(e)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1277
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1278
                # Update the new configuration's version information and then
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1279
                # write it out again.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1280
                newcfg = imageconfig.ImageConfig(dest, tmp_root,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1281
                    version=3, overrides={ "image": {
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1282
                    "version": self.CURRENT_VERSION } })
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1283
                newcfg._version = 3
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1284
                newcfg.write()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1285
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1286
                # Now reload configuration and write again to configuration data
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1287
                # reflects updated version information.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1288
                newcfg.reset()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1289
                newcfg.write()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1290
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1291
                # Finally, rename the old package metadata directory, then
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1292
                # rename the new one into place, and then reinitialize.  The
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1293
                # old data will be dumped during initialization.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1294
                orig_root = self.imgdir + ".old"
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1295
                try:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1296
                        portable.rename(self.imgdir, orig_root)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1297
                        portable.rename(tmp_root, self.imgdir)
2152
623da55258c6 17453 /var/pkg/repo should be preserved during image format upgrades and not used as a default depot location
Shawn Walker <shawn.walker@oracle.com>
parents: 2149
diff changeset
  1298
623da55258c6 17453 /var/pkg/repo should be preserved during image format upgrades and not used as a default depot location
Shawn Walker <shawn.walker@oracle.com>
parents: 2149
diff changeset
  1299
                        # /var/pkg/repo is renamed into place instead of being
623da55258c6 17453 /var/pkg/repo should be preserved during image format upgrades and not used as a default depot location
Shawn Walker <shawn.walker@oracle.com>
parents: 2149
diff changeset
  1300
                        # linked piece-by-piece for performance reasons.
623da55258c6 17453 /var/pkg/repo should be preserved during image format upgrades and not used as a default depot location
Shawn Walker <shawn.walker@oracle.com>
parents: 2149
diff changeset
  1301
                        # Crawling the entire tree structure of a repository is
623da55258c6 17453 /var/pkg/repo should be preserved during image format upgrades and not used as a default depot location
Shawn Walker <shawn.walker@oracle.com>
parents: 2149
diff changeset
  1302
                        # far slower than simply renaming the top level
623da55258c6 17453 /var/pkg/repo should be preserved during image format upgrades and not used as a default depot location
Shawn Walker <shawn.walker@oracle.com>
parents: 2149
diff changeset
  1303
                        # directory (since it often has thousands or millions
623da55258c6 17453 /var/pkg/repo should be preserved during image format upgrades and not used as a default depot location
Shawn Walker <shawn.walker@oracle.com>
parents: 2149
diff changeset
  1304
                        # of objects).
623da55258c6 17453 /var/pkg/repo should be preserved during image format upgrades and not used as a default depot location
Shawn Walker <shawn.walker@oracle.com>
parents: 2149
diff changeset
  1305
                        old_repo = os.path.join(orig_root, "repo")
623da55258c6 17453 /var/pkg/repo should be preserved during image format upgrades and not used as a default depot location
Shawn Walker <shawn.walker@oracle.com>
parents: 2149
diff changeset
  1306
                        if os.path.exists(old_repo):
623da55258c6 17453 /var/pkg/repo should be preserved during image format upgrades and not used as a default depot location
Shawn Walker <shawn.walker@oracle.com>
parents: 2149
diff changeset
  1307
                                new_repo = os.path.join(tmp_root, "repo")
623da55258c6 17453 /var/pkg/repo should be preserved during image format upgrades and not used as a default depot location
Shawn Walker <shawn.walker@oracle.com>
parents: 2149
diff changeset
  1308
                                portable.rename(old_repo, new_repo)
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1309
                except EnvironmentError, e:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1310
                        raise apx._convert_error(e)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1311
                self.find_root(self.root, exact_match=True, progtrack=progtrack)
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  1312
1736
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1313
        def create(self, pubs, facets=EmptyDict, is_zone=False,  progtrack=None,
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
  1314
            props=EmptyDict, refresh_allowed=True, variants=EmptyDict):
1504
265a1d6b86bd 9969 client support for multiple origins desired
Shawn Walker <srw@sun.com>
parents: 1503
diff changeset
  1315
                """Creates a new image with the given attributes if it does not
1736
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1316
                exist; should not be used with an existing image.
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1317
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1318
                'is_zone' is a boolean indicating whether the image is a zone.
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1319
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1320
                'pubs' is a list of Publisher objects to configure the image
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1321
                with.
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1322
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1323
                'refresh_allowed' is an optional boolean indicating that
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1324
                network operations (such as publisher data retrieval) are
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1325
                allowed.
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1326
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1327
                'progtrack' is an optional ProgressTracker object.
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1328
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
  1329
                'props' is an option dictionary mapping image property names to
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
  1330
                values.
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
  1331
1736
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1332
                'variants' is an optional dictionary of variant names and
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1333
                values.
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1334
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1335
                'facets' is an optional dictionary of facet names and values.
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1336
                """
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1337
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1338
                for p in pubs:
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1339
                        p.meta_root = self._get_publisher_meta_root(p.prefix)
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1340
                        p.transport = self.transport
1086
16500d7bf1ca 8321 image_create should not validate publisher uri
Shawn Walker <srw@sun.com>
parents: 1085
diff changeset
  1341
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1342
                # Override any initial configuration information.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1343
                self.set_properties(props)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1344
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1345
                # Start the operation.
1736
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1346
                self.history.log_operation_start("image-create")
539
7486304966c5 1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents: 537
diff changeset
  1347
1102
5ea5cdb4360d 5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents: 1087
diff changeset
  1348
                # Determine and add the default variants for the image.
111
647c91609117 Client-side filtering.
Danek Duvall <danek.duvall@sun.com>
parents: 107
diff changeset
  1349
                if is_zone:
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1350
                        self.cfg.variants["variant.opensolaris.zone"] = \
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1351
                            "nonglobal"
838
aafbe4737188 3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 835
diff changeset
  1352
                else:
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1353
                        self.cfg.variants["variant.opensolaris.zone"] = \
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1354
                            "global"
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1355
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1356
                self.cfg.variants["variant.arch"] = \
838
aafbe4737188 3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 835
diff changeset
  1357
                    variants.get("variant.arch", platform.processor())
1102
5ea5cdb4360d 5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents: 1087
diff changeset
  1358
5ea5cdb4360d 5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents: 1087
diff changeset
  1359
                # After setting up the default variants, add any overrides or
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  1360
                # additional variants or facets specified.
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1361
                self.cfg.variants.update(variants)
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1362
                self.cfg.facets.update(facets)
838
aafbe4737188 3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 835
diff changeset
  1363
1102
5ea5cdb4360d 5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents: 1087
diff changeset
  1364
                # Now everything is ready for publisher configuration.
1736
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1365
                # Since multiple publishers are allowed, they are all
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1366
                # added at once without any publisher data retrieval.
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1367
                # A single retrieval is then performed afterwards, if
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
  1368
                # allowed, to minimize the amount of work the client
1736
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1369
                # needs to perform.
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1370
                for p in pubs:
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1371
                        self.add_publisher(p, refresh_allowed=False,
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1372
                            progtrack=progtrack)
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1373
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1374
                if refresh_allowed:
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1375
                        self.refresh_publishers(progtrack=progtrack)
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1376
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1377
                self.cfg.set_property("property", "publisher-search-order",
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1378
                    [p.prefix for p in pubs])
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1379
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1380
                # Ensure publisher search order is written.
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1381
                self.save_config()
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1382
1087
293c0aa5f32e 8214 load_catalogs should only load catalog data when needed
Shawn Walker <srw@sun.com>
parents: 1086
diff changeset
  1383
                self.history.log_operation_end()
104
ecfc64baf22e add naive configuration, naive global/preferred authorities, delete content
Stephen Hahn <sch@sun.com>
parents: 87
diff changeset
  1384
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 302
diff changeset
  1385
        def is_liveroot(self):
1537
00a5b4d54eb8 5872 List APIs required
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
  1386
                return bool(self.root == "/" or
2158
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
  1387
                    self.root == DebugValues.get_value("simulate_live_root"))
281
81a0bb7f7d63 217 packages need to be able to [un]install users (groups, roles, etc)
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 271
diff changeset
  1388
344
4c887185d780 528 pkg list -u gives confusing output
Dan Price <dp@eng.sun.com>
parents: 342
diff changeset
  1389
        def is_zone(self):
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1390
                return self.cfg.variants["variant.opensolaris.zone"] == \
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1391
                    "nonglobal"
838
aafbe4737188 3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 835
diff changeset
  1392
aafbe4737188 3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 835
diff changeset
  1393
        def get_arch(self):
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1394
                return self.cfg.variants["variant.arch"]
344
4c887185d780 528 pkg list -u gives confusing output
Dan Price <dp@eng.sun.com>
parents: 342
diff changeset
  1395
2105
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1396
        def has_boot_archive(self):
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1397
                """Returns True if a boot_archive is present in this image"""
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1398
                if self.__boot_archive is not None:
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1399
                        return self.__boot_archive
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1400
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1401
                for p in ["platform/i86pc/amd64/boot_archive",
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1402
                          "platform/i86pc/boot_archive",
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1403
                          "platform/sun4u/boot_archive",
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1404
                          "platform/sun4v/boot_archive"]:
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1405
                        if os.path.isfile(os.path.join(self.root, p)):
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1406
                                self.__boot_archive = True
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1407
                                break
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1408
                else:
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1409
                        self.__boot_archive = False
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1410
                return self.__boot_archive
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1411
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1412
        def get_ramdisk_filelist(self):
2183
21ae45e8dfcf 17581 There should be a way of removing a package as part of upgrade
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2178
diff changeset
  1413
                """return the filelist... add the filelist so we rebuild
21ae45e8dfcf 17581 There should be a way of removing a package as part of upgrade
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2178
diff changeset
  1414
                boot archive if it changes... append trailing / to
2105
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1415
                directories that are really there"""
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1416
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1417
                p = "boot/solaris/filelist.ramdisk"
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1418
                f = os.path.join(self.root, p)
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1419
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1420
                def addslash(path):
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1421
                        if os.path.isdir(os.path.join(self.root, path)):
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1422
                                return path + "/"
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1423
                        return path
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1424
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1425
                if not os.path.isfile(f):
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1426
                        return []
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1427
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1428
                return [ addslash(l.strip()) for l in file(f) ] + [p]
212a253a462a 12530 pkg -R install doesn't update boot archive
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2097
diff changeset
  1429
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  1430
        def get_cachedirs(self):
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  1431
                """Returns a list of tuples of the form (dir, readonly, pub)
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  1432
                where 'dir' is the absolute path of the cache directory,
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  1433
                'readonly' is a boolean indicating whether the cache can
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  1434
                be written to, and 'pub' is the prefix of the publisher that
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  1435
                the cache directory should be used for.  If 'pub' is None, the
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  1436
                cache directory is intended for all publishers.
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  1437
                """
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  1438
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  1439
                # Get all readonly cache directories.
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  1440
                cdirs = [
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  1441
                    (cdir, True, None)
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  1442
                    for cdir in self.__read_cache_dirs
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  1443
                ]
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  1444
2148
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
  1445
                # Get global write cache directory.
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1446
                if self.__write_cache_dir:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1447
                        cdirs.append((self.__write_cache_dir, False, None))
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1448
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1449
                # For images newer than version 3, file data can be stored
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1450
                # in the publisher's file root.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1451
                if self.version == self.CURRENT_VERSION:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1452
                        for pub in self.gen_publishers(inc_disabled=True):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1453
                                froot = os.path.join(pub.meta_root, "file")
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1454
                                readonly = False
2148
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
  1455
                                if self.__write_cache_dir or \
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
  1456
                                    self.__write_cache_root:
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1457
                                        readonly = True
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1458
                                cdirs.append((froot, readonly, pub.prefix))
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  1459
2148
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
  1460
                                if self.__write_cache_root:
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
  1461
                                        # Cache is a tree structure like
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
  1462
                                        # /var/pkg/publisher.
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
  1463
                                        froot = os.path.join(
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
  1464
                                            self.__write_cache_root, pub.prefix,
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
  1465
                                            "file")
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
  1466
                                        cdirs.append((froot, False, pub.prefix))
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
  1467
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  1468
                return cdirs
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  1469
29
f621f1df0849 fix install target; correct imports for module renames
"Stephen Hahn <sch@sun.com>"
parents: 26
diff changeset
  1470
        def get_root(self):
f621f1df0849 fix install target; correct imports for module renames
"Stephen Hahn <sch@sun.com>"
parents: 26
diff changeset
  1471
                return self.root
f621f1df0849 fix install target; correct imports for module renames
"Stephen Hahn <sch@sun.com>"
parents: 26
diff changeset
  1472
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  1473
        def get_last_modified(self):
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  1474
                """Returns a UTC datetime object representing the time the
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  1475
                image's state last changed or None if unknown."""
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  1476
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  1477
                # Always get last_modified time from known catalog.  It's
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  1478
                # retrieved from the catalog itself since that is accurate
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  1479
                # down to the micrsecond (as opposed to the filesystem which
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  1480
                # has an OS-specific resolution).
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  1481
                return self.__get_catalog(self.IMG_CATALOG_KNOWN).last_modified
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  1482
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1483
        def gen_publishers(self, inc_disabled=False):
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1484
                if not self.cfg:
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1485
                        raise apx.ImageCfgEmptyError(self.root)
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1486
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1487
                alt_pubs = {}
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1488
                if self.__alt_pkg_pub_map:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1489
                        alt_src_pubs = dict(
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1490
                            (p.prefix, p)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1491
                            for p in self.__alt_pubs
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1492
                        )
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1493
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1494
                        for pfx in self.__alt_known_cat.publishers():
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1495
                                # Include alternate package source publishers
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1496
                                # in result, and temporarily enable any
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1497
                                # disabled publishers that already exist in
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1498
                                # the image configuration.
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1499
                                try:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1500
                                        img_pub = self.cfg.publishers[pfx]
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1501
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1502
                                        if not img_pub.disabled:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1503
                                                # No override needed.
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1504
                                                continue
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1505
                                        new_pub = copy.copy(img_pub)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1506
                                        new_pub.disabled = False
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1507
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1508
                                        # Discard origins and mirrors to prevent
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1509
                                        # their accidental use.
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1510
                                        repo = new_pub.repository
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1511
                                        repo.reset_origins()
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1512
                                        repo.reset_mirrors()
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1513
                                except KeyError:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1514
                                        new_pub = alt_src_pubs[pfx]
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1515
                                        new_pub.meta_root = \
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1516
                                            self._get_publisher_meta_root(pfx)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1517
                                        new_pub.transport = self.transport
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1518
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1519
                                alt_pubs[pfx] = new_pub
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1520
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1521
                publishers = [
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1522
                    alt_pubs.get(p.prefix, p)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1523
                    for p in self.cfg.publishers.values()
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1524
                ]
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1525
                publishers.extend((
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1526
                    p for p in alt_pubs.values()
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1527
                    if p not in publishers
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1528
                ))
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1529
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1530
                for pub in publishers:
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1531
                        if inc_disabled or not pub.disabled:
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1532
                                yield pub
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1533
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  1534
        def get_publisher_ranks(self):
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  1535
                """Returns dictionary of publishers by name; each
1537
00a5b4d54eb8 5872 List APIs required
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
  1536
                entry contains a tuple of search order index starting
00a5b4d54eb8 5872 List APIs required
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
  1537
                at 0, and a boolean indicating whether or not
1786
14c232a5a4a0 14788 sometimes upgrade from osol 133 to onips 133 (with renames) doesn't work
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1783
diff changeset
  1538
                this publisher is "sticky", and a boolean indicating
14c232a5a4a0 14788 sometimes upgrade from osol 133 to onips 133 (with renames) doesn't work
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1783
diff changeset
  1539
                whether or not the publisher is enabled"""
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  1540
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  1541
                # automatically make disabled publishers not sticky
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1542
                so = copy.copy(self.cfg.get_property("property",
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1543
                    "publisher-search-order"))
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1544
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1545
                pubs = list(self.gen_publishers())
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1546
                so.extend((p.prefix for p in pubs if p.prefix not in so))
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  1547
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  1548
                ret = dict([
1786
14c232a5a4a0 14788 sometimes upgrade from osol 133 to onips 133 (with renames) doesn't work
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1783
diff changeset
  1549
                    (p.prefix, (so.index(p.prefix), p.sticky, True))
1537
00a5b4d54eb8 5872 List APIs required
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
  1550
                    for p in self.gen_publishers()
00a5b4d54eb8 5872 List APIs required
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
  1551
                ])
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  1552
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  1553
                # add any publishers for pkgs that are installed,
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  1554
                # but have been deleted... so they're not sticky.
1537
00a5b4d54eb8 5872 List APIs required
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
  1555
                for pub in self.get_installed_pubs():
1786
14c232a5a4a0 14788 sometimes upgrade from osol 133 to onips 133 (with renames) doesn't work
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1783
diff changeset
  1556
                        ret.setdefault(pub, (len(ret) + 1, False, False))
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  1557
                return ret
1537
00a5b4d54eb8 5872 List APIs required
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
  1558
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1559
        def get_highest_ranked_publisher(self):
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1560
                """Return the highest ranked publisher."""
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1561
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1562
                pubs = self.cfg.get_property("property",
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1563
                    "publisher-search-order")
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1564
                if pubs:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1565
                        return self.get_publisher(prefix=pubs[0])
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1566
                for p in self.gen_publishers():
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1567
                        return p
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1568
                for p in self.get_installed_pubs():
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1569
                        return p
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1570
                return None
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1571
479
de75c17238ff 2951 Client should check if its SSL certificates have expired
johansen <johansen@sun.com>
parents: 462
diff changeset
  1572
        def check_cert_validity(self):
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1573
                """Look through the publishers defined for the image.  Print
479
de75c17238ff 2951 Client should check if its SSL certificates have expired
johansen <johansen@sun.com>
parents: 462
diff changeset
  1574
                a message and exit with an error if one of the certificates
de75c17238ff 2951 Client should check if its SSL certificates have expired
johansen <johansen@sun.com>
parents: 462
diff changeset
  1575
                has expired.  If certificates are getting close to expiration,
de75c17238ff 2951 Client should check if its SSL certificates have expired
johansen <johansen@sun.com>
parents: 462
diff changeset
  1576
                print a warning instead."""
de75c17238ff 2951 Client should check if its SSL certificates have expired
johansen <johansen@sun.com>
parents: 462
diff changeset
  1577
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1578
                for p in self.gen_publishers():
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1579
                        r = p.repository
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1580
                        for uri in r.origins:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1581
                                if uri.ssl_cert:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1582
                                        misc.validate_ssl_cert(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1583
                                            uri.ssl_cert,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1584
                                            prefix=p.prefix, uri=uri)
479
de75c17238ff 2951 Client should check if its SSL certificates have expired
johansen <johansen@sun.com>
parents: 462
diff changeset
  1585
                return True
de75c17238ff 2951 Client should check if its SSL certificates have expired
johansen <johansen@sun.com>
parents: 462
diff changeset
  1586
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1587
        def has_publisher(self, prefix=None, alias=None):
1252
3b1b69011fcf 8709 ImageInterface.has_publisher has incorrect docstring
Shawn Walker <srw@sun.com>
parents: 1237
diff changeset
  1588
                """Returns a boolean value indicating whether a publisher
3b1b69011fcf 8709 ImageInterface.has_publisher has incorrect docstring
Shawn Walker <srw@sun.com>
parents: 1237
diff changeset
  1589
                exists in the image configuration that matches the given
3b1b69011fcf 8709 ImageInterface.has_publisher has incorrect docstring
Shawn Walker <srw@sun.com>
parents: 1237
diff changeset
  1590
                prefix or alias."""
3b1b69011fcf 8709 ImageInterface.has_publisher has incorrect docstring
Shawn Walker <srw@sun.com>
parents: 1237
diff changeset
  1591
                for pub in self.gen_publishers(inc_disabled=True):
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1592
                        if prefix == pub.prefix or (alias and
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1593
                            alias == pub.alias):
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1594
                                return True
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1595
                return False
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1596
1087
293c0aa5f32e 8214 load_catalogs should only load catalog data when needed
Shawn Walker <srw@sun.com>
parents: 1086
diff changeset
  1597
        def remove_publisher(self, prefix=None, alias=None, progtrack=None):
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  1598
                """Removes the publisher with the matching identity from the
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  1599
                image."""
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  1600
1087
293c0aa5f32e 8214 load_catalogs should only load catalog data when needed
Shawn Walker <srw@sun.com>
parents: 1086
diff changeset
  1601
                if not progtrack:
293c0aa5f32e 8214 load_catalogs should only load catalog data when needed
Shawn Walker <srw@sun.com>
parents: 1086
diff changeset
  1602
                        progtrack = progress.QuietProgressTracker()
293c0aa5f32e 8214 load_catalogs should only load catalog data when needed
Shawn Walker <srw@sun.com>
parents: 1086
diff changeset
  1603
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  1604
                with self.locked_op("remove-publisher"):
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1605
                        pub = self.get_publisher(prefix=prefix,
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1606
                            alias=alias)
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  1607
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1608
                        self.cfg.remove_publisher(pub.prefix)
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  1609
                        self.remove_publisher_metadata(pub, progtrack=progtrack)
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  1610
                        self.save_config()
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1611
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1612
        def get_publishers(self):
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1613
                return dict(
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1614
                    (p.prefix, p)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1615
                    for p in self.gen_publishers(inc_disabled=True)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1616
                )
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1617
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1618
        def get_publisher(self, prefix=None, alias=None, origin=None):
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1619
                for pub in self.gen_publishers(inc_disabled=True):
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1620
                        if prefix and prefix == pub.prefix:
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1621
                                return pub
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1622
                        elif alias and alias == pub.alias:
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1623
                                return pub
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1624
                        elif origin and pub.repository and \
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1625
                            pub.repository.has_origin(origin):
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1626
                                return pub
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  1627
                raise apx.UnknownPublisher(max(prefix, alias, origin))
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1628
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  1629
        def pub_search_before(self, being_moved, staying_put):
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  1630
                """Moves publisher "being_moved" to before "staying_put"
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1631
                in search order.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1632
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1633
                The caller is responsible for locking the image."""
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1634
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1635
                self.cfg.change_publisher_search_order(being_moved, staying_put,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1636
                    after=False)
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  1637
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  1638
        def pub_search_after(self, being_moved, staying_put):
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  1639
                """Moves publisher "being_moved" to after "staying_put"
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1640
                in search order.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1641
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1642
                The caller is responsible for locking the image."""
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1643
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1644
                self.cfg.change_publisher_search_order(being_moved, staying_put,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1645
                    after=True)
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1646
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1647
        def __apply_alt_pkg_sources(self, img_kcat):
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1648
                pkg_pub_map = self.__alt_pkg_pub_map
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1649
                if not pkg_pub_map or self.__alt_pkg_sources_loaded:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1650
                        # No alternate sources to merge.
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1651
                        return
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1652
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1653
                # Temporarily merge the package metadata in the alternate
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1654
                # known package catalog for packages not listed in the
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1655
                # image's known catalog.
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1656
                def merge_check(alt_kcat, pfmri, new_entry):
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1657
                        states = new_entry["metadata"]["states"]
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1658
                        if self.PKG_STATE_INSTALLED in states:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1659
                                # Not interesting; already installed.
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1660
                                return False, None
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1661
                        img_entry = img_kcat.get_entry(pfmri=pfmri)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1662
                        if not img_entry is None:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1663
                                # Already in image known catalog.
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1664
                                return False, None
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1665
                        return True, new_entry
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1666
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1667
                img_kcat.append(self.__alt_known_cat, cb=merge_check)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1668
                img_kcat.finalize()
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1669
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1670
                self.__alt_pkg_sources_loaded = True
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1671
                self.transport.cfg.pkg_pub_map = self.__alt_pkg_pub_map
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1672
                self.transport.cfg.alt_pubs = self.__alt_pubs
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1673
                self.transport.cfg.reset_caches()
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1674
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1675
        def __cleanup_alt_pkg_certs(self):
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1676
                """Private helper function to cleanup package certificate
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1677
                information after use of temporary package data."""
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1678
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1679
                if not self.__alt_pubs:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1680
                        return
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1681
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1682
                # Cleanup publisher cert information; any certs not retrieved
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1683
                # retrieved during temporary publisher use need to be expunged
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1684
                # from the image configuration.
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1685
                for pub in self.__alt_pubs:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1686
                        try:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1687
                                ipub = self.cfg.publishers[pub.prefix]
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1688
                        except KeyError:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1689
                                # Nothing to do.
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1690
                                continue
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1691
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1692
        def set_alt_pkg_sources(self, alt_sources):
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1693
                """Specifies an alternate source of package metadata to be
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1694
                temporarily merged with image state so that it can be used
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1695
                as part of packaging operations."""
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1696
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1697
                if not alt_sources:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1698
                        self.__init_catalogs()
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1699
                        self.__alt_pkg_pub_map = None
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1700
                        self.__alt_pubs = None
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1701
                        self.__alt_known_cat = None
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1702
                        self.__alt_pkg_sources_loaded = False
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1703
                        self.transport.cfg.pkg_pub_map = None
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1704
                        self.transport.cfg.alt_pubs = None
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1705
                        self.transport.cfg.reset_caches()
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1706
                        return
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1707
                elif self.__alt_pkg_sources_loaded:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1708
                        # Ensure existing alternate package source data
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1709
                        # is not part of temporary image state.
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1710
                        self.__init_catalogs()
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1711
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1712
                pkg_pub_map, alt_pubs, alt_kcat, ignored = alt_sources
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1713
                self.__alt_pkg_pub_map = pkg_pub_map
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1714
                self.__alt_pubs = alt_pubs
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1715
                self.__alt_known_cat = alt_kcat
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1716
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1717
        def set_highest_ranked_publisher(self, prefix=None, alias=None,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1718
            pub=None):
1102
5ea5cdb4360d 5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents: 1087
diff changeset
  1719
                """Sets the preferred publisher for packaging operations.
5ea5cdb4360d 5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents: 1087
diff changeset
  1720
5ea5cdb4360d 5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents: 1087
diff changeset
  1721
                'prefix' is an optional string value specifying the name of
5ea5cdb4360d 5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents: 1087
diff changeset
  1722
                a publisher; ignored if 'pub' is provided.
5ea5cdb4360d 5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents: 1087
diff changeset
  1723
5ea5cdb4360d 5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents: 1087
diff changeset
  1724
                'alias' is an optional string value specifying the alias of
5ea5cdb4360d 5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents: 1087
diff changeset
  1725
                a publisher; ignored if 'pub' is provided.
5ea5cdb4360d 5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents: 1087
diff changeset
  1726
5ea5cdb4360d 5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents: 1087
diff changeset
  1727
                'pub' is an optional Publisher object identifying the
5ea5cdb4360d 5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents: 1087
diff changeset
  1728
                publisher to set as the preferred publisher.
5ea5cdb4360d 5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents: 1087
diff changeset
  1729
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1730
                One of the above parameters must be provided.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1731
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1732
                The caller is responsible for locking the image."""
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1733
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1734
                if not pub:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1735
                        pub = self.get_publisher(prefix=prefix, alias=alias)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1736
                if not self.cfg.allowed_to_move(pub):
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1737
                        raise apx.ModifyingSyspubException(_("Publisher '%s' "
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1738
                            "is a system publisher and cannot be moved.") % pub)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1739
                relative = None
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1740
                ranks = self.get_publisher_ranks()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1741
                rel_rank = None
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1742
                for p in ranks:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1743
                        rel_pub = self.get_publisher(p)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1744
                        if not self.cfg.allowed_to_move(rel_pub):
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1745
                                continue
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1746
                        rank = ranks[p][0]
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1747
                        if rel_rank is None or rank < rel_rank:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1748
                                rel_rank = rank
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1749
                                relative = rel_pub
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1750
                assert relative, "Expected %s to already be part of the " + \
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1751
                    "search order:%s" % (relative, ranks)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1752
                if relative == pub:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1753
                        # It's already first in the list of non-system
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1754
                        # publishers, so nothing to do.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1755
                        return
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1756
                self.cfg.change_publisher_search_order(pub.prefix,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1757
                    relative.prefix, after=False)
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1758
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1759
        def set_property(self, prop_name, prop_value):
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  1760
                with self.locked_op("set-property"):
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1761
                        self.cfg.set_property("property", prop_name,
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1762
                            prop_value)
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1763
                        self.save_config()
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1764
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1765
        def set_properties(self, properties):
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1766
                properties = { "property": properties }
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1767
                with self.locked_op("set-property"):
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1768
                        self.cfg.set_properties(properties)
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  1769
                        self.save_config()
551
233f0eeddd02 856 Image properties
Tom Mueller <Tom.Mueller@sun.com>
parents: 548
diff changeset
  1770
233f0eeddd02 856 Image properties
Tom Mueller <Tom.Mueller@sun.com>
parents: 548
diff changeset
  1771
        def get_property(self, prop_name):
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1772
                return self.cfg.get_property("property", prop_name)
551
233f0eeddd02 856 Image properties
Tom Mueller <Tom.Mueller@sun.com>
parents: 548
diff changeset
  1773
233f0eeddd02 856 Image properties
Tom Mueller <Tom.Mueller@sun.com>
parents: 548
diff changeset
  1774
        def has_property(self, prop_name):
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1775
                try:
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1776
                        self.cfg.get_property("property", prop_name)
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1777
                        return True
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1778
                except cfg.ConfigError:
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1779
                        return False
551
233f0eeddd02 856 Image properties
Tom Mueller <Tom.Mueller@sun.com>
parents: 548
diff changeset
  1780
233f0eeddd02 856 Image properties
Tom Mueller <Tom.Mueller@sun.com>
parents: 548
diff changeset
  1781
        def delete_property(self, prop_name):
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  1782
                with self.locked_op("unset-property"):
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1783
                        self.cfg.remove_property("property", prop_name)
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  1784
                        self.save_config()
551
233f0eeddd02 856 Image properties
Tom Mueller <Tom.Mueller@sun.com>
parents: 548
diff changeset
  1785
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
  1786
        def add_property_value(self, prop_name, prop_value):
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
  1787
                with self.locked_op("add-property-value"):
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1788
                        self.cfg.add_property_value("property", prop_name,
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1789
                            prop_value)
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
  1790
                        self.save_config()
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
  1791
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
  1792
        def remove_property_value(self, prop_name, prop_value):
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
  1793
                with self.locked_op("remove-property-value"):
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1794
                        self.cfg.remove_property_value("property", prop_name,
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1795
                            prop_value)
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
  1796
                        self.save_config()
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
  1797
1736
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1798
        def destroy(self):
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1799
                """Destroys the image; image object should not be used
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1800
                afterwards."""
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1801
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1802
                if not self.imgdir or not os.path.exists(self.imgdir):
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1803
                        return
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1804
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1805
                if os.path.abspath(self.imgdir) == "/":
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1806
                        # Paranoia.
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1807
                        return
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1808
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1809
                try:
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1810
                        shutil.rmtree(self.imgdir)
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1811
                except EnvironmentError, e:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  1812
                        raise apx._convert_error(e)
1736
727dda1e7968 11522 pkg should require publisher prefix to match repository information
Shawn Walker <srw@sun.com>
parents: 1733
diff changeset
  1813
551
233f0eeddd02 856 Image properties
Tom Mueller <Tom.Mueller@sun.com>
parents: 548
diff changeset
  1814
        def properties(self):
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1815
                if not self.cfg:
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1816
                        raise apx.ImageCfgEmptyError(self.root)
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  1817
                return self.cfg.get_index()["property"].keys()
551
233f0eeddd02 856 Image properties
Tom Mueller <Tom.Mueller@sun.com>
parents: 548
diff changeset
  1818
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
  1819
        def add_publisher(self, pub, refresh_allowed=True, progtrack=None,
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1820
            approved_cas=EmptyI, revoked_cas=EmptyI, search_after=None,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1821
            search_before=None, search_first=None, unset_cas=EmptyI):
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1822
                """Adds the provided publisher object to the image
1102
5ea5cdb4360d 5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents: 1087
diff changeset
  1823
                configuration.
5ea5cdb4360d 5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents: 1087
diff changeset
  1824
5ea5cdb4360d 5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents: 1087
diff changeset
  1825
                'refresh_allowed' is an optional, boolean value indicating
5ea5cdb4360d 5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents: 1087
diff changeset
  1826
                whether the publisher's metadata should be retrieved when adding
5ea5cdb4360d 5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents: 1087
diff changeset
  1827
                it to the image's configuration.
5ea5cdb4360d 5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents: 1087
diff changeset
  1828
5ea5cdb4360d 5014 api sets successful result for image-create with failed catalog refresh
Shawn Walker <srw@sun.com>
parents: 1087
diff changeset
  1829
                'progtrack' is an optional ProgressTracker object."""
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  1830
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1831
                with self.locked_op("add-publisher"):
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1832
                        return self.__add_publisher(pub,
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1833
                            refresh_allowed=refresh_allowed,
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1834
                            progtrack=progtrack, approved_cas=EmptyI,
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1835
                            revoked_cas=EmptyI, search_after=search_after,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1836
                            search_before=search_before,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1837
                            search_first=search_first, unset_cas=EmptyI)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1838
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1839
        def __update_publisher_catalogs(self, pub, progtrack=None,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1840
            refresh_allowed=True):
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1841
                # Ensure that if the publisher's meta directory already
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1842
                # exists for some reason that the data within is not
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1843
                # used.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1844
                self.remove_publisher_metadata(pub, progtrack=progtrack,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1845
                    rebuild=False)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1846
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1847
                repo = pub.repository
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1848
                if refresh_allowed and repo.origins:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1849
                        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1850
                                # First, verify that the publisher has a
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1851
                                # valid pkg(5) repository.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1852
                                self.transport.valid_publisher_test(pub)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1853
                                pub.validate_config()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1854
                                self.refresh_publishers(pubs=[pub],
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1855
                                    progtrack=progtrack)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1856
                        except Exception, e:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1857
                                # Remove the newly added publisher since
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1858
                                # it is invalid or the retrieval failed.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1859
                                if not pub.sys_pub:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1860
                                        self.cfg.remove_publisher(pub.prefix)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1861
                                raise
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1862
                        except:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1863
                                # Remove the newly added publisher since
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1864
                                # the retrieval failed.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1865
                                if not pub.sys_pub:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1866
                                        self.cfg.remove_publisher(pub.prefix)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1867
                                raise
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1868
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1869
        def __add_publisher(self, pub, refresh_allowed=True, progtrack=None,
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1870
            approved_cas=EmptyI, revoked_cas=EmptyI, search_after=None,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1871
            search_before=None, search_first=None, unset_cas=EmptyI):
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1872
                """Private version of add_publisher(); caller is responsible
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1873
                for locking."""
1733
7ffa6f902aa0 9218 pkg.client.api should check for cross-alias/prefix duplicates
Shawn Walker <srw@sun.com>
parents: 1710
diff changeset
  1874
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1875
                assert (not search_after and not search_before) or \
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1876
                    (not search_after and not search_first) or \
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1877
                    (not search_before and not search_first)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1878
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1879
                if self.version < self.CURRENT_VERSION:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1880
                        raise apx.ImageFormatUpdateNeeded(self.root)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  1881
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1882
                for p in self.cfg.publishers.values():
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1883
                        if pub.prefix == p.prefix or \
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1884
                            pub.prefix == p.alias or \
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1885
                            pub.alias and (pub.alias == p.alias or
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1886
                            pub.alias == p.prefix):
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1887
                                raise apx.DuplicatePublisher(pub)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1888
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1889
                if not progtrack:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1890
                        progtrack = progress.QuietProgressTracker()
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1891
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1892
                # Must assign this first before performing operations.
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1893
                pub.meta_root = self._get_publisher_meta_root(
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1894
                    pub.prefix)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1895
                pub.transport = self.transport
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1896
                self.cfg.publishers[pub.prefix] = pub
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1897
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1898
                self.__update_publisher_catalogs(pub, progtrack=progtrack,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1899
                    refresh_allowed=refresh_allowed)
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1900
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1901
                for ca in approved_cas:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1902
                        try:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1903
                                ca = os.path.abspath(ca)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1904
                                fh = open(ca, "rb")
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1905
                                s = fh.read()
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1906
                                fh.close()
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1907
                        except EnvironmentError, e:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1908
                                if e.errno == errno.ENOENT:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1909
                                        raise apx.MissingFileArgumentException(
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1910
                                            ca)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1911
                                raise apx._convert_error(e)
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1912
                        pub.approve_ca_cert(s, manual=True)
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1913
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1914
                for hsh in revoked_cas:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1915
                        pub.revoke_ca_cert(hsh)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1916
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1917
                for hsh in unset_cas:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1918
                        pub.unset_ca_cert(hsh)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1919
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1920
                if search_first:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1921
                        self.set_highest_ranked_publisher(prefix=pub.prefix)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1922
                elif search_before:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1923
                        self.pub_search_before(pub.prefix, search_before)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1924
                elif search_after:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1925
                        self.pub_search_after(pub.prefix, search_after)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  1926
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1927
                # Only after success should the configuration be saved.
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  1928
                self.save_config()
539
7486304966c5 1449 pkg requires operational history
Shawn Walker <shawn.walker@sun.com>
parents: 537
diff changeset
  1929
235
61994d15c39b 373 design a nice default output for install/update/remove
Dan Price <dp@eng.sun.com>
parents: 226
diff changeset
  1930
        def verify(self, fmri, progresstracker, **args):
1685
51f832187af7 3005 some pkg verify errors should be warnings or informational messages
Shawn Walker <srw@sun.com>
parents: 1678
diff changeset
  1931
                """Generator that returns a tuple of the form (action, errors,
51f832187af7 3005 some pkg verify errors should be warnings or informational messages
Shawn Walker <srw@sun.com>
parents: 1678
diff changeset
  1932
                warnings, info) if there are any error, warning, or other
51f832187af7 3005 some pkg verify errors should be warnings or informational messages
Shawn Walker <srw@sun.com>
parents: 1678
diff changeset
  1933
                messages about an action contained within the specified
51f832187af7 3005 some pkg verify errors should be warnings or informational messages
Shawn Walker <srw@sun.com>
parents: 1678
diff changeset
  1934
                package.  Where the returned messages are lists of strings
51f832187af7 3005 some pkg verify errors should be warnings or informational messages
Shawn Walker <srw@sun.com>
parents: 1678
diff changeset
  1935
                indicating fatal problems, potential issues (that can be
51f832187af7 3005 some pkg verify errors should be warnings or informational messages
Shawn Walker <srw@sun.com>
parents: 1678
diff changeset
  1936
                ignored), or extra information to be displayed respectively.
51f832187af7 3005 some pkg verify errors should be warnings or informational messages
Shawn Walker <srw@sun.com>
parents: 1678
diff changeset
  1937
51f832187af7 3005 some pkg verify errors should be warnings or informational messages
Shawn Walker <srw@sun.com>
parents: 1678
diff changeset
  1938
                'fmri' is the fmri of the package to verify.
51f832187af7 3005 some pkg verify errors should be warnings or informational messages
Shawn Walker <srw@sun.com>
parents: 1678
diff changeset
  1939
51f832187af7 3005 some pkg verify errors should be warnings or informational messages
Shawn Walker <srw@sun.com>
parents: 1678
diff changeset
  1940
                'progresstracker' is a ProgressTracker object.
51f832187af7 3005 some pkg verify errors should be warnings or informational messages
Shawn Walker <srw@sun.com>
parents: 1678
diff changeset
  1941
1755
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1736
diff changeset
  1942
                'args' is a dict of additional keyword arguments to be passed
1685
51f832187af7 3005 some pkg verify errors should be warnings or informational messages
Shawn Walker <srw@sun.com>
parents: 1678
diff changeset
  1943
                to each action verification routine."""
222
12006bf2a260 4 We need to be able to verify that package(s) is/are correctly installed
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 221
diff changeset
  1944
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
  1945
                try:
2261
3c66f438398d 17961 pkg verify aborts if a package from a removed publisher is installed
Shawn Walker <shawn.walker@oracle.com>
parents: 2228
diff changeset
  1946
                        pub = self.get_publisher(prefix=fmri.publisher)
3c66f438398d 17961 pkg verify aborts if a package from a removed publisher is installed
Shawn Walker <shawn.walker@oracle.com>
parents: 2228
diff changeset
  1947
                except apx.UnknownPublisher:
3c66f438398d 17961 pkg verify aborts if a package from a removed publisher is installed
Shawn Walker <shawn.walker@oracle.com>
parents: 2228
diff changeset
  1948
                        # Since user removed publisher, assume this is the same
3c66f438398d 17961 pkg verify aborts if a package from a removed publisher is installed
Shawn Walker <shawn.walker@oracle.com>
parents: 2228
diff changeset
  1949
                        # as if they had set signature-policy ignore for the
3c66f438398d 17961 pkg verify aborts if a package from a removed publisher is installed
Shawn Walker <shawn.walker@oracle.com>
parents: 2228
diff changeset
  1950
                        # publisher.
3c66f438398d 17961 pkg verify aborts if a package from a removed publisher is installed
Shawn Walker <shawn.walker@oracle.com>
parents: 2228
diff changeset
  1951
                        sig_pol = None
3c66f438398d 17961 pkg verify aborts if a package from a removed publisher is installed
Shawn Walker <shawn.walker@oracle.com>
parents: 2228
diff changeset
  1952
                else:
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
  1953
                        sig_pol = self.signature_policy.combine(
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
  1954
                            pub.signature_policy)
2261
3c66f438398d 17961 pkg verify aborts if a package from a removed publisher is installed
Shawn Walker <shawn.walker@oracle.com>
parents: 2228
diff changeset
  1955
2331
cc898866d552 18257 signed packages with variants fail pkg verify
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2330
diff changeset
  1956
                manf = self.get_manifest(fmri, all_variants=True)
2261
3c66f438398d 17961 pkg verify aborts if a package from a removed publisher is installed
Shawn Walker <shawn.walker@oracle.com>
parents: 2228
diff changeset
  1957
                sigs = list(manf.gen_actions_by_type("signature",
3c66f438398d 17961 pkg verify aborts if a package from a removed publisher is installed
Shawn Walker <shawn.walker@oracle.com>
parents: 2228
diff changeset
  1958
                    self.list_excludes()))
3c66f438398d 17961 pkg verify aborts if a package from a removed publisher is installed
Shawn Walker <shawn.walker@oracle.com>
parents: 2228
diff changeset
  1959
                if sig_pol and (sigs or sig_pol.name != "ignore"):
3c66f438398d 17961 pkg verify aborts if a package from a removed publisher is installed
Shawn Walker <shawn.walker@oracle.com>
parents: 2228
diff changeset
  1960
                        # Only perform signature verification logic if there are
3c66f438398d 17961 pkg verify aborts if a package from a removed publisher is installed
Shawn Walker <shawn.walker@oracle.com>
parents: 2228
diff changeset
  1961
                        # signatures or if signature-policy is not 'ignore'.
3c66f438398d 17961 pkg verify aborts if a package from a removed publisher is installed
Shawn Walker <shawn.walker@oracle.com>
parents: 2228
diff changeset
  1962
                        try:
2331
cc898866d552 18257 signed packages with variants fail pkg verify
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2330
diff changeset
  1963
                                # Signature verification must be done using all
cc898866d552 18257 signed packages with variants fail pkg verify
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2330
diff changeset
  1964
                                # the actions from the manifest, not just the
cc898866d552 18257 signed packages with variants fail pkg verify
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2330
diff changeset
  1965
                                # ones for this image's variants.
2261
3c66f438398d 17961 pkg verify aborts if a package from a removed publisher is installed
Shawn Walker <shawn.walker@oracle.com>
parents: 2228
diff changeset
  1966
                                sig_pol.process_signatures(sigs,
2286
938fbb350ad2 16867 pkgsign should handle existing signatures better
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2261
diff changeset
  1967
                                    manf.gen_actions(), pub, self.trust_anchors)
2261
3c66f438398d 17961 pkg verify aborts if a package from a removed publisher is installed
Shawn Walker <shawn.walker@oracle.com>
parents: 2228
diff changeset
  1968
                        except apx.SigningException, e:
3c66f438398d 17961 pkg verify aborts if a package from a removed publisher is installed
Shawn Walker <shawn.walker@oracle.com>
parents: 2228
diff changeset
  1969
                                e.pfmri = fmri
3c66f438398d 17961 pkg verify aborts if a package from a removed publisher is installed
Shawn Walker <shawn.walker@oracle.com>
parents: 2228
diff changeset
  1970
                                yield e.sig, [e], [], []
3c66f438398d 17961 pkg verify aborts if a package from a removed publisher is installed
Shawn Walker <shawn.walker@oracle.com>
parents: 2228
diff changeset
  1971
                        except apx.InvalidResourceLocation, e:
3c66f438398d 17961 pkg verify aborts if a package from a removed publisher is installed
Shawn Walker <shawn.walker@oracle.com>
parents: 2228
diff changeset
  1972
                                yield [], [e], [], []
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
  1973
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 2003
diff changeset
  1974
                for act in manf.gen_actions(
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  1975
                    self.list_excludes()):
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  1976
                        errors, warnings, info = act.verify(self, pfmri=fmri,
1685
51f832187af7 3005 some pkg verify errors should be warnings or informational messages
Shawn Walker <srw@sun.com>
parents: 1678
diff changeset
  1977
                            **args)
235
61994d15c39b 373 design a nice default output for install/update/remove
Dan Price <dp@eng.sun.com>
parents: 226
diff changeset
  1978
                        progresstracker.verify_add_progress(fmri)
61994d15c39b 373 design a nice default output for install/update/remove
Dan Price <dp@eng.sun.com>
parents: 226
diff changeset
  1979
                        actname = act.distinguished_name()
61994d15c39b 373 design a nice default output for install/update/remove
Dan Price <dp@eng.sun.com>
parents: 226
diff changeset
  1980
                        if errors:
61994d15c39b 373 design a nice default output for install/update/remove
Dan Price <dp@eng.sun.com>
parents: 226
diff changeset
  1981
                                progresstracker.verify_yield_error(actname,
61994d15c39b 373 design a nice default output for install/update/remove
Dan Price <dp@eng.sun.com>
parents: 226
diff changeset
  1982
                                    errors)
1685
51f832187af7 3005 some pkg verify errors should be warnings or informational messages
Shawn Walker <srw@sun.com>
parents: 1678
diff changeset
  1983
                        if warnings:
51f832187af7 3005 some pkg verify errors should be warnings or informational messages
Shawn Walker <srw@sun.com>
parents: 1678
diff changeset
  1984
                                progresstracker.verify_yield_warning(actname,
51f832187af7 3005 some pkg verify errors should be warnings or informational messages
Shawn Walker <srw@sun.com>
parents: 1678
diff changeset
  1985
                                    warnings)
51f832187af7 3005 some pkg verify errors should be warnings or informational messages
Shawn Walker <srw@sun.com>
parents: 1678
diff changeset
  1986
                        if info:
51f832187af7 3005 some pkg verify errors should be warnings or informational messages
Shawn Walker <srw@sun.com>
parents: 1678
diff changeset
  1987
                                progresstracker.verify_yield_info(actname,
51f832187af7 3005 some pkg verify errors should be warnings or informational messages
Shawn Walker <srw@sun.com>
parents: 1678
diff changeset
  1988
                                    info)
51f832187af7 3005 some pkg verify errors should be warnings or informational messages
Shawn Walker <srw@sun.com>
parents: 1678
diff changeset
  1989
                        if errors or warnings or info:
51f832187af7 3005 some pkg verify errors should be warnings or informational messages
Shawn Walker <srw@sun.com>
parents: 1678
diff changeset
  1990
                                yield act, errors, warnings, info
583
fc856572d86e 388 pkg command needs a "fix" subcommand or similar
Brad Hall <bhall@eng.sun.com>
parents: 582
diff changeset
  1991
2034
d5ee7746faeb 16108 boot environments should be created by default only when needed
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2028
diff changeset
  1992
        def __call_imageplan_evaluate(self, ip):
1271
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1256
diff changeset
  1993
                # A plan can be requested without actually performing an
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1256
diff changeset
  1994
                # operation on the image.
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1256
diff changeset
  1995
                if self.history.operation_name:
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1256
diff changeset
  1996
                        self.history.operation_start_state = ip.get_plan()
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1256
diff changeset
  1997
2205
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  1998
                try:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  1999
                        ip.evaluate()
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  2000
                except apx.ConflictingActionErrors:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  2001
                        # Image plan evaluation can fail because of duplicate
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  2002
                        # action discovery, but we still want to be able to
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  2003
                        # display and log the solved FMRI changes.
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  2004
                        self.imageplan = ip
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  2005
                        if self.history.operation_name:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  2006
                                self.history.operation_end_state = \
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  2007
                                    "Unevaluated: merged plan had errors\n" + \
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  2008
                                    ip.get_plan(full=False)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  2009
                        raise
1537
00a5b4d54eb8 5872 List APIs required
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
  2010
1271
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1256
diff changeset
  2011
                self.imageplan = ip
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1256
diff changeset
  2012
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1256
diff changeset
  2013
                if self.history.operation_name:
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1256
diff changeset
  2014
                        self.history.operation_end_state = \
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1256
diff changeset
  2015
                            ip.get_plan(full=False)
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1256
diff changeset
  2016
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2017
        def image_change_varcets(self, variants, facets, progtrack, check_cancelation,
2034
d5ee7746faeb 16108 boot environments should be created by default only when needed
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2028
diff changeset
  2018
            noexecute):
1271
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1256
diff changeset
  2019
1837
03aa2b10f29d 15169 image-update plans twice and keeps both
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  2020
                # Allow garbage collection of previous plan.
03aa2b10f29d 15169 image-update plans twice and keeps both
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  2021
                self.imageplan = None
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2022
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2023
                ip = imageplan.ImagePlan(self, progtrack, check_cancelation,
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2024
                    noexecute=noexecute)
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2025
1271
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1256
diff changeset
  2026
                progtrack.evaluate_start()
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1256
diff changeset
  2027
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  2028
                # Always start with most current (on-disk) state information.
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  2029
                self.__init_catalogs()
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  2030
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2031
                # compute dict of changing variants
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2032
                if variants:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2033
                        variants = dict(set(variants.iteritems()) - \
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  2034
                           set(self.cfg.variants.iteritems()))
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2035
                # facets are always the entire set
1271
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1256
diff changeset
  2036
1755
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1736
diff changeset
  2037
                try:
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1736
diff changeset
  2038
                        ip.plan_change_varcets(variants, facets)
2034
d5ee7746faeb 16108 boot environments should be created by default only when needed
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2028
diff changeset
  2039
                        self.__call_imageplan_evaluate(ip)
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2040
                except apx.ActionExecutionError, e:
1859
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
  2041
                        raise
1755
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1736
diff changeset
  2042
                except pkg.actions.ActionError, e:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2043
                        raise apx.InvalidPackageErrors([e])
1271
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1256
diff changeset
  2044
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2045
        def image_config_update(self, new_variants, new_facets):
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2046
                """update variants in image config"""
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2047
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2048
                if new_variants is not None:
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  2049
                        self.cfg.variants.update(new_variants)
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2050
                if new_facets is not None:
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  2051
                        self.cfg.facets = new_facets
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  2052
                self.cfg.write()
1271
036d87b0bd44 6831 need 'pkg change-variant' command
Edward Pilatowicz <Edward.Pilatowicz@Sun.COM>
parents: 1256
diff changeset
  2053
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  2054
        def repair(self, *args, **kwargs):
583
fc856572d86e 388 pkg command needs a "fix" subcommand or similar
Brad Hall <bhall@eng.sun.com>
parents: 582
diff changeset
  2055
                """Repair any actions in the fmri that failed a verify."""
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2056
2154
68e263d9287c 17417 t_pkg_history test unnecessarily wants a unique timestamp
Tim Foster <tim.s.foster@oracle.com>
parents: 2152
diff changeset
  2057
                # prune off any new_history_op keyword argument, used for
68e263d9287c 17417 t_pkg_history test unnecessarily wants a unique timestamp
Tim Foster <tim.s.foster@oracle.com>
parents: 2152
diff changeset
  2058
                # locked_op(), but not for __repair()
68e263d9287c 17417 t_pkg_history test unnecessarily wants a unique timestamp
Tim Foster <tim.s.foster@oracle.com>
parents: 2152
diff changeset
  2059
                need_history_op = kwargs.pop("new_history_op", True)
68e263d9287c 17417 t_pkg_history test unnecessarily wants a unique timestamp
Tim Foster <tim.s.foster@oracle.com>
parents: 2152
diff changeset
  2060
68e263d9287c 17417 t_pkg_history test unnecessarily wants a unique timestamp
Tim Foster <tim.s.foster@oracle.com>
parents: 2152
diff changeset
  2061
                with self.locked_op("fix", new_history_op=need_history_op):
1755
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1736
diff changeset
  2062
                        try:
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1736
diff changeset
  2063
                                return self.__repair(*args, **kwargs)
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2064
                        except apx.ActionExecutionError, e:
1859
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
  2065
                                raise
1755
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1736
diff changeset
  2066
                        except pkg.actions.ActionError, e:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2067
                                raise apx.InvalidPackageErrors([e])
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  2068
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  2069
        def __repair(self, repairs, progtrack, accept=False,
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  2070
            show_licenses=False):
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  2071
                """Private repair method; caller is responsible for locking."""
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  2072
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2073
                if self.version < self.CURRENT_VERSION:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2074
                        raise apx.ImageFormatUpdateNeeded(self.root)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2075
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  2076
                ilm = self.get_last_modified()
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  2077
1837
03aa2b10f29d 15169 image-update plans twice and keeps both
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  2078
                # Allow garbage collection of previous plan.
03aa2b10f29d 15169 image-update plans twice and keeps both
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  2079
                self.imageplan = None
03aa2b10f29d 15169 image-update plans twice and keeps both
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  2080
2154
68e263d9287c 17417 t_pkg_history test unnecessarily wants a unique timestamp
Tim Foster <tim.s.foster@oracle.com>
parents: 2152
diff changeset
  2081
                reason = "The following packages needed to be repaired:\n    %s"
68e263d9287c 17417 t_pkg_history test unnecessarily wants a unique timestamp
Tim Foster <tim.s.foster@oracle.com>
parents: 2152
diff changeset
  2082
                self.history.operation_start_state = \
68e263d9287c 17417 t_pkg_history test unnecessarily wants a unique timestamp
Tim Foster <tim.s.foster@oracle.com>
parents: 2152
diff changeset
  2083
                    reason % "\n    ".join(str(fmri)
68e263d9287c 17417 t_pkg_history test unnecessarily wants a unique timestamp
Tim Foster <tim.s.foster@oracle.com>
parents: 2152
diff changeset
  2084
                    for fmri, failed in repairs)
68e263d9287c 17417 t_pkg_history test unnecessarily wants a unique timestamp
Tim Foster <tim.s.foster@oracle.com>
parents: 2152
diff changeset
  2085
687
3d7060f40501 4450 pkg fix passes bogus cancellation point to pkgplan/imageplan
Brad Hall <bhall@eng.sun.com>
parents: 685
diff changeset
  2086
                # XXX: This (lambda x: False) is temporary until we move pkg fix
3d7060f40501 4450 pkg fix passes bogus cancellation point to pkgplan/imageplan
Brad Hall <bhall@eng.sun.com>
parents: 685
diff changeset
  2087
                # into the api and can actually use the
3d7060f40501 4450 pkg fix passes bogus cancellation point to pkgplan/imageplan
Brad Hall <bhall@eng.sun.com>
parents: 685
diff changeset
  2088
                # api::__check_cancelation() function.
583
fc856572d86e 388 pkg command needs a "fix" subcommand or similar
Brad Hall <bhall@eng.sun.com>
parents: 582
diff changeset
  2089
                pps = []
fc856572d86e 388 pkg command needs a "fix" subcommand or similar
Brad Hall <bhall@eng.sun.com>
parents: 582
diff changeset
  2090
                for fmri, actions in repairs:
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
  2091
                        logger.info("Repairing: %-50s" % fmri.get_pkg_stem())
838
aafbe4737188 3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 835
diff changeset
  2092
                        m = self.get_manifest(fmri)
692
ccf4f4e9da34 4818 pkg fix traceback
Brad Hall <bhall@eng.sun.com>
parents: 687
diff changeset
  2093
                        pp = pkgplan.PkgPlan(self, progtrack, lambda: False)
583
fc856572d86e 388 pkg command needs a "fix" subcommand or similar
Brad Hall <bhall@eng.sun.com>
parents: 582
diff changeset
  2094
                        pp.propose_repair(fmri, m, actions)
838
aafbe4737188 3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 835
diff changeset
  2095
                        pp.evaluate(self.list_excludes(), self.list_excludes())
583
fc856572d86e 388 pkg command needs a "fix" subcommand or similar
Brad Hall <bhall@eng.sun.com>
parents: 582
diff changeset
  2096
                        pps.append(pp)
1837
03aa2b10f29d 15169 image-update plans twice and keeps both
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  2097
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2098
                ip = imageplan.ImagePlan(self, progtrack, lambda: False)
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  2099
                ip._image_lm = ilm
1832
df15686547e4 6795 pkg fix should fix file modes for some preserved files
Shawn Walker <shawn.walker@oracle.com>
parents: 1829
diff changeset
  2100
                ip._planned_op = ip.PLANNED_FIX
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2101
                self.imageplan = ip
583
fc856572d86e 388 pkg command needs a "fix" subcommand or similar
Brad Hall <bhall@eng.sun.com>
parents: 582
diff changeset
  2102
1195
cd29e45e4023 9384 pkg fix unexpectedly indexes packages
Brock Pytlik <bpytlik@sun.com>
parents: 1191
diff changeset
  2103
                ip.update_index = False
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2104
                ip.state = imageplan.EVALUATED_PKGS
625
e46b345645d6 3799 need to start progress tracker going early on
Brock Pytlik <bpytlik@sun.com>
parents: 621
diff changeset
  2105
                progtrack.evaluate_start()
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  2106
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  2107
                # Always start with most current (on-disk) state information.
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  2108
                self.__init_catalogs()
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  2109
583
fc856572d86e 388 pkg command needs a "fix" subcommand or similar
Brad Hall <bhall@eng.sun.com>
parents: 582
diff changeset
  2110
                ip.pkg_plans = pps
687
3d7060f40501 4450 pkg fix passes bogus cancellation point to pkgplan/imageplan
Brad Hall <bhall@eng.sun.com>
parents: 685
diff changeset
  2111
3d7060f40501 4450 pkg fix passes bogus cancellation point to pkgplan/imageplan
Brad Hall <bhall@eng.sun.com>
parents: 685
diff changeset
  2112
                ip.evaluate()
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2113
                if ip.reboot_needed() and self.is_liveroot():
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2114
                        raise apx.RebootNeededOnLiveImageException()
1618
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1603
diff changeset
  2115
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1603
diff changeset
  2116
                logger.info("\n")
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1603
diff changeset
  2117
                for pp in ip.pkg_plans:
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1603
diff changeset
  2118
                        for lic, entry in pp.get_licenses():
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1603
diff changeset
  2119
                                dest = entry["dest"]
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1603
diff changeset
  2120
                                lic = dest.attrs["license"]
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1603
diff changeset
  2121
                                if show_licenses or dest.must_display:
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1603
diff changeset
  2122
                                        # Display license if required.
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1603
diff changeset
  2123
                                        logger.info("-" * 60)
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1603
diff changeset
  2124
                                        logger.info(_("Package: %s") % \
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1603
diff changeset
  2125
                                            pp.destination_fmri)
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1603
diff changeset
  2126
                                        logger.info(_("License: %s\n") % lic)
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1603
diff changeset
  2127
                                        logger.info(dest.get_text(self,
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1603
diff changeset
  2128
                                            pp.destination_fmri))
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1603
diff changeset
  2129
                                        logger.info("\n")
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1603
diff changeset
  2130
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1603
diff changeset
  2131
                                # Mark license as having been displayed.
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1603
diff changeset
  2132
                                pp.set_license_status(lic, displayed=True)
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1603
diff changeset
  2133
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1603
diff changeset
  2134
                                if dest.must_accept and accept:
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1603
diff changeset
  2135
                                        # Mark license as accepted if
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1603
diff changeset
  2136
                                        # required and requested.
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1603
diff changeset
  2137
                                        pp.set_license_status(lic,
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1603
diff changeset
  2138
                                            accepted=accept)
04f7471c9e72 5943 add 'must-accept' attribute to license actions
Shawn Walker <srw@sun.com>
parents: 1603
diff changeset
  2139
687
3d7060f40501 4450 pkg fix passes bogus cancellation point to pkgplan/imageplan
Brad Hall <bhall@eng.sun.com>
parents: 685
diff changeset
  2140
                ip.preexecute()
3d7060f40501 4450 pkg fix passes bogus cancellation point to pkgplan/imageplan
Brad Hall <bhall@eng.sun.com>
parents: 685
diff changeset
  2141
                ip.execute()
583
fc856572d86e 388 pkg command needs a "fix" subcommand or similar
Brad Hall <bhall@eng.sun.com>
parents: 582
diff changeset
  2142
fc856572d86e 388 pkg command needs a "fix" subcommand or similar
Brad Hall <bhall@eng.sun.com>
parents: 582
diff changeset
  2143
                return True
222
12006bf2a260 4 We need to be able to verify that package(s) is/are correctly installed
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 221
diff changeset
  2144
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2145
        def has_manifest(self, pfmri):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2146
                return os.path.exists(self.get_manifest_path(pfmri))
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2147
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2148
        def get_license_dir(self, pfmri):
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2149
                """Return path to package license directory."""
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2150
                if self.version == self.CURRENT_VERSION:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2151
                        # Newer image format stores license files per-stem,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2152
                        # instead of per-stem and version, so that transitions
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2153
                        # between package versions don't require redelivery
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2154
                        # of license files.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2155
                        return os.path.join(self.imgdir, "license",
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2156
                            pfmri.get_dir_path(stemonly=True))
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2157
                # Older image formats store license files in the manifest cache
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2158
                # directory.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2159
                return self.get_manifest_dir(pfmri)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2160
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2161
        def __get_installed_pkg_publisher(self, pfmri):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2162
                """Returns the publisher for the FMRI of an installed package
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2163
                or None if the package is not installed.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2164
                """
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2165
                for f in self.gen_installed_pkgs():
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2166
                        if f.pkg_name == pfmri.pkg_name:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2167
                                return f.publisher
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2168
                return None
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2169
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2170
        def get_manifest_dir(self, pfmri):
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2171
                """Return path to on-disk manifest cache directory."""
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2172
                if not pfmri.publisher:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2173
                        # Needed for consumers such as search that don't provide
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2174
                        # publisher information.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2175
                        pfmri = pfmri.copy()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2176
                        pfmri.publisher = self.__get_installed_pkg_publisher(
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2177
                            pfmri)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2178
                assert pfmri.publisher
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2179
                if self.version == self.CURRENT_VERSION:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2180
                        root = self._get_publisher_cache_root(pfmri.publisher)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2181
                else:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2182
                        root = self.imgdir
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2183
                return os.path.join(root, "pkg", pfmri.get_dir_path())
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2184
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2185
        def get_manifest_path(self, pfmri):
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2186
                """Return path to on-disk manifest file."""
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2187
                if not pfmri.publisher:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2188
                        # Needed for consumers such as search that don't provide
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2189
                        # publisher information.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2190
                        pfmri = pfmri.copy()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2191
                        pfmri.publisher = self.__get_installed_pkg_publisher(
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2192
                            pfmri)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2193
                assert pfmri.publisher
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2194
                if self.version == self.CURRENT_VERSION:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2195
                        root = os.path.join(self._get_publisher_meta_root(
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2196
                            pfmri.publisher))
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2197
                        return os.path.join(root, "pkg", pfmri.get_dir_path())
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2198
                return os.path.join(self.get_manifest_dir(pfmri),
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2199
                    "manifest")
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
  2200
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2201
        def __get_manifest(self, fmri, excludes=EmptyI, intent=None,
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2202
            alt_pub=None):
556
1c3526ca7b9e 2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents: 554
diff changeset
  2203
                """Find on-disk manifest and create in-memory Manifest
956
adf6bdfdb3b5 6904 image.installed_file_authority always tries to open installed file r+
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 941
diff changeset
  2204
                object.... grab from server if needed"""
556
1c3526ca7b9e 2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents: 554
diff changeset
  2205
1c3526ca7b9e 2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents: 554
diff changeset
  2206
                try:
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2207
                        ret = manifest.FactoredManifest(fmri,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2208
                            self.get_manifest_dir(fmri),
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2209
                            excludes=excludes,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2210
                            pathname=self.get_manifest_path(fmri))
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2211
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2212
                        # if we have a intent string, let depot
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2213
                        # know for what we're using the cached manifest
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2214
                        if intent:
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2215
                                alt_repo = None
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2216
                                if alt_pub:
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  2217
                                        alt_repo = alt_pub.repository
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2218
                                try:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2219
                                        self.transport.touch_manifest(fmri,
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2220
                                            intent, alt_repo=alt_repo)
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2221
                                except (apx.UnknownPublisher,
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2222
                                    apx.TransportError):
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2223
                                        # It's not fatal if we can't find
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2224
                                        # or reach the publisher.
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2225
                                        pass
956
adf6bdfdb3b5 6904 image.installed_file_authority always tries to open installed file r+
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 941
diff changeset
  2226
                except KeyError:
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2227
                        ret = self.transport.get_manifest(fmri, excludes,
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2228
                            intent, pub=alt_pub)
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2229
                return ret
956
adf6bdfdb3b5 6904 image.installed_file_authority always tries to open installed file r+
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 941
diff changeset
  2230
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2231
        def get_manifest(self, fmri, all_variants=False, intent=None,
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2232
            alt_pub=None):
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2233
                """return manifest; uses cached version if available.
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2234
                all_variants controls whether manifest contains actions
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2235
                for all variants"""
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2236
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2237
                # Normally elide other arch variants, facets
1537
00a5b4d54eb8 5872 List APIs required
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
  2238
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2239
                if all_variants:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2240
                        excludes = EmptyI
956
adf6bdfdb3b5 6904 image.installed_file_authority always tries to open installed file r+
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 941
diff changeset
  2241
                else:
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  2242
                        excludes = [ self.cfg.variants.allow_action ]
2183
21ae45e8dfcf 17581 There should be a way of removing a package as part of upgrade
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2178
diff changeset
  2243
1755
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1736
diff changeset
  2244
                try:
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1736
diff changeset
  2245
                        m = self.__get_manifest(fmri, excludes=excludes,
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2246
                            intent=intent, alt_pub=alt_pub)
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2247
                except apx.ActionExecutionError, e:
1859
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
  2248
                        raise
1755
8e1ed1373f93 9123 client traceback during install for bad file mode
Shawn Walker <srw@sun.com>
parents: 1736
diff changeset
  2249
                except pkg.actions.ActionError, e:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2250
                        raise apx.InvalidPackageErrors([e])
567
ea1d96e269a4 3505 client action and manifest creation are wasteful
johansen <johansen@sun.com>
parents: 565
diff changeset
  2251
296
576858fb8376 398 disambiguate packages matching the default authority
johansen <johansen@sun.com>
parents: 289
diff changeset
  2252
                return m
576858fb8376 398 disambiguate packages matching the default authority
johansen <johansen@sun.com>
parents: 289
diff changeset
  2253
2035
05d5d55504e7 16669 package operations should remove unused manifest cache files
Shawn Walker <shawn.walker@oracle.com>
parents: 2034
diff changeset
  2254
        def update_pkg_installed_state(self, pkg_pairs, progtrack):
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2255
                """Sets the recorded installed state of each package pair in
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2256
                'pkg_pairs'.  'pkg_pair' should be an iterable of tuples of
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2257
                the format (added, removed) where 'removed' is the FMRI of the
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2258
                package that was uninstalled, and 'added' is the package
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2259
                installed for the operation.  These pairs are representative of
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2260
                the destination and origin package for each part of the
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2261
                operation."""
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2262
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2263
                if self.version < self.CURRENT_VERSION:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2264
                        raise apx.ImageFormatUpdateNeeded(self.root)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2265
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2266
                kcat = self.get_catalog(self.IMG_CATALOG_KNOWN)
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2267
                icat = self.get_catalog(self.IMG_CATALOG_INSTALLED)
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2268
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2269
                added = set()
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2270
                removed = set()
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2271
                for add_pkg, rem_pkg in pkg_pairs:
2205
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  2272
                        if add_pkg == rem_pkg:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  2273
                                continue
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2274
                        if add_pkg:
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2275
                                added.add(add_pkg)
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2276
                        if rem_pkg:
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2277
                                removed.add(rem_pkg)
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2278
2035
05d5d55504e7 16669 package operations should remove unused manifest cache files
Shawn Walker <shawn.walker@oracle.com>
parents: 2034
diff changeset
  2279
                combo = added.union(removed)
05d5d55504e7 16669 package operations should remove unused manifest cache files
Shawn Walker <shawn.walker@oracle.com>
parents: 2034
diff changeset
  2280
                progtrack.item_set_goal(_("Package State Update Phase"),
05d5d55504e7 16669 package operations should remove unused manifest cache files
Shawn Walker <shawn.walker@oracle.com>
parents: 2034
diff changeset
  2281
                    len(combo))
05d5d55504e7 16669 package operations should remove unused manifest cache files
Shawn Walker <shawn.walker@oracle.com>
parents: 2034
diff changeset
  2282
05d5d55504e7 16669 package operations should remove unused manifest cache files
Shawn Walker <shawn.walker@oracle.com>
parents: 2034
diff changeset
  2283
                for pfmri in combo:
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2284
                        entry = kcat.get_entry(pfmri)
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2285
                        mdata = entry.get("metadata", {})
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2286
                        states = set(mdata.get("states", set()))
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2287
                        if pfmri in removed:
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2288
                                icat.remove_package(pfmri)
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2289
                                states.discard(self.PKG_STATE_INSTALLED)
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2290
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2291
                        if pfmri in added:
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2292
                                states.add(self.PKG_STATE_INSTALLED)
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2293
                                if self.PKG_STATE_ALT_SOURCE in states:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2294
                                        states.discard(
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2295
                                            self.PKG_STATE_UPGRADABLE)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2296
                                        states.discard(
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2297
                                            self.PKG_STATE_ALT_SOURCE)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2298
                                        states.discard(
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2299
                                            self.PKG_STATE_KNOWN)
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2300
                        elif self.PKG_STATE_KNOWN not in states:
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2301
                                # This entry is no longer available and has no
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2302
                                # meaningful state information, so should be
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2303
                                # discarded.
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2304
                                kcat.remove_package(pfmri)
2035
05d5d55504e7 16669 package operations should remove unused manifest cache files
Shawn Walker <shawn.walker@oracle.com>
parents: 2034
diff changeset
  2305
                                progtrack.item_add_progress()
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2306
                                continue
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2307
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2308
                        if (self.PKG_STATE_INSTALLED in states and
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2309
                            self.PKG_STATE_UNINSTALLED in states) or (
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2310
                            self.PKG_STATE_KNOWN in states and
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2311
                            self.PKG_STATE_UNKNOWN in states):
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2312
                                raise apx.ImagePkgStateError(pfmri,
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2313
                                    states)
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2314
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2315
                        # Catalog format only supports lists.
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2316
                        mdata["states"] = list(states)
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2317
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2318
                        # Now record the package state.
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2319
                        kcat.update_entry(pfmri, metadata=mdata)
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2320
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2321
                        # If the package is being marked as installed,
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2322
                        # then  it shouldn't already exist in the
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2323
                        # installed catalog and should be added.
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2324
                        if pfmri in added:
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2325
                                icat.append(kcat, pfmri=pfmri)
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2326
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2327
                        entry = mdata = states = None
2035
05d5d55504e7 16669 package operations should remove unused manifest cache files
Shawn Walker <shawn.walker@oracle.com>
parents: 2034
diff changeset
  2328
                        progtrack.item_add_progress()
05d5d55504e7 16669 package operations should remove unused manifest cache files
Shawn Walker <shawn.walker@oracle.com>
parents: 2034
diff changeset
  2329
                progtrack.item_done()
05d5d55504e7 16669 package operations should remove unused manifest cache files
Shawn Walker <shawn.walker@oracle.com>
parents: 2034
diff changeset
  2330
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2331
                # Discard entries for alternate source packages that weren't
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2332
                # installed as part of the operation.
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2333
                if self.__alt_pkg_pub_map:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2334
                        for pfmri in self.__alt_known_cat.fmris():
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2335
                                if pfmri in added:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2336
                                        # Nothing to do.
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2337
                                        continue
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2338
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2339
                                entry = kcat.get_entry(pfmri)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2340
                                if not entry:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2341
                                        # The only reason that the entry should
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2342
                                        # not exist in the 'known' part is
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2343
                                        # because it was removed during the
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2344
                                        # operation.
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2345
                                        assert pfmri in removed
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2346
                                        continue
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2347
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2348
                                states = entry.get("metadata", {}).get("states",
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2349
                                    EmptyI)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2350
                                if self.PKG_STATE_ALT_SOURCE in states:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2351
                                        kcat.remove_package(pfmri)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2352
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2353
                        # Now add the publishers of packages that were installed
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2354
                        # from temporary sources that did not previously exist
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2355
                        # to the image's configuration.  (But without any
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2356
                        # origins, sticky, and enabled.)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2357
                        cfgpubs = set(self.cfg.publishers.keys())
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2358
                        instpubs = set(f.publisher for f in added)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2359
                        altpubs = self.__alt_known_cat.publishers()
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2360
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2361
                        # List of publishers that need to be added is the
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2362
                        # intersection of installed and alternate minus
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2363
                        # the already configured.
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2364
                        newpubs = (instpubs & altpubs) - cfgpubs
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2365
                        for pfx in newpubs:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2366
                                npub = publisher.Publisher(pfx,
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  2367
                                    repository=publisher.Repository())
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2368
                                self.__add_publisher(npub,
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2369
                                    refresh_allowed=False)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2370
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2371
                        # Ensure image configuration reflects new information.
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2372
                        self.__cleanup_alt_pkg_certs()
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2373
                        self.save_config()
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2374
2149
1f90c73bcde3 8035 imageplan post execute should remove unused manifests
Shawn Walker <shawn.walker@oracle.com>
parents: 2148
diff changeset
  2375
                # Remove manifests of packages that were removed from the
1f90c73bcde3 8035 imageplan post execute should remove unused manifests
Shawn Walker <shawn.walker@oracle.com>
parents: 2148
diff changeset
  2376
                # system.  Some packages may have only had facets or
1f90c73bcde3 8035 imageplan post execute should remove unused manifests
Shawn Walker <shawn.walker@oracle.com>
parents: 2148
diff changeset
  2377
                # variants changed, so don't remove those.
2035
05d5d55504e7 16669 package operations should remove unused manifest cache files
Shawn Walker <shawn.walker@oracle.com>
parents: 2034
diff changeset
  2378
                progtrack.item_set_goal(_("Package Cache Update Phase"),
05d5d55504e7 16669 package operations should remove unused manifest cache files
Shawn Walker <shawn.walker@oracle.com>
parents: 2034
diff changeset
  2379
                    len(removed))
05d5d55504e7 16669 package operations should remove unused manifest cache files
Shawn Walker <shawn.walker@oracle.com>
parents: 2034
diff changeset
  2380
                for pfmri in removed:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2381
                        manifest.FactoredManifest.clear_cache(
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2382
                            self.get_manifest_dir(pfmri))
2149
1f90c73bcde3 8035 imageplan post execute should remove unused manifests
Shawn Walker <shawn.walker@oracle.com>
parents: 2148
diff changeset
  2383
                        try:
1f90c73bcde3 8035 imageplan post execute should remove unused manifests
Shawn Walker <shawn.walker@oracle.com>
parents: 2148
diff changeset
  2384
                                portable.remove(self.get_manifest_path(pfmri))
1f90c73bcde3 8035 imageplan post execute should remove unused manifests
Shawn Walker <shawn.walker@oracle.com>
parents: 2148
diff changeset
  2385
                        except EnvironmentError, e:
1f90c73bcde3 8035 imageplan post execute should remove unused manifests
Shawn Walker <shawn.walker@oracle.com>
parents: 2148
diff changeset
  2386
                                if e.errno != errno.ENOENT:
1f90c73bcde3 8035 imageplan post execute should remove unused manifests
Shawn Walker <shawn.walker@oracle.com>
parents: 2148
diff changeset
  2387
                                        raise apx._convert_error(e)
2035
05d5d55504e7 16669 package operations should remove unused manifest cache files
Shawn Walker <shawn.walker@oracle.com>
parents: 2034
diff changeset
  2388
                        progtrack.item_add_progress()
05d5d55504e7 16669 package operations should remove unused manifest cache files
Shawn Walker <shawn.walker@oracle.com>
parents: 2034
diff changeset
  2389
                progtrack.item_done()
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2390
1463
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  2391
                # Temporarily redirect the catalogs to a different location,
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  2392
                # so that if the save is interrupted, the image won't be left
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  2393
                # with invalid state, and then save them.
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  2394
                tmp_state_root = self.temporary_dir()
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  2395
2035
05d5d55504e7 16669 package operations should remove unused manifest cache files
Shawn Walker <shawn.walker@oracle.com>
parents: 2034
diff changeset
  2396
                progtrack.item_set_goal(_("Image State Update Phase"), 2)
1463
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  2397
                try:
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2398
                        for cat, name in ((kcat, self.IMG_CATALOG_KNOWN),
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2399
                            (icat, self.IMG_CATALOG_INSTALLED)):
1463
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  2400
                                cpath = os.path.join(tmp_state_root, name)
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  2401
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  2402
                                # Must copy the old catalog data to the new
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  2403
                                # destination as only changed files will be
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  2404
                                # written.
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  2405
                                shutil.copytree(cat.meta_root, cpath)
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  2406
                                cat.meta_root = cpath
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2407
                                cat.finalize(pfmris=added)
1463
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  2408
                                cat.save()
2035
05d5d55504e7 16669 package operations should remove unused manifest cache files
Shawn Walker <shawn.walker@oracle.com>
parents: 2034
diff changeset
  2409
                                progtrack.item_add_progress()
1463
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  2410
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2411
                        del cat, name
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2412
                        self.__init_catalogs()
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2413
2228
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  2414
                        # copy any other state files from current state
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  2415
                        # dir into new state dir.
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  2416
                        for p in os.listdir(self._statedir):
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  2417
                                fp = os.path.join(self._statedir, p)
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  2418
                                if os.path.isfile(fp):
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  2419
                                        portable.copyfile(fp, os.path.join(tmp_state_root, p))
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  2420
1463
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  2421
                        # Next, preserve the old installed state dir, rename the
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  2422
                        # new one into place, and then remove the old one.
2293
631000734928 3679 modified preserve=true files should be backed up during uninstall
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
  2423
                        orig_state_root, ignored = self.salvage(self._statedir)
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2424
                        portable.rename(tmp_state_root, self._statedir)
1463
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  2425
                        shutil.rmtree(orig_state_root, True)
1779
b80275b45b18 14176 copytree callers must catch shutil.Error and not traceback
Shawn Walker <srw@sun.com>
parents: 1771
diff changeset
  2426
                except EnvironmentError, e:
b80275b45b18 14176 copytree callers must catch shutil.Error and not traceback
Shawn Walker <srw@sun.com>
parents: 1771
diff changeset
  2427
                        # shutil.Error can contains a tuple of lists of errors.
b80275b45b18 14176 copytree callers must catch shutil.Error and not traceback
Shawn Walker <srw@sun.com>
parents: 1771
diff changeset
  2428
                        # Some of the error entries may be a tuple others will
b80275b45b18 14176 copytree callers must catch shutil.Error and not traceback
Shawn Walker <srw@sun.com>
parents: 1771
diff changeset
  2429
                        # be a string due to poor error handling in shutil.
b80275b45b18 14176 copytree callers must catch shutil.Error and not traceback
Shawn Walker <srw@sun.com>
parents: 1771
diff changeset
  2430
                        if isinstance(e, shutil.Error) and \
b80275b45b18 14176 copytree callers must catch shutil.Error and not traceback
Shawn Walker <srw@sun.com>
parents: 1771
diff changeset
  2431
                            type(e.args[0]) == list:
b80275b45b18 14176 copytree callers must catch shutil.Error and not traceback
Shawn Walker <srw@sun.com>
parents: 1771
diff changeset
  2432
                                msg = ""
b80275b45b18 14176 copytree callers must catch shutil.Error and not traceback
Shawn Walker <srw@sun.com>
parents: 1771
diff changeset
  2433
                                for elist in e.args:
b80275b45b18 14176 copytree callers must catch shutil.Error and not traceback
Shawn Walker <srw@sun.com>
parents: 1771
diff changeset
  2434
                                        for entry in elist:
b80275b45b18 14176 copytree callers must catch shutil.Error and not traceback
Shawn Walker <srw@sun.com>
parents: 1771
diff changeset
  2435
                                                if type(entry) == tuple:
b80275b45b18 14176 copytree callers must catch shutil.Error and not traceback
Shawn Walker <srw@sun.com>
parents: 1771
diff changeset
  2436
                                                        msg += "%s\n" % \
b80275b45b18 14176 copytree callers must catch shutil.Error and not traceback
Shawn Walker <srw@sun.com>
parents: 1771
diff changeset
  2437
                                                            entry[-1]
b80275b45b18 14176 copytree callers must catch shutil.Error and not traceback
Shawn Walker <srw@sun.com>
parents: 1771
diff changeset
  2438
                                                else:
b80275b45b18 14176 copytree callers must catch shutil.Error and not traceback
Shawn Walker <srw@sun.com>
parents: 1771
diff changeset
  2439
                                                        msg += "%s\n" % entry
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2440
                                raise apx.UnknownErrors(msg)
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2441
                        raise apx._convert_error(e)
1463
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  2442
                finally:
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  2443
                        # Regardless of success, the following must happen.
1842
b71de8f65cc8 15176 imageplan keeps solver cache and catalog data too long
Shawn Walker <shawn.walker@oracle.com>
parents: 1837
diff changeset
  2444
                        self.__init_catalogs()
1463
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  2445
                        if os.path.exists(tmp_state_root):
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  2446
                                shutil.rmtree(tmp_state_root, True)
2035
05d5d55504e7 16669 package operations should remove unused manifest cache files
Shawn Walker <shawn.walker@oracle.com>
parents: 2034
diff changeset
  2447
                progtrack.item_done()
195
b23d0425f0f7 11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents: 192
diff changeset
  2448
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2449
        def get_catalog(self, name):
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2450
                """Returns the requested image catalog.
195
b23d0425f0f7 11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents: 192
diff changeset
  2451
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2452
                'name' must be one of the following image constants:
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2453
                    IMG_CATALOG_KNOWN
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2454
                        The known catalog contains all of packages that are
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2455
                        installed or available from a publisher's repository.
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2456
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2457
                    IMG_CATALOG_INSTALLED
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2458
                        The installed catalog is a subset of the 'known'
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2459
                        catalog that only contains installed packages."""
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2460
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2461
                if not self.imgdir:
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2462
                        raise RuntimeError("self.imgdir must be set")
418
21621fd99956 2543 eliminate unnecessary stat() calls from gen_installed_pkgs()
Danek Duvall <danek.duvall@sun.com>
parents: 409
diff changeset
  2463
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2464
                cat = None
717
c40259b4ce98 4569 pkg uninstall tracesback when lacking permissions
Brock Pytlik <bpytlik@sun.com>
parents: 715
diff changeset
  2465
                try:
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2466
                        cat = self.__catalogs[name]
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2467
                except KeyError:
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2468
                        pass
195
b23d0425f0f7 11 use FMRIs with fully specified authorities internally
johansen <johansen@sun.com>
parents: 192
diff changeset
  2469
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2470
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2471
                if not cat:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2472
                        cat = self.__get_catalog(name)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2473
                        self.__catalogs[name] = cat
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2474
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2475
                if name == self.IMG_CATALOG_KNOWN:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2476
                        # Apply alternate package source data every time that
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2477
                        # the known catalog is requested.
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2478
                        self.__apply_alt_pkg_sources(cat)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  2479
1837
03aa2b10f29d 15169 image-update plans twice and keeps both
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  2480
                return cat
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  2481
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2482
        def _manifest_cb(self, cat, f):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2483
                # Only allow lazy-load for packages from non-v1 sources.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2484
                # Assume entries for other sources have all data
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2485
                # required in catalog.  This prevents manifest retrieval
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2486
                # for packages that don't have any related action data
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2487
                # in the catalog because they don't have any related
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2488
                # action data in their manifest.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2489
                entry = cat.get_entry(f)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2490
                states = entry["metadata"]["states"]
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2491
                if self.PKG_STATE_V1 not in states:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2492
                        return self.get_manifest(f, all_variants=True)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2493
                return
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2494
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  2495
        def __get_catalog(self, name):
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  2496
                """Private method to retrieve catalog; this bypasses the
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2497
                normal automatic caching (unless the image hasn't been
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2498
                upgraded yet)."""
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2499
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2500
                if self.__upgraded and self.version < 3:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2501
                        # Assume the catalog is already cached in this case
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2502
                        # and can't be reloaded from disk as it doesn't exist
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2503
                        # on disk yet.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2504
                        return self.__catalogs[name]
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  2505
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2506
                croot = os.path.join(self._statedir, name)
419
a38f1ed7cf76 1867 'pkg list' takes *WAY* too long
Danek Duvall <danek.duvall@sun.com>
parents: 418
diff changeset
  2507
                try:
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2508
                        os.makedirs(croot)
419
a38f1ed7cf76 1867 'pkg list' takes *WAY* too long
Danek Duvall <danek.duvall@sun.com>
parents: 418
diff changeset
  2509
                except EnvironmentError, e:
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
  2510
                        if e.errno in (errno.EACCES, errno.EROFS):
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2511
                                # Allow operations to work for
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2512
                                # unprivileged users.
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2513
                                croot = None
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2514
                        elif e.errno != errno.EEXIST:
658
e470d4688084 4412 pkg refresh can strand one w/o packages after upgrade from 86
Danek Duvall <danek.duvall@sun.com>
parents: 655
diff changeset
  2515
                                raise
e470d4688084 4412 pkg refresh can strand one w/o packages after upgrade from 86
Danek Duvall <danek.duvall@sun.com>
parents: 655
diff changeset
  2516
1358
6fec8fbc15a6 11324 package state written to parent boot environment during image-update
Shawn Walker <srw@sun.com>
parents: 1353
diff changeset
  2517
                # batch_mode is set to True here as any operations that modify
6fec8fbc15a6 11324 package state written to parent boot environment during image-update
Shawn Walker <srw@sun.com>
parents: 1353
diff changeset
  2518
                # the catalogs (add or remove entries) are only done during an
6fec8fbc15a6 11324 package state written to parent boot environment during image-update
Shawn Walker <srw@sun.com>
parents: 1353
diff changeset
  2519
                # image upgrade or metadata refresh.  In both cases, the catalog
6fec8fbc15a6 11324 package state written to parent boot environment during image-update
Shawn Walker <srw@sun.com>
parents: 1353
diff changeset
  2520
                # is resorted and finalized so this is always safe to use.
6fec8fbc15a6 11324 package state written to parent boot environment during image-update
Shawn Walker <srw@sun.com>
parents: 1353
diff changeset
  2521
                cat = pkg.catalog.Catalog(batch_mode=True,
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2522
                    manifest_cb=self._manifest_cb, meta_root=croot, sign=False)
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2523
                return cat
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2524
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  2525
        def __remove_catalogs(self):
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2526
                """Removes all image catalogs and their directories."""
419
a38f1ed7cf76 1867 'pkg list' takes *WAY* too long
Danek Duvall <danek.duvall@sun.com>
parents: 418
diff changeset
  2527
1463
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  2528
                self.__init_catalogs()
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2529
                for name in (self.IMG_CATALOG_KNOWN,
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2530
                    self.IMG_CATALOG_INSTALLED):
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2531
                        shutil.rmtree(os.path.join(self._statedir, name))
418
21621fd99956 2543 eliminate unnecessary stat() calls from gen_installed_pkgs()
Danek Duvall <danek.duvall@sun.com>
parents: 409
diff changeset
  2532
556
1c3526ca7b9e 2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents: 554
diff changeset
  2533
        def get_version_installed(self, pfmri):
1c3526ca7b9e 2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents: 554
diff changeset
  2534
                """Returns an fmri of the installed package matching the
1c3526ca7b9e 2022 client should provide operational intent to server
Shawn Walker <shawn.walker@sun.com>
parents: 554
diff changeset
  2535
                package stem of the given fmri or None if no match is found."""
996
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2536
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2537
                cat = self.get_catalog(self.IMG_CATALOG_INSTALLED)
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2538
                for ver, fmris in cat.fmris_by_version(pfmri.pkg_name):
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2539
                        return fmris[0]
423
5c756997bf67 2253 With the latest build of the pkg repo, can't install packages from additional authorities
Danek Duvall <danek.duvall@sun.com>
parents: 419
diff changeset
  2540
                return None
5c756997bf67 2253 With the latest build of the pkg repo, can't install packages from additional authorities
Danek Duvall <danek.duvall@sun.com>
parents: 419
diff changeset
  2541
135
a1e20e9a9845 add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents: 116
diff changeset
  2542
        def has_version_installed(self, fmri):
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 51
diff changeset
  2543
                """Check that the version given in the FMRI or a successor is
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 302
diff changeset
  2544
                installed in the current image."""
258
b3b7592412ec 270 Need ability to rename packages
johansen <johansen@sun.com>
parents: 251
diff changeset
  2545
560
4c8d82d58131 3569 pkg state code obviates use of _get_version_installed
Shawn Walker <shawn.walker@sun.com>
parents: 556
diff changeset
  2546
                v = self.get_version_installed(fmri)
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 51
diff changeset
  2547
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2548
                if v and not fmri.publisher:
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  2549
                        fmri.set_publisher(v.get_publisher_str())
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2550
                elif not fmri.publisher:
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  2551
                        fmri.set_publisher(self.get_highest_ranked_publisher(),
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  2552
                            True)
266
5e5bff6fedce 582 Importing packages seemingly misrecords dependencies
johansen <johansen@sun.com>
parents: 260
diff changeset
  2553
1288
4248f27af42a 10417 rename v0 support should be removed everywhere
Shawn Walker <srw@sun.com>
parents: 1271
diff changeset
  2554
                if v and v.is_successor(fmri):
258
b3b7592412ec 270 Need ability to rename packages
johansen <johansen@sun.com>
parents: 251
diff changeset
  2555
                        return True
59
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 51
diff changeset
  2556
                return False
eef94b0c0694 require dependencies; dependency following; pkg status; timestamp change
Stephen Hahn <sch@sun.com>
parents: 51
diff changeset
  2557
1461
fdf40c8c6765 820 Need a way to obsolete packages
Danek Duvall <danek.duvall@sun.com>
parents: 1449
diff changeset
  2558
        def get_pkg_state(self, pfmri):
fdf40c8c6765 820 Need a way to obsolete packages
Danek Duvall <danek.duvall@sun.com>
parents: 1449
diff changeset
  2559
                """Returns the list of states a package is in for this image."""
fdf40c8c6765 820 Need a way to obsolete packages
Danek Duvall <danek.duvall@sun.com>
parents: 1449
diff changeset
  2560
fdf40c8c6765 820 Need a way to obsolete packages
Danek Duvall <danek.duvall@sun.com>
parents: 1449
diff changeset
  2561
                cat = self.get_catalog(self.IMG_CATALOG_KNOWN)
1537
00a5b4d54eb8 5872 List APIs required
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
  2562
                entry = cat.get_entry(pfmri)
00a5b4d54eb8 5872 List APIs required
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
  2563
                if entry is None:
1461
fdf40c8c6765 820 Need a way to obsolete packages
Danek Duvall <danek.duvall@sun.com>
parents: 1449
diff changeset
  2564
                        return []
fdf40c8c6765 820 Need a way to obsolete packages
Danek Duvall <danek.duvall@sun.com>
parents: 1449
diff changeset
  2565
                return entry["metadata"]["states"]
fdf40c8c6765 820 Need a way to obsolete packages
Danek Duvall <danek.duvall@sun.com>
parents: 1449
diff changeset
  2566
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2567
        def is_pkg_installed(self, pfmri):
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2568
                """Returns a boolean value indicating whether the specified
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2569
                package is installed."""
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2570
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
  2571
                # Avoid loading the installed catalog if the known catalog
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
  2572
                # is already loaded.  This is safe since the installed
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
  2573
                # catalog is a subset of the known, and a specific entry
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
  2574
                # is being retrieved.
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
  2575
                if not self.__catalog_loaded(self.IMG_CATALOG_KNOWN):
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
  2576
                        cat = self.get_catalog(self.IMG_CATALOG_INSTALLED)
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
  2577
                else:
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
  2578
                        cat = self.get_catalog(self.IMG_CATALOG_KNOWN)
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
  2579
1537
00a5b4d54eb8 5872 List APIs required
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
  2580
                entry = cat.get_entry(pfmri)
00a5b4d54eb8 5872 List APIs required
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
  2581
                if entry is None:
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2582
                        return False
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
  2583
                states = entry["metadata"]["states"]
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
  2584
                return self.PKG_STATE_INSTALLED in states
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2585
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2586
        def list_excludes(self, new_variants=None, new_facets=None):
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  2587
                """Generate a list of callables that each return True if an
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  2588
                action is to be included in the image using the currently
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2589
                defined variants & facets for the image, or an updated set if
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2590
                new_variants or new_facets are specified."""
1537
00a5b4d54eb8 5872 List APIs required
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
  2591
838
aafbe4737188 3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 835
diff changeset
  2592
                if new_variants:
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  2593
                        new_vars = self.cfg.variants.copy()
838
aafbe4737188 3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 835
diff changeset
  2594
                        new_vars.update(new_variants)
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2595
                        var_call = new_vars.allow_action
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2596
                else:
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  2597
                        var_call = self.cfg.variants.allow_action
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2598
                if new_facets:
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2599
                        fac_call = new_facets.allow_action
838
aafbe4737188 3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 835
diff changeset
  2600
                else:
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  2601
                        fac_call = self.cfg.facets.allow_action
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2602
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2603
                return [var_call, fac_call]
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2604
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2605
        def get_variants(self):
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2606
                """ return a copy of the current image variants"""
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  2607
                return self.cfg.variants.copy()
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2608
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2609
        def get_facets(self):
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  2610
                """ Return a copy of the current image facets"""
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  2611
                return self.cfg.facets.copy()
838
aafbe4737188 3245 need to support creation of multi-architecture (fat) packages
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 835
diff changeset
  2612
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2613
        def __rebuild_image_catalogs(self, progtrack=None):
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2614
                """Rebuilds the image catalogs based on the available publisher
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2615
                catalogs."""
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2616
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2617
                if self.version < 3:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2618
                        raise apx.ImageFormatUpdateNeeded(self.root)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2619
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2620
                if not progtrack:
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2621
                        progtrack = progress.QuietProgressTracker()
1507
b956ea23d3a6 11735 pkg history data files should not be executable
Richard Lowe <richlowe@richlowe.net>
parents: 1505
diff changeset
  2622
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2623
                progtrack.cache_catalogs_start()
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2624
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2625
                publist = list(self.gen_publishers())
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2626
2141
3757a0f8a7d1 17385 history should store uuids for boot environments
Tim Foster <tim.s.foster@oracle.com>
parents: 2135
diff changeset
  2627
                be_name, be_uuid = bootenv.BootEnv.get_be_name(self.root)
2135
6eeb55920e13 3419 history command -- ability to specify dates or date ranges desired
Tim Foster <tim.s.foster@oracle.com>
parents: 2105
diff changeset
  2628
                self.history.log_operation_start("rebuild-image-catalogs",
2141
3757a0f8a7d1 17385 history should store uuids for boot environments
Tim Foster <tim.s.foster@oracle.com>
parents: 2135
diff changeset
  2629
                    be_name=be_name, be_uuid=be_uuid)
1402
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  2630
1549
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2631
                # Mark all operations as occurring at this time.
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2632
                op_time = datetime.datetime.utcnow()
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2633
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2634
                # The image catalogs need to be updated, but this is a bit
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2635
                # tricky as previously known packages must remain known even
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2636
                # if PKG_STATE_KNOWN is no longer true if any other state
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2637
                # information is present.  This is to allow freezing, etc. of
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2638
                # package states on a permanent basis even if the package is
1549
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2639
                # no longer available from a publisher repository.  However,
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2640
                # this is only True of installed packages.
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2641
                old_icat = self.get_catalog(self.IMG_CATALOG_INSTALLED)
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2642
1358
6fec8fbc15a6 11324 package state written to parent boot environment during image-update
Shawn Walker <srw@sun.com>
parents: 1353
diff changeset
  2643
                # batch_mode is set to True here since without it, catalog
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2644
                # population time is almost doubled (since the catalog is
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2645
                # re-sorted and stats are generated for every operation).
1402
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  2646
                # In addition, the new catalog is first created in a new
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  2647
                # temporary directory so that it can be moved into place
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  2648
                # at the very end of this process (to minimize the chance
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  2649
                # that failure or interruption will cause the image to be
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  2650
                # left in an inconsistent state).
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  2651
                tmp_state_root = self.temporary_dir()
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  2652
2228
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  2653
                # Copy any regular files placed in the state directory
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  2654
                for p in os.listdir(self._statedir):
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  2655
                        fp = os.path.join(self._statedir, p)
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  2656
                        if os.path.isfile(fp):
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  2657
                                portable.copyfile(fp, os.path.join(tmp_state_root, p))
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  2658
1402
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  2659
                kcat = pkg.catalog.Catalog(batch_mode=True,
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  2660
                    meta_root=os.path.join(tmp_state_root,
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  2661
                    self.IMG_CATALOG_KNOWN), sign=False)
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2662
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2663
                # XXX if any of the below fails for any reason, the old 'known'
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2664
                # catalog needs to be re-loaded so the client is in a consistent
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2665
                # state.
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2666
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2667
                # All enabled publisher catalogs must be processed.
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
  2668
                pub_cats = [(pub.prefix, pub.catalog) for pub in publist]
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2669
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2670
                # XXX For backwards compatibility, 'upgradability' of packages
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2671
                # is calculated and stored based on whether a given pkg stem
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2672
                # matches the newest version in the catalog.  This is quite
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2673
                # expensive (due to overhead), but at least the cost is
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2674
                # consolidated here.  This comparison is also cross-publisher,
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2675
                # as it used to be.  In the future, it could likely be improved
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2676
                # by usage of the SAT solver.
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2677
                newest = {}
1549
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2678
                for pfx, cat in [(None, old_icat)] + pub_cats:
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2679
                        for f in cat.fmris(last=True, pubs=[pfx]):
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2680
                                nver, snver = newest.get(f.pkg_name, (None,
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2681
                                    None))
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2682
                                if f.version > nver:
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2683
                                        newest[f.pkg_name] = (f.version,
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2684
                                            str(f.version))
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2685
1369
e86145680c34 11359 catalog should offer lazy-load mechanism for action metadata
Shawn Walker <srw@sun.com>
parents: 1358
diff changeset
  2686
                # Next, copy all of the entries for the catalog parts that
e86145680c34 11359 catalog should offer lazy-load mechanism for action metadata
Shawn Walker <srw@sun.com>
parents: 1358
diff changeset
  2687
                # currently exist into the image 'known' catalog.
1549
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2688
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2689
                # Iterator for source parts.
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2690
                sparts = (
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2691
                   (pfx, cat, name, cat.get_part(name, must_exist=True))
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2692
                   for pfx, cat in pub_cats
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2693
                   for name in cat.parts
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2694
                )
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2695
1678
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2696
                # Build list of installed packages based on actual state
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2697
                # information just in case there is a state issue from an
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2698
                # older client.
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2699
                inst_stems = {}
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2700
                for t, entry in old_icat.tuple_entries():
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2701
                        states = entry["metadata"]["states"]
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2702
                        if self.PKG_STATE_INSTALLED not in states:
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2703
                                continue
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2704
                        pub, stem, ver = t
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2705
                        inst_stems.setdefault(pub, {})
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2706
                        inst_stems[pub].setdefault(stem, {})
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2707
                        inst_stems[pub][stem][ver] = False
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2708
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2709
                # Create the new installed catalog in a temporary location.
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2710
                icat = pkg.catalog.Catalog(batch_mode=True,
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2711
                    meta_root=os.path.join(tmp_state_root,
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2712
                    self.IMG_CATALOG_INSTALLED), sign=False)
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2713
1801
09b5c1ddef24 14832 pkg info traceback for renamed packages with no variant-applicable dependencies
Shawn Walker <srw@sun.com>
parents: 1786
diff changeset
  2714
                excludes = self.list_excludes()
1549
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2715
                for pfx, cat, name, spart in sparts:
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2716
                        # 'spart' is the source part.
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2717
                        if spart is None:
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2718
                                # Client hasn't retrieved this part.
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2719
                                continue
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2720
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2721
                        # New known part.
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2722
                        nkpart = kcat.get_part(name)
1678
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2723
                        nipart = icat.get_part(name)
1549
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2724
                        base = name.startswith("catalog.base.")
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2725
1970
60471574c487 16238 client api should ignore invalid and not yet supported packages
Shawn Walker <shawn.walker@oracle.com>
parents: 1895
diff changeset
  2726
                        # Avoid accessor overhead since these will be
1549
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2727
                        # used for every entry.
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2728
                        cat_ver = cat.version
1970
60471574c487 16238 client api should ignore invalid and not yet supported packages
Shawn Walker <shawn.walker@oracle.com>
parents: 1895
diff changeset
  2729
                        dp = cat.get_part("catalog.dependency.C",
60471574c487 16238 client api should ignore invalid and not yet supported packages
Shawn Walker <shawn.walker@oracle.com>
parents: 1895
diff changeset
  2730
                            must_exist=True)
1549
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2731
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2732
                        for t, sentry in spart.tuple_entries(pubs=[pfx]):
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2733
                                pub, stem, ver = t
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2734
1678
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2735
                                installed = False
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2736
                                if pub in inst_stems and \
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2737
                                    stem in inst_stems[pub] and \
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2738
                                    ver in inst_stems[pub][stem]:
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2739
                                        installed = True
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2740
                                        inst_stems[pub][stem][ver] = True
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2741
1549
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2742
                                # copy() is too slow here and catalog entries
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2743
                                # are shallow so this should be sufficient.
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  2744
                                entry = dict(sentry.iteritems())
1549
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2745
                                if not base:
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2746
                                        # Nothing else to do except add the
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2747
                                        # entry for non-base catalog parts.
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2748
                                        nkpart.add(metadata=entry,
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2749
                                            op_time=op_time, pub=pub, stem=stem,
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2750
                                            ver=ver)
1678
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2751
                                        if installed:
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2752
                                                nipart.add(metadata=entry,
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2753
                                                    op_time=op_time, pub=pub,
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2754
                                                    stem=stem, ver=ver)
1549
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2755
                                        continue
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2756
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2757
                                # Only the base catalog part stores package
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2758
                                # state information and/or other metadata.
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2759
                                mdata = entry["metadata"] = {}
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2760
                                states = [self.PKG_STATE_KNOWN]
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2761
                                if cat_ver == 0:
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2762
                                        states.append(self.PKG_STATE_V0)
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2763
                                else:
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2764
                                        # Assume V1 catalog source.
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2765
                                        states.append(self.PKG_STATE_V1)
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2766
1678
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2767
                                if installed:
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2768
                                        states.append(self.PKG_STATE_INSTALLED)
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2769
1549
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2770
                                nver, snver = newest.get(stem, (None, None))
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2771
                                if snver is not None and ver != snver:
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2772
                                        states.append(self.PKG_STATE_UPGRADABLE)
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2773
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2774
                                # Determine if package is obsolete or has been
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2775
                                # renamed and mark with appropriate state.
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2776
                                dpent = None
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2777
                                if dp is not None:
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2778
                                        dpent = dp.get_entry(pub=pub, stem=stem,
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2779
                                            ver=ver)
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2780
                                if dpent is not None:
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2781
                                        for a in dpent["actions"]:
1801
09b5c1ddef24 14832 pkg info traceback for renamed packages with no variant-applicable dependencies
Shawn Walker <srw@sun.com>
parents: 1786
diff changeset
  2782
                                                # Constructing action objects
09b5c1ddef24 14832 pkg info traceback for renamed packages with no variant-applicable dependencies
Shawn Walker <srw@sun.com>
parents: 1786
diff changeset
  2783
                                                # for every action would be a
09b5c1ddef24 14832 pkg info traceback for renamed packages with no variant-applicable dependencies
Shawn Walker <srw@sun.com>
parents: 1786
diff changeset
  2784
                                                # lot slower, so a simple string
09b5c1ddef24 14832 pkg info traceback for renamed packages with no variant-applicable dependencies
Shawn Walker <srw@sun.com>
parents: 1786
diff changeset
  2785
                                                # match is done first so that
09b5c1ddef24 14832 pkg info traceback for renamed packages with no variant-applicable dependencies
Shawn Walker <srw@sun.com>
parents: 1786
diff changeset
  2786
                                                # only interesting actions get
09b5c1ddef24 14832 pkg info traceback for renamed packages with no variant-applicable dependencies
Shawn Walker <srw@sun.com>
parents: 1786
diff changeset
  2787
                                                # constructed.
1549
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2788
                                                if not a.startswith("set"):
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2789
                                                        continue
1801
09b5c1ddef24 14832 pkg info traceback for renamed packages with no variant-applicable dependencies
Shawn Walker <srw@sun.com>
parents: 1786
diff changeset
  2790
                                                if not ("pkg.obsolete" in a or \
09b5c1ddef24 14832 pkg info traceback for renamed packages with no variant-applicable dependencies
Shawn Walker <srw@sun.com>
parents: 1786
diff changeset
  2791
                                                    "pkg.renamed" in a):
09b5c1ddef24 14832 pkg info traceback for renamed packages with no variant-applicable dependencies
Shawn Walker <srw@sun.com>
parents: 1786
diff changeset
  2792
                                                        continue
09b5c1ddef24 14832 pkg info traceback for renamed packages with no variant-applicable dependencies
Shawn Walker <srw@sun.com>
parents: 1786
diff changeset
  2793
1970
60471574c487 16238 client api should ignore invalid and not yet supported packages
Shawn Walker <shawn.walker@oracle.com>
parents: 1895
diff changeset
  2794
                                                try:
60471574c487 16238 client api should ignore invalid and not yet supported packages
Shawn Walker <shawn.walker@oracle.com>
parents: 1895
diff changeset
  2795
                                                        act = pkg.actions.fromstr(a)
60471574c487 16238 client api should ignore invalid and not yet supported packages
Shawn Walker <shawn.walker@oracle.com>
parents: 1895
diff changeset
  2796
                                                except pkg.actions.ActionError:
60471574c487 16238 client api should ignore invalid and not yet supported packages
Shawn Walker <shawn.walker@oracle.com>
parents: 1895
diff changeset
  2797
                                                        # If the action can't be
60471574c487 16238 client api should ignore invalid and not yet supported packages
Shawn Walker <shawn.walker@oracle.com>
parents: 1895
diff changeset
  2798
                                                        # parsed or is not yet
60471574c487 16238 client api should ignore invalid and not yet supported packages
Shawn Walker <shawn.walker@oracle.com>
parents: 1895
diff changeset
  2799
                                                        # supported, continue.
60471574c487 16238 client api should ignore invalid and not yet supported packages
Shawn Walker <shawn.walker@oracle.com>
parents: 1895
diff changeset
  2800
                                                        continue
60471574c487 16238 client api should ignore invalid and not yet supported packages
Shawn Walker <shawn.walker@oracle.com>
parents: 1895
diff changeset
  2801
1801
09b5c1ddef24 14832 pkg info traceback for renamed packages with no variant-applicable dependencies
Shawn Walker <srw@sun.com>
parents: 1786
diff changeset
  2802
                                                if act.attrs["value"].lower() != "true":
09b5c1ddef24 14832 pkg info traceback for renamed packages with no variant-applicable dependencies
Shawn Walker <srw@sun.com>
parents: 1786
diff changeset
  2803
                                                        continue
09b5c1ddef24 14832 pkg info traceback for renamed packages with no variant-applicable dependencies
Shawn Walker <srw@sun.com>
parents: 1786
diff changeset
  2804
09b5c1ddef24 14832 pkg info traceback for renamed packages with no variant-applicable dependencies
Shawn Walker <srw@sun.com>
parents: 1786
diff changeset
  2805
                                                if act.attrs["name"] == "pkg.obsolete":
1549
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2806
                                                        states.append(
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2807
                                                            self.PKG_STATE_OBSOLETE)
1801
09b5c1ddef24 14832 pkg info traceback for renamed packages with no variant-applicable dependencies
Shawn Walker <srw@sun.com>
parents: 1786
diff changeset
  2808
                                                elif act.attrs["name"] == "pkg.renamed":
09b5c1ddef24 14832 pkg info traceback for renamed packages with no variant-applicable dependencies
Shawn Walker <srw@sun.com>
parents: 1786
diff changeset
  2809
                                                        if not act.include_this(
09b5c1ddef24 14832 pkg info traceback for renamed packages with no variant-applicable dependencies
Shawn Walker <srw@sun.com>
parents: 1786
diff changeset
  2810
                                                            excludes):
1549
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2811
                                                                continue
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2812
                                                        states.append(
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2813
                                                            self.PKG_STATE_RENAMED)
1801
09b5c1ddef24 14832 pkg info traceback for renamed packages with no variant-applicable dependencies
Shawn Walker <srw@sun.com>
parents: 1786
diff changeset
  2814
1549
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2815
                                mdata["states"] = states
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2816
1678
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2817
                                # Add base entries.
1549
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2818
                                nkpart.add(metadata=entry, op_time=op_time,
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2819
                                    pub=pub, stem=stem, ver=ver)
1678
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2820
                                if installed:
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2821
                                        nipart.add(metadata=entry,
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2822
                                            op_time=op_time, pub=pub, stem=stem,
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2823
                                            ver=ver)
1549
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2824
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2825
                # Now add installed packages to list of known packages using
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2826
                # previous state information.  While doing so, track any
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2827
                # new entries as the versions for the stem of the entry will
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2828
                # need to be passed to finalize() for sorting.
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2829
                final_fmris = []
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2830
                for name in old_icat.parts:
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2831
                        # Old installed part.
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2832
                        ipart = old_icat.get_part(name, must_exist=True)
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2833
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2834
                        # New known part.
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2835
                        nkpart = kcat.get_part(name)
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2836
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2837
                        # New installed part.
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2838
                        nipart = icat.get_part(name)
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2839
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2840
                        base = name.startswith("catalog.base.")
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2841
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2842
                        mdata = None
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2843
                        for t, entry in ipart.tuple_entries():
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2844
                                pub, stem, ver = t
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2845
1678
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2846
                                if pub not in inst_stems or \
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2847
                                    stem not in inst_stems[pub] or \
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2848
                                    ver not in inst_stems[pub][stem] or \
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2849
                                    inst_stems[pub][stem][ver]:
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2850
                                        # Entry is no longer valid or is already
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2851
                                        # known.
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2852
                                        continue
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2853
1549
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2854
                                if base:
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2855
                                        mdata = entry["metadata"]
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2856
                                        states = set(mdata["states"])
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2857
                                        states.discard(self.PKG_STATE_KNOWN)
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2858
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2859
                                        nver, snver = newest.get(stem, (None,
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2860
                                            None))
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2861
                                        if snver is not None and ver == snver:
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2862
                                                states.discard(
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2863
                                                    self.PKG_STATE_UPGRADABLE)
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2864
                                        elif snver is not None:
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2865
                                                states.add(
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2866
                                                    self.PKG_STATE_UPGRADABLE)
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2867
                                        mdata["states"] = list(states)
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2868
1678
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2869
                                # Add entries.
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2870
                                nkpart.add(metadata=entry, op_time=op_time,
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2871
                                    pub=pub, stem=stem, ver=ver)
825ec1d3702e 14013 image catalog rebuild can stumble on v0 to v1 repo transition
Shawn Walker <srw@sun.com>
parents: 1672
diff changeset
  2872
                                nipart.add(metadata=entry, op_time=op_time,
1549
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2873
                                    pub=pub, stem=stem, ver=ver)
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2874
                                final_fmris.append(pkg.fmri.PkgFmri(
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2875
                                    "%s@%s" % (stem, ver), publisher=pub))
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2876
1402
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  2877
                # Save the new catalogs.
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2878
                for cat in kcat, icat:
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2879
                        misc.makedirs(cat.meta_root)
1549
cc81f5023603 13110 image catalog rebuild could be faster
Shawn Walker <srw@sun.com>
parents: 1538
diff changeset
  2880
                        cat.finalize(pfmris=final_fmris)
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2881
                        cat.save()
1402
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  2882
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  2883
                # Next, preserve the old installed state dir, rename the
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  2884
                # new one into place, and then remove the old one.
2293
631000734928 3679 modified preserve=true files should be backed up during uninstall
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
  2885
                orig_state_root, ignored = self.salvage(self._statedir)
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2886
                portable.rename(tmp_state_root, self._statedir)
1402
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  2887
                shutil.rmtree(orig_state_root, True)
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  2888
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  2889
                # Ensure in-memory catalogs get reloaded.
1463
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  2890
                self.__init_catalogs()
1402
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  2891
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2892
                progtrack.cache_catalogs_done()
1402
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  2893
                self.history.log_operation_end()
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2894
996
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2895
        def refresh_publishers(self, full_refresh=False, immediate=False,
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2896
            pubs=None, progtrack=None):
996
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2897
                """Refreshes the metadata (e.g. catalog) for one or more
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  2898
                publishers.  Callers are responsible for locking the image.
996
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2899
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2900
                'full_refresh' is an optional boolean value indicating whether
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2901
                a full retrieval of publisher metadata (e.g. catalogs) or only
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2902
                an update to the existing metadata should be performed.  When
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2903
                True, 'immediate' is also set to True.
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2904
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2905
                'immediate' is an optional boolean value indicating whether the
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2906
                a refresh should occur now.  If False, a publisher's selected
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2907
                repository will only be checked for updates if the update
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2908
                interval period recorded in the image configuration has been
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2909
                exceeded.
996
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2910
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2911
                'pubs' is a list of publisher prefixes or publisher objects
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2912
                to refresh.  Passing an empty list or using the default value
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2913
                implies all publishers."""
996
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2914
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2915
                if self.version < 3:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2916
                        raise apx.ImageFormatUpdateNeeded(self.root)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  2917
996
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2918
                if not progtrack:
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2919
                        progtrack = progress.QuietProgressTracker()
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2920
2141
3757a0f8a7d1 17385 history should store uuids for boot environments
Tim Foster <tim.s.foster@oracle.com>
parents: 2135
diff changeset
  2921
                be_name, be_uuid = bootenv.BootEnv.get_be_name(self.root)
2135
6eeb55920e13 3419 history command -- ability to specify dates or date ranges desired
Tim Foster <tim.s.foster@oracle.com>
parents: 2105
diff changeset
  2922
                self.history.log_operation_start("refresh-publishers",
2141
3757a0f8a7d1 17385 history should store uuids for boot environments
Tim Foster <tim.s.foster@oracle.com>
parents: 2135
diff changeset
  2923
                    be_name=be_name, be_uuid=be_uuid)
996
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2924
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2925
                # Verify validity of certificates before attempting network
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2926
                # operations.
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2927
                try:
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2928
                        self.check_cert_validity()
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2929
                except apx.ExpiringCertificate, e:
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
  2930
                        logger.error(str(e))
996
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2931
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2932
                pubs_to_refresh = []
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2933
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2934
                if not pubs:
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2935
                        # Omit disabled publishers.
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2936
                        pubs = [p for p in self.gen_publishers()]
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  2937
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  2938
                if not pubs:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  2939
                        self.__rebuild_image_catalogs(progtrack=progtrack)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  2940
                        return
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2293
diff changeset
  2941
996
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2942
                for pub in pubs:
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2943
                        p = pub
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2944
                        if not isinstance(p, publisher.Publisher):
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2945
                                p = self.get_publisher(prefix=p)
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2946
                        if p.disabled:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2947
                                e = apx.DisabledPublisher(p)
996
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2948
                                self.history.log_operation_end(error=e)
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2949
                                raise e
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2950
                        pubs_to_refresh.append(p)
996
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2951
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2952
                if not pubs_to_refresh:
2069
207f168361ba 10148 successful image operations with no effect should be elided from history
Shawn Walker <shawn.walker@oracle.com>
parents: 2055
diff changeset
  2953
                        self.history.log_operation_end(
207f168361ba 10148 successful image operations with no effect should be elided from history
Shawn Walker <shawn.walker@oracle.com>
parents: 2055
diff changeset
  2954
                            result=history.RESULT_NOTHING_TO_DO)
996
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2955
                        return
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2956
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2957
                try:
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2958
                        # Ensure Image directory structure is valid.
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2959
                        self.mkdirs()
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2960
                except Exception, e:
996
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2961
                        self.history.log_operation_end(error=e)
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2962
                        raise
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2963
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2964
                progtrack.refresh_start(len(pubs_to_refresh))
996
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2965
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2966
                failed = []
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2967
                total = 0
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2968
                succeeded = set()
996
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2969
                updated = 0
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2970
                for pub in pubs_to_refresh:
201
63e78f600aa7 185 traceback on pkg refresh when hostname lookup fails
Danek Duvall <danek.duvall@sun.com>
parents: 195
diff changeset
  2971
                        total += 1
996
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2972
                        progtrack.refresh_progress(pub.prefix)
235
61994d15c39b 373 design a nice default output for install/update/remove
Dan Price <dp@eng.sun.com>
parents: 226
diff changeset
  2973
                        try:
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2974
                                if pub.refresh(full_refresh=full_refresh,
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2975
                                    immediate=immediate):
996
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2976
                                        updated += 1
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2977
                        except apx.PermissionsException, e:
1538
78ac66abc186 12130 install/update operations should always refresh publisher metadata (when allowed)
Shawn Walker <srw@sun.com>
parents: 1537
diff changeset
  2978
                                failed.append((pub, e))
78ac66abc186 12130 install/update operations should always refresh publisher metadata (when allowed)
Shawn Walker <srw@sun.com>
parents: 1537
diff changeset
  2979
                                # No point in continuing since no data can
78ac66abc186 12130 install/update operations should always refresh publisher metadata (when allowed)
Shawn Walker <srw@sun.com>
parents: 1537
diff changeset
  2980
                                # be written.
78ac66abc186 12130 install/update operations should always refresh publisher metadata (when allowed)
Shawn Walker <srw@sun.com>
parents: 1537
diff changeset
  2981
                                break
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2982
                        except apx.ApiException, e:
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2983
                                failed.append((pub, e))
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2984
                                continue
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2985
                        succeeded.add(pub.prefix)
996
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  2986
                progtrack.refresh_done()
625
e46b345645d6 3799 need to start progress tracker going early on
Brock Pytlik <bpytlik@sun.com>
parents: 621
diff changeset
  2987
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2988
                if updated:
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2989
                        self.__rebuild_image_catalogs(progtrack=progtrack)
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2990
201
63e78f600aa7 185 traceback on pkg refresh when hostname lookup fails
Danek Duvall <danek.duvall@sun.com>
parents: 195
diff changeset
  2991
                if failed:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  2992
                        e = apx.CatalogRefreshException(failed, total,
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2993
                            len(succeeded))
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  2994
                        self.history.log_operation_end(error=e)
1435
f65591874aef 12221 client traceback if refresh fails due to exception
Shawn Walker <srw@sun.com>
parents: 1431
diff changeset
  2995
                        raise e
2069
207f168361ba 10148 successful image operations with no effect should be elided from history
Shawn Walker <shawn.walker@oracle.com>
parents: 2055
diff changeset
  2996
207f168361ba 10148 successful image operations with no effect should be elided from history
Shawn Walker <shawn.walker@oracle.com>
parents: 2055
diff changeset
  2997
                if not updated:
207f168361ba 10148 successful image operations with no effect should be elided from history
Shawn Walker <shawn.walker@oracle.com>
parents: 2055
diff changeset
  2998
                        self.history.log_operation_end(
207f168361ba 10148 successful image operations with no effect should be elided from history
Shawn Walker <shawn.walker@oracle.com>
parents: 2055
diff changeset
  2999
                            result=history.RESULT_NOTHING_TO_DO)
207f168361ba 10148 successful image operations with no effect should be elided from history
Shawn Walker <shawn.walker@oracle.com>
parents: 2055
diff changeset
  3000
                        return
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3001
                self.history.log_operation_end()
116
9c9942a52984 (image flag day) remove pkg catalog, improve pkg status, localize pkg(1), use
Stephen Hahn <sch@Sun.COM>
parents: 111
diff changeset
  3002
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3003
        def _get_publisher_meta_dir(self):
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3004
                if self.version >= 3:
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3005
                        return IMG_PUB_DIR
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3006
                return "catalog"
996
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  3007
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3008
        def _get_publisher_cache_root(self, prefix):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3009
                return os.path.join(self.imgdir, "cache", "publisher", prefix)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3010
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3011
        def _get_publisher_meta_root(self, prefix):
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3012
                return os.path.join(self.imgdir, self._get_publisher_meta_dir(),
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3013
                    prefix)
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3014
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3015
        def remove_publisher_metadata(self, pub, progtrack=None, rebuild=True):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3016
                """Removes the metadata for the specified publisher object,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3017
                except data for installed packages.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3018
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3019
                'pub' is the object of the publisher to remove the data for.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3020
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3021
                'progtrack' is an optional ProgressTracker object.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3022
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3023
                'rebuild' is an optional boolean specifying whether image
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3024
                catalogs should be rebuilt after removing the publisher's
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3025
                metadata.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3026
                """
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3027
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3028
                if self.version < 4:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3029
                        # Older images don't require fine-grained deletion.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3030
                        pub.remove_meta_root()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3031
                        if rebuild:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3032
                                self.__rebuild_image_catalogs(
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3033
                                    progtrack=progtrack)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3034
                        return
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3035
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3036
                # Build a list of paths that shouldn't be removed because they
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3037
                # belong to installed packages.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3038
                excluded = [
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3039
                    self.get_manifest_path(f)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3040
                    for f in self.gen_installed_pkgs()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3041
                    if f.publisher == pub.prefix
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3042
                ]
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3043
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3044
                if not excluded:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3045
                        pub.remove_meta_root()
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3046
                else:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3047
                        try:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3048
                                # Discard all publisher metadata except
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3049
                                # package manifests as a first pass.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3050
                                for entry in os.listdir(pub.meta_root):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3051
                                        if entry == "pkg":
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3052
                                                continue
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3053
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3054
                                        target = os.path.join(pub.meta_root,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3055
                                            entry)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3056
                                        if os.path.isdir(target):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3057
                                                shutil.rmtree(target)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3058
                                        else:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3059
                                                portable.remove(target)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3060
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3061
                                # Build the list of directories that can't be
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3062
                                # removed.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3063
                                exdirs = [os.path.dirname(e) for e in excluded]
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3064
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3065
                                # Now try to discard only package manifests
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3066
                                # that aren't for installed packages.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3067
                                mroot = os.path.join(pub.meta_root, "pkg")
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3068
                                for pdir in os.listdir(mroot):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3069
                                        proot = os.path.join(mroot, pdir)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3070
                                        if proot not in exdirs:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3071
                                                # This removes all manifest data
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3072
                                                # for a given package stem.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3073
                                                shutil.rmtree(proot)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3074
                                                continue
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3075
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3076
                                        # Remove only manifest data for packages
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3077
                                        # that are not installed.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3078
                                        for mname in os.listdir(proot):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3079
                                                mpath = os.path.join(proot,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3080
                                                    mname)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3081
                                                if mpath not in excluded:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3082
                                                        portable.remove(mpath)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3083
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3084
                                # Finally, dump any cache data for this
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3085
                                # publisher if possible.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3086
                                shutil.rmtree(self._get_publisher_cache_root(
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3087
                                    pub.prefix), ignore_errors=True)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3088
                        except EnvironmentError, e:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3089
                                raise apx._convert_error(e)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3090
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3091
                if rebuild:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3092
                        self.__rebuild_image_catalogs(progtrack=progtrack)
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  3093
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3094
        def gen_installed_pkg_names(self, anarchy=True):
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3095
                """A generator function that produces FMRI strings as it
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3096
                iterates over the list of installed packages.  This is
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3097
                faster than gen_installed_pkgs when only the FMRI string
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3098
                is needed."""
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3099
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3100
                cat = self.get_catalog(self.IMG_CATALOG_INSTALLED)
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3101
                for f in cat.fmris(objects=False):
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3102
                        if anarchy:
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3103
                                # Catalog entries always have publisher prefix.
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3104
                                yield "pkg:/%s" % f[6:].split("/", 1)[-1]
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3105
                                continue
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3106
                        yield f
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3107
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3108
        def gen_installed_pkgs(self):
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3109
                """Return an iteration through the installed packages."""
1068
9400aa8afd32 2557 catalog cache pickle file dependent on fmri and version object definitions
Shawn Walker <srw@sun.com>
parents: 1045
diff changeset
  3110
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3111
                cat = self.get_catalog(self.IMG_CATALOG_INSTALLED)
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3112
                for f in cat.fmris():
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3113
                        yield f
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3114
2228
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3115
        def gen_tracked_stems(self):
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3116
                """Return an iteration through all the tracked pkg stems
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3117
                in the set of currently installed packages.  Return value
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3118
                is group pkg fmri, stem"""
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3119
                cat = self.get_catalog(self.IMG_CATALOG_INSTALLED)
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3120
                excludes = self.list_excludes()
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3121
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3122
                for f in cat.fmris():
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3123
                        for a in cat.get_entry_actions(f,
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3124
                            [pkg.catalog.Catalog.DEPENDENCY], excludes=excludes):
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3125
                                if a.name == "depend" and a.attrs["type"] == "group":
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3126
                                        yield (f, self.strtofmri(
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3127
                                            a.attrs["fmri"]).pkg_name)
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3128
2205
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3129
        def _create_fast_lookups(self):
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3130
                """Create an on-disk database mapping action name and key
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3131
                attribute value to the action string comprising the unique
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3132
                attributes of the action, for all installed actions.  This is
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3133
                done with a file mapping the tuple to an offset into a second
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3134
                file, where those actions are kept.  Once the offsets are loaded
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3135
                into memory, it is simple to seek into the second file to the
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3136
                given offset and read until you hit an action that doesn't
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3137
                match."""
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3138
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3139
                stripped_path = os.path.join(self.__action_cache_dir,
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3140
                    "actions.stripped")
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3141
                offsets_path = os.path.join(self.__action_cache_dir,
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3142
                    "actions.offsets")
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3143
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3144
                excludes = self.list_excludes()
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3145
                heap = []
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3146
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3147
                from heapq import heappush, heappop
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3148
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3149
                for pfmri in self.gen_installed_pkgs():
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3150
                        m = self.get_manifest(pfmri, all_variants=True)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3151
                        for act in m.gen_actions(excludes):
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3152
                                if not act.globally_identical:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3153
                                        continue
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3154
                                for key in act.attrs.keys():
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3155
                                        if (act.unique_attrs and
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3156
                                            key not in act.unique_attrs) or \
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3157
                                            key.startswith("variant.") or \
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3158
                                            key.startswith("facet."):
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3159
                                                del act.attrs[key]
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3160
                                heappush(heap, (act.name,
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3161
                                    act.attrs[act.key_attr], pfmri, act))
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3162
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3163
                # Don't worry if we can't write the temporary files.
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3164
                try:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3165
                        actdict = {}
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3166
                        sf, sp = self.temporary_file(close=False)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3167
                        of, op = self.temporary_file(close=False)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3168
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3169
                        sf = os.fdopen(sf, "wb")
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3170
                        of = os.fdopen(of, "wb")
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3171
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3172
                        # We need to make sure the files are coordinated.
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3173
                        t = int(time.time())
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3174
                        sf.write("VERSION 1\n%s\n" % t)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3175
                        of.write("VERSION 1\n%s\n" % t)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3176
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3177
                        last_name, last_key = None, None
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3178
                        while heap:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3179
                                item = heappop(heap)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3180
                                fmri, act = item[2:]
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3181
                                offset = sf.tell()
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3182
                                sf.write("%s %s\n" % (fmri, act))
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3183
                                key = act.attrs[act.key_attr]
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3184
                                if act.name != last_name or key != last_key:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3185
                                        of.write("%s %s %s\n" % (act.name, offset, key))
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3186
                                        actdict[(act.name, key)] = offset
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3187
                                        last_name, last_key = act.name, key
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3188
                        sf.close()
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3189
                        of.close()
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3190
                        os.chmod(sp, misc.PKG_FILE_MODE)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3191
                        os.chmod(op, misc.PKG_FILE_MODE)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3192
                except BaseException, e:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3193
                        try:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3194
                                os.unlink(sp)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3195
                                os.unlink(op)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3196
                        except:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3197
                                if isinstance(e, KeyboardInterrupt):
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3198
                                        raise
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3199
                                return actdict
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3200
                        if isinstance(e, KeyboardInterrupt):
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3201
                                raise
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3202
                        return
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3203
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3204
                # Finally, rename the temporary files into their final place.
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3205
                # If we have any problems, do our best to remove them, and we'll
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3206
                # try to recreate them on the read-side.
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3207
                try:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3208
                        portable.rename(sp, stripped_path)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3209
                        portable.rename(op, offsets_path)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3210
                        return actdict
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3211
                except EnvironmentError, e:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3212
                        if e.errno == errno.EACCES or e.errno == errno.EROFS:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3213
                                self.__action_cache_dir = self.temporary_dir()
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3214
                                stripped_path = os.path.join(
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3215
                                    self.__action_cache_dir, "actions.stripped")
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3216
                                offsets_path = os.path.join(
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3217
                                    self.__action_cache_dir, "actions.offsets")
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3218
                                portable.rename(sp, stripped_path)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3219
                                portable.rename(op, offsets_path)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3220
                                return actdict
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3221
                        try:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3222
                                os.unlink(stripped_path)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3223
                                os.unlink(offsets_path)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3224
                        except:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3225
                                pass
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3226
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3227
        def _load_actdict(self):
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3228
                """Read the file of offsets created in _create_fast_lookups()
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3229
                and return the dictionary mapping action name and key value to
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3230
                offset."""
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3231
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3232
                actdict = {}
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3233
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3234
                try:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3235
                        of = open(os.path.join(self.__action_cache_dir,
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3236
                            "actions.offsets"), "rb")
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3237
                except IOError, e:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3238
                        if e.errno != errno.ENOENT:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3239
                                raise
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3240
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3241
                        actdict = self._create_fast_lookups()
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3242
                        if actdict is not None:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3243
                                return actdict
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3244
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3245
                # Make sure the files are paired, and try to create them if not.
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3246
                oversion = of.readline().rstrip()
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3247
                otimestamp = of.readline().rstrip()
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3248
                sversion, stimestamp = self._get_stripped_actions_file(internal=True)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3249
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3250
                # If we recognize neither file's version or their timestamps
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3251
                # don't match, then we blow them away and try again.
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3252
                if oversion != "VERSION 1" or sversion != "VERSION 1" or \
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3253
                    stimestamp != otimestamp:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3254
                        of.close()
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3255
                        actdict = self._create_fast_lookups()
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3256
                        if actdict is not None:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3257
                                return actdict
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3258
                        of = file(os.path.join(self.__action_cache_dir,
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3259
                            "actions.offsets"), "rb")
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3260
                        oversion = of.readline().rstrip()
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3261
                        otimestamp = of.readline().rstrip()
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3262
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3263
                for line in of:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3264
                        actname, offset, key_attr = line.rstrip().split(None, 2)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3265
                        actdict[(actname, key_attr)] = int(offset)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3266
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3267
                of.close()
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3268
                return actdict
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3269
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3270
        def _get_stripped_actions_file(self, internal=False):
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3271
                """Open the actions file described in _create_fast_lookups() and
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3272
                return the corresponding file object."""
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3273
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3274
                sf = file(os.path.join(self.__action_cache_dir,
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3275
                    "actions.stripped"), "rb")
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3276
                sversion = sf.readline().rstrip()
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3277
                stimestamp = sf.readline().rstrip()
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3278
                if internal:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3279
                        sf.close()
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3280
                        return sversion, stimestamp
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3281
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3282
                return sf
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3283
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3284
        def gen_installed_actions_bytype(self, atype, implicit_dirs=False):
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3285
                """Iterates through the installed actions of type 'atype'.  If
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3286
                'implicit_dirs' is True and 'atype' is 'dir', then include
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3287
                directories only implicitly defined by other filesystem
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3288
                actions."""
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3289
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3290
                if implicit_dirs and atype != "dir":
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3291
                        implicit_dirs = False
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3292
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3293
                excludes = self.list_excludes()
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3294
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3295
                for pfmri in self.gen_installed_pkgs():
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3296
                        m = self.get_manifest(pfmri)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3297
                        dirs = set()
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3298
                        for act in m.gen_actions_by_type(atype, excludes):
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3299
                                if implicit_dirs:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3300
                                        dirs.add(act.attrs["path"])
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3301
                                yield act, pfmri
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3302
                        if implicit_dirs:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3303
                                da = pkg.actions.directory.DirectoryAction
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3304
                                for d in m.get_directories(excludes):
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3305
                                        if d not in dirs:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3306
                                                yield da(path=d, implicit="true"), pfmri
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3307
1537
00a5b4d54eb8 5872 List APIs required
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
  3308
        def get_installed_pubs(self):
00a5b4d54eb8 5872 List APIs required
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
  3309
                """Returns a set containing the prefixes of all publishers with
00a5b4d54eb8 5872 List APIs required
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
  3310
                installed packages."""
00a5b4d54eb8 5872 List APIs required
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
  3311
00a5b4d54eb8 5872 List APIs required
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
  3312
                cat = self.get_catalog(self.IMG_CATALOG_INSTALLED)
00a5b4d54eb8 5872 List APIs required
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
  3313
                return cat.publishers()
00a5b4d54eb8 5872 List APIs required
Shawn Walker <srw@sun.com>
parents: 1516
diff changeset
  3314
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 302
diff changeset
  3315
        def strtofmri(self, myfmri):
423
5c756997bf67 2253 With the latest build of the pkg repo, can't install packages from additional authorities
Danek Duvall <danek.duvall@sun.com>
parents: 419
diff changeset
  3316
                return pkg.fmri.PkgFmri(myfmri, self.attrs["Build-Release"])
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 302
diff changeset
  3317
526
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 518
diff changeset
  3318
        def strtomatchingfmri(self, myfmri):
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  3319
                return pkg.fmri.MatchingPkgFmri(myfmri,
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  3320
                    self.attrs["Build-Release"])
526
8c243883ae41 822 Depot traceback on "pkgsend -s <server> open foo"
Dan Price <dp@eng.sun.com>
parents: 518
diff changeset
  3321
289
c2e63370fb2b 160 Make IPS cross-platform for use across other supported OS's
Tom Mueller <Tom.Mueller@Sun.COM>
parents: 285
diff changeset
  3322
        def get_user_by_name(self, name):
2003
16461c9acfee 1637 user action should be more robust against missing ftpusers file (and others)
Danek Duvall <danek.duvall@oracle.com>
parents: 1977
diff changeset
  3323
                uid = self._usersbyname.get(name, None)
16461c9acfee 1637 user action should be more robust against missing ftpusers file (and others)
Danek Duvall <danek.duvall@oracle.com>
parents: 1977
diff changeset
  3324
                if uid is not None:
16461c9acfee 1637 user action should be more robust against missing ftpusers file (and others)
Danek Duvall <danek.duvall@oracle.com>
parents: 1977
diff changeset
  3325
                        return uid
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
  3326
                return portable.get_user_by_name(name, self.root,
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
  3327
                    self.type != IMG_USER)
173
da329417a206 18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents: 172
diff changeset
  3328
339
d8e57580599b 1271 pkg verify tracebacks on files owned by my uid...
Danek Duvall <danek.duvall@sun.com>
parents: 331
diff changeset
  3329
        def get_name_by_uid(self, uid, returnuid = False):
173
da329417a206 18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents: 172
diff changeset
  3330
                # XXX What to do about IMG_PARTIAL?
339
d8e57580599b 1271 pkg verify tracebacks on files owned by my uid...
Danek Duvall <danek.duvall@sun.com>
parents: 331
diff changeset
  3331
                try:
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
  3332
                        return portable.get_name_by_uid(uid, self.root,
339
d8e57580599b 1271 pkg verify tracebacks on files owned by my uid...
Danek Duvall <danek.duvall@sun.com>
parents: 331
diff changeset
  3333
                            self.type != IMG_USER)
d8e57580599b 1271 pkg verify tracebacks on files owned by my uid...
Danek Duvall <danek.duvall@sun.com>
parents: 331
diff changeset
  3334
                except KeyError:
d8e57580599b 1271 pkg verify tracebacks on files owned by my uid...
Danek Duvall <danek.duvall@sun.com>
parents: 331
diff changeset
  3335
                        if returnuid:
d8e57580599b 1271 pkg verify tracebacks on files owned by my uid...
Danek Duvall <danek.duvall@sun.com>
parents: 331
diff changeset
  3336
                                return uid
d8e57580599b 1271 pkg verify tracebacks on files owned by my uid...
Danek Duvall <danek.duvall@sun.com>
parents: 331
diff changeset
  3337
                        else:
d8e57580599b 1271 pkg verify tracebacks on files owned by my uid...
Danek Duvall <danek.duvall@sun.com>
parents: 331
diff changeset
  3338
                                raise
243
ca57127811b8 399 pkg list on explicit packages fails with no output, exit status of 1
Stephen Hahn <sch@Sun.COM>
parents: 239
diff changeset
  3339
289
c2e63370fb2b 160 Make IPS cross-platform for use across other supported OS's
Tom Mueller <Tom.Mueller@Sun.COM>
parents: 285
diff changeset
  3340
        def get_group_by_name(self, name):
2003
16461c9acfee 1637 user action should be more robust against missing ftpusers file (and others)
Danek Duvall <danek.duvall@oracle.com>
parents: 1977
diff changeset
  3341
                gid = self._groupsbyname.get(name, None)
16461c9acfee 1637 user action should be more robust against missing ftpusers file (and others)
Danek Duvall <danek.duvall@oracle.com>
parents: 1977
diff changeset
  3342
                if gid is not None:
16461c9acfee 1637 user action should be more robust against missing ftpusers file (and others)
Danek Duvall <danek.duvall@oracle.com>
parents: 1977
diff changeset
  3343
                        return gid
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
  3344
                return portable.get_group_by_name(name, self.root,
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
  3345
                    self.type != IMG_USER)
173
da329417a206 18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents: 172
diff changeset
  3346
339
d8e57580599b 1271 pkg verify tracebacks on files owned by my uid...
Danek Duvall <danek.duvall@sun.com>
parents: 331
diff changeset
  3347
        def get_name_by_gid(self, gid, returngid = False):
d8e57580599b 1271 pkg verify tracebacks on files owned by my uid...
Danek Duvall <danek.duvall@sun.com>
parents: 331
diff changeset
  3348
                try:
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
  3349
                        return portable.get_name_by_gid(gid, self.root,
339
d8e57580599b 1271 pkg verify tracebacks on files owned by my uid...
Danek Duvall <danek.duvall@sun.com>
parents: 331
diff changeset
  3350
                            self.type != IMG_USER)
d8e57580599b 1271 pkg verify tracebacks on files owned by my uid...
Danek Duvall <danek.duvall@sun.com>
parents: 331
diff changeset
  3351
                except KeyError:
d8e57580599b 1271 pkg verify tracebacks on files owned by my uid...
Danek Duvall <danek.duvall@sun.com>
parents: 331
diff changeset
  3352
                        if returngid:
d8e57580599b 1271 pkg verify tracebacks on files owned by my uid...
Danek Duvall <danek.duvall@sun.com>
parents: 331
diff changeset
  3353
                                return gid
d8e57580599b 1271 pkg verify tracebacks on files owned by my uid...
Danek Duvall <danek.duvall@sun.com>
parents: 331
diff changeset
  3354
                        else:
d8e57580599b 1271 pkg verify tracebacks on files owned by my uid...
Danek Duvall <danek.duvall@sun.com>
parents: 331
diff changeset
  3355
                                raise
173
da329417a206 18 Actions should use passwd and group databases from image, if possible
Danek Duvall <danek.duvall@sun.com>
parents: 172
diff changeset
  3356
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
  3357
        def update_index_dir(self, postfix="index"):
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
  3358
                """Since the index directory will not reliably be updated when
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
  3359
                the image root is, this should be called prior to using the
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
  3360
                index directory.
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
  3361
                """
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3362
                if self.version == self.CURRENT_VERSION:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3363
                        self.index_dir = os.path.join(self.imgdir, "cache",
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3364
                            postfix)
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3365
                else:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3366
                        self.index_dir = os.path.join(self.imgdir, postfix)
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 423
diff changeset
  3367
251
6c3d70b74865 470 pkg image-update can fail under some conditions
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 243
diff changeset
  3368
        def cleanup_downloads(self):
388
5a08791fb814 2188 Client must fail gracefully when network timeout occurs
johansen <johansen@sun.com>
parents: 384
diff changeset
  3369
                """Clean up any downloads that were in progress but that
5a08791fb814 2188 Client must fail gracefully when network timeout occurs
johansen <johansen@sun.com>
parents: 384
diff changeset
  3370
                did not successfully finish."""
5a08791fb814 2188 Client must fail gracefully when network timeout occurs
johansen <johansen@sun.com>
parents: 384
diff changeset
  3371
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  3372
                shutil.rmtree(self._incoming_cache_dir, True)
388
5a08791fb814 2188 Client must fail gracefully when network timeout occurs
johansen <johansen@sun.com>
parents: 384
diff changeset
  3373
5a08791fb814 2188 Client must fail gracefully when network timeout occurs
johansen <johansen@sun.com>
parents: 384
diff changeset
  3374
        def cleanup_cached_content(self):
5a08791fb814 2188 Client must fail gracefully when network timeout occurs
johansen <johansen@sun.com>
parents: 384
diff changeset
  3375
                """Delete the directory that stores all of our cached
5a08791fb814 2188 Client must fail gracefully when network timeout occurs
johansen <johansen@sun.com>
parents: 384
diff changeset
  3376
                downloaded content.  This may take a while for a large
554
fe196874250d 3508 zone install should utilize/populate global zone d/l cache
Dan Price <dp@eng.sun.com>
parents: 552
diff changeset
  3377
                directory hierarchy.  Don't clean up caches if the
2148
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
  3378
                user overrode the underlying setting using PKG_CACHEDIR or
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
  3379
                PKG_CACHEROOT. """
388
5a08791fb814 2188 Client must fail gracefully when network timeout occurs
johansen <johansen@sun.com>
parents: 384
diff changeset
  3380
2097
068cc63b4d6e 17055 image configuration should use pkg.config classes
Shawn Walker <shawn.walker@oracle.com>
parents: 2092
diff changeset
  3381
                if self.cfg.get_policy(imageconfig.FLUSH_CONTENT_CACHE):
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1402
diff changeset
  3382
                        logger.info("Deleting content cache")
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  3383
                        for path, readonly, pub in self.get_cachedirs():
2148
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
  3384
                                if readonly or (self.__user_cache_dir and
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
  3385
                                    path.startswith(self.__user_cache_dir)):
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
  3386
                                        continue
5625d3707d5b 17424 zone cache usage needs adjustment for new image format
Shawn Walker <shawn.walker@oracle.com>
parents: 2144
diff changeset
  3387
                                shutil.rmtree(path, True)
289
c2e63370fb2b 160 Make IPS cross-platform for use across other supported OS's
Tom Mueller <Tom.Mueller@Sun.COM>
parents: 285
diff changeset
  3388
2293
631000734928 3679 modified preserve=true files should be backed up during uninstall
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
  3389
        def salvage(self, path):
631000734928 3679 modified preserve=true files should be backed up during uninstall
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
  3390
                """Called when unexpected file or directory is found during
631000734928 3679 modified preserve=true files should be backed up during uninstall
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
  3391
                package operations; returns a tuple of the path of the salvage
631000734928 3679 modified preserve=true files should be backed up during uninstall
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
  3392
                directory where the item was stored and the new path of the
631000734928 3679 modified preserve=true files should be backed up during uninstall
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
  3393
                salvaged item.  path is rooted in /...."""
631000734928 3679 modified preserve=true files should be backed up during uninstall
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
  3394
1859
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
  3395
                # This ensures that if the path is already rooted in the image,
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
  3396
                # that it will be stored in lost+found (due to os.path.join
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
  3397
                # behaviour with absolute path components).
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
  3398
                if path.startswith(self.root):
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
  3399
                        path = path.replace(self.root, "", 1)
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
  3400
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
  3401
                if os.path.isabs(path):
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
  3402
                        # If for some reason the path wasn't rooted in the
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
  3403
                        # image, but it is an absolute one, then strip the
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
  3404
                        # absolute part so that it will be stored in lost+found
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
  3405
                        # (due to os.path.join behaviour with absolute path
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
  3406
                        # components).
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
  3407
                        path = os.path.splitdrive(path)[-1].lstrip(os.path.sep)
6e6e866921e7 529 client can traceback with EBUSY during action removal
Shawn Walker <shawn.walker@oracle.com>
parents: 1842
diff changeset
  3408
1402
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  3409
                sdir = os.path.normpath(
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  3410
                    os.path.join(self.imgdir, "lost+found",
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  3411
                    path + "-" + time.strftime("%Y%m%dT%H%M%SZ")))
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  3412
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  3413
                parent = os.path.dirname(sdir)
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  3414
                if not os.path.exists(parent):
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3415
                        misc.makedirs(parent)
2293
631000734928 3679 modified preserve=true files should be backed up during uninstall
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
  3416
631000734928 3679 modified preserve=true files should be backed up during uninstall
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
  3417
                orig = os.path.normpath(os.path.join(self.root, path))
631000734928 3679 modified preserve=true files should be backed up during uninstall
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
  3418
                shutil.move(orig, sdir)
631000734928 3679 modified preserve=true files should be backed up during uninstall
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
  3419
                return sdir, os.path.join(sdir, sdir)
1402
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  3420
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  3421
        def temporary_dir(self):
2205
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3422
                """Create a temp directory under the image directory for various
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3423
                purposes.  If the process is unable to create a directory in the
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3424
                image's temporary directory, a replacement location is found."""
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3425
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3426
                try:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3427
                        misc.makedirs(self.__tmpdir)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3428
                except (apx.PermissionsException,
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3429
                    apx.ReadOnlyFileSystemException):
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3430
                        self.__tmpdir = tempfile.mkdtemp(prefix="pkg5tmp-")
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3431
                        atexit.register(shutil.rmtree,
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3432
                            self.__tmpdir, ignore_errors=True)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3433
                        return self.temporary_dir()
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3434
1402
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  3435
                try:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  3436
                        rval = tempfile.mkdtemp(dir=self.__tmpdir)
1463
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  3437
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  3438
                        # Force standard mode.
1507
b956ea23d3a6 11735 pkg history data files should not be executable
Richard Lowe <richlowe@richlowe.net>
parents: 1505
diff changeset
  3439
                        os.chmod(rval, misc.PKG_DIR_MODE)
1463
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  3440
                        return rval
1402
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  3441
                except EnvironmentError, e:
2205
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3442
                        if e.errno == errno.EACCES or e.errno == errno.EROFS:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3443
                                self.__tmpdir = tempfile.mkdtemp(prefix="pkg5tmp-")
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3444
                                atexit.register(shutil.rmtree,
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3445
                                    self.__tmpdir, ignore_errors=True)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3446
                                return self.temporary_dir()
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  3447
                        raise apx._convert_error(e)
251
6c3d70b74865 470 pkg image-update can fail under some conditions
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 243
diff changeset
  3448
2205
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3449
        def temporary_file(self, close=True):
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3450
                """Create a temporary file under the image directory for various
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3451
                purposes.  If 'close' is True, close the file descriptor;
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3452
                otherwise leave it open.  If the process is unable to create a
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3453
                file in the image's temporary directory, a replacement is
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3454
                found."""
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3455
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3456
                try:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3457
                        misc.makedirs(self.__tmpdir)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3458
                except (apx.PermissionsException,
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3459
                    apx.ReadOnlyFileSystemException):
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3460
                        self.__tmpdir = tempfile.mkdtemp(prefix="pkg5tmp-")
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3461
                        atexit.register(shutil.rmtree,
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3462
                            self.__tmpdir, ignore_errors=True)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3463
                        return self.temporary_file(close=close)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3464
1402
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  3465
                try:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  3466
                        fd, name = tempfile.mkstemp(dir=self.__tmpdir)
2205
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3467
                        if close:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3468
                                os.close(fd)
1402
c0fb578f911a 11384 cascading failure hides exception during image creation
Shawn Walker <srw@sun.com>
parents: 1370
diff changeset
  3469
                except EnvironmentError, e:
2205
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3470
                        if e.errno == errno.EACCES or e.errno == errno.EROFS:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3471
                                self.__tmpdir = tempfile.mkdtemp(prefix="pkg5tmp-")
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3472
                                atexit.register(shutil.rmtree,
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3473
                                    self.__tmpdir, ignore_errors=True)
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3474
                                return self.temporary_file(close=close)
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  3475
                        raise apx._convert_error(e)
2205
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3476
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3477
                if close:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3478
                        return name
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3479
                else:
53d0be594162 3822 image plans should prevent conflicting actions from being installed
Danek Duvall <danek.duvall@oracle.com>
parents: 2200
diff changeset
  3480
                        return fd, name
462
910600c14093 45 "move" action for files that are renamed, but must be preserved
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 461
diff changeset
  3481
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3482
        def __filter_install_matches(self, matches):
988
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3483
                """Attempts to eliminate redundant matches found during
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3484
                packaging operations:
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3485
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3486
                    * First, stems of installed packages for publishers that
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3487
                      are now unknown (no longer present in the image
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3488
                      configuration) are dropped.
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3489
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3490
                    * Second, if multiple matches are still present, stems of
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3491
                      of installed packages, that are not presently in the
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3492
                      corresponding publisher's catalog, are dropped.
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3493
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3494
                    * Finally, if multiple matches are still present, all
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3495
                      stems except for those in state PKG_STATE_INSTALLED are
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3496
                      dropped.
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3497
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3498
                Returns a list of the filtered matches, along with a dict of
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3499
                their unique names."""
988
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3500
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3501
                olist = []
1461
fdf40c8c6765 820 Need a way to obsolete packages
Danek Duvall <danek.duvall@sun.com>
parents: 1449
diff changeset
  3502
                onames = set()
fdf40c8c6765 820 Need a way to obsolete packages
Danek Duvall <danek.duvall@sun.com>
parents: 1449
diff changeset
  3503
988
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3504
                # First eliminate any duplicate matches that are for unknown
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3505
                # publishers (publishers which have been removed from the image
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3506
                # configuration).
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3507
                publist = set(p.prefix for p in self.get_publishers().values())
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3508
                for m, st in matches:
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3509
                        if m.publisher in publist:
1461
fdf40c8c6765 820 Need a way to obsolete packages
Danek Duvall <danek.duvall@sun.com>
parents: 1449
diff changeset
  3510
                                onames.add(m.get_pkg_stem())
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3511
                                olist.append((m, st))
988
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3512
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3513
                # Next, if there are still multiple matches, eliminate matches
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3514
                # belonging to publishers that no longer have the FMRI in their
988
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3515
                # catalog.
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3516
                found_state = False
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3517
                if len(onames) > 1:
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3518
                        mlist = []
1461
fdf40c8c6765 820 Need a way to obsolete packages
Danek Duvall <danek.duvall@sun.com>
parents: 1449
diff changeset
  3519
                        mnames = set()
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3520
                        for m, st in olist:
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3521
                                if not st["in_catalog"]:
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3522
                                        continue
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3523
                                if st["state"] == self.PKG_STATE_INSTALLED:
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3524
                                        found_state = True
1461
fdf40c8c6765 820 Need a way to obsolete packages
Danek Duvall <danek.duvall@sun.com>
parents: 1449
diff changeset
  3525
                                mnames.add(m.get_pkg_stem())
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3526
                                mlist.append((m, st))
988
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3527
                        olist = mlist
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3528
                        onames = mnames
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3529
1461
fdf40c8c6765 820 Need a way to obsolete packages
Danek Duvall <danek.duvall@sun.com>
parents: 1449
diff changeset
  3530
                # Finally, if there are still multiple matches, and a known
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3531
                # stem is installed, then eliminate any stems that do not
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3532
                # have an installed version.
988
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3533
                if found_state and len(onames) > 1:
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3534
                        mlist = []
1461
fdf40c8c6765 820 Need a way to obsolete packages
Danek Duvall <danek.duvall@sun.com>
parents: 1449
diff changeset
  3535
                        mnames = set()
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3536
                        for m, st in olist:
1463
0ef25025d601 12340 catalog storage performance regression
Shawn Walker <srw@sun.com>
parents: 1461
diff changeset
  3537
                                if st["state"] == self.PKG_STATE_INSTALLED:
1461
fdf40c8c6765 820 Need a way to obsolete packages
Danek Duvall <danek.duvall@sun.com>
parents: 1449
diff changeset
  3538
                                        mnames.add(m.get_pkg_stem())
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3539
                                        mlist.append((m, st))
988
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3540
                        olist = mlist
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3541
                        onames = mnames
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3542
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3543
                return olist, onames
a851ba83a5aa 6654 pkg list state incorrect after publisher removal when another publisher has it
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 964
diff changeset
  3544
2228
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3545
        def avoid_pkgs(self, pat_list, progtrack, check_cancelation):
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3546
                """Avoid the specified packages... use pattern matching on
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3547
                names; ignore versions."""
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3548
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3549
                with self.locked_op("avoid"):
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3550
                        ip = imageplan.ImagePlan(self, progtrack, check_cancelation,
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3551
                            noexecute=False)
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3552
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3553
                        self._avoid_set_save(self.avoid_set_get() |
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3554
                            set(ip.match_user_stems(pat_list, ip.MATCH_UNINSTALLED)))
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3555
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3556
        def unavoid_pkgs(self, pat_list, progtrack, check_cancelation):
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3557
                """Unavoid the specified packages... use pattern matching on
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3558
                names; ignore versions."""
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3559
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3560
                with self.locked_op("unavoid"):
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3561
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3562
                        ip = imageplan.ImagePlan(self, progtrack, check_cancelation,
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3563
                            noexecute=False)
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3564
                        unavoid_set = set(ip.match_user_stems(pat_list, ip.MATCH_ALL))
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3565
                        current_set = self.avoid_set_get()
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3566
                        not_avoided = unavoid_set - current_set
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3567
                        if not_avoided:
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3568
                                raise apx.PlanCreationException(not_avoided=not_avoided)
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3569
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3570
                        would_install = [
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3571
                            a
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3572
                            for f, a in self.gen_tracked_stems()
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3573
                            if a in unavoid_set
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3574
                        ]
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3575
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3576
                        if would_install:
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3577
                                raise apx.PlanCreationException(would_install=would_install)
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3578
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3579
                        self._avoid_set_save(current_set - unavoid_set)
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3580
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3581
        def get_avoid_dict(self):
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3582
                """ return dict of lists (avoided stem, pkgs w/ group
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3583
                dependencies on this pkg)"""
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3584
                ret = dict((a, list()) for a in self.avoid_set_get())
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3585
                for fmri, group in self.gen_tracked_stems():
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3586
                        if group in ret:
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3587
                                ret[group].append(fmri.pkg_name)
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3588
                return ret
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3589
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3590
2089
c8b9d6341530 2775 pkg should provide a way to downgrade (reinstall) packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2074
diff changeset
  3591
        def __make_plan_common(self, plan_name, progtrack, check_cancelation,
c8b9d6341530 2775 pkg should provide a way to downgrade (reinstall) packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2074
diff changeset
  3592
            noexecute, *args):
c8b9d6341530 2775 pkg should provide a way to downgrade (reinstall) packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2074
diff changeset
  3593
                """Private helper function to perform base plan creation and
c8b9d6341530 2775 pkg should provide a way to downgrade (reinstall) packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2074
diff changeset
  3594
                cleanup.
1158
78582c4403a9 8616 operations should use same publisher when only non-preferred has package
Shawn Walker <srw@sun.com>
parents: 1143
diff changeset
  3595
                """
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  3596
1837
03aa2b10f29d 15169 image-update plans twice and keeps both
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  3597
                # Allow garbage collection of previous plan.
03aa2b10f29d 15169 image-update plans twice and keeps both
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  3598
                self.imageplan = None
03aa2b10f29d 15169 image-update plans twice and keeps both
Shawn Walker <shawn.walker@oracle.com>
parents: 1832
diff changeset
  3599
625
e46b345645d6 3799 need to start progress tracker going early on
Brock Pytlik <bpytlik@sun.com>
parents: 621
diff changeset
  3600
                ip = imageplan.ImagePlan(self, progtrack, check_cancelation,
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  3601
                    noexecute=noexecute)
172
e3b310617b04 6 pkg image-update subcommand
Stephen Hahn <sch@Sun.COM>
parents: 163
diff changeset
  3602
625
e46b345645d6 3799 need to start progress tracker going early on
Brock Pytlik <bpytlik@sun.com>
parents: 621
diff changeset
  3603
                progtrack.evaluate_start()
307
3a857fd8b787 787 optional dependencies are required
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 302
diff changeset
  3604
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  3605
                # Always start with most current (on-disk) state information.
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  3606
                self.__init_catalogs()
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  3607
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  3608
                try:
2219
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  3609
                        try:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  3610
                                pfunc = getattr(ip, "plan_%s" % plan_name)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  3611
                                pfunc(*args)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  3612
                        except apx.ActionExecutionError, e:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  3613
                                raise
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  3614
                        except pkg.actions.ActionError, e:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  3615
                                raise apx.InvalidPackageErrors([e])
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  3616
                        except apx.ApiException:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  3617
                                raise
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  3618
                        try:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  3619
                                self.__call_imageplan_evaluate(ip)
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  3620
                        except apx.ActionExecutionError, e:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  3621
                                raise
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  3622
                        except pkg.actions.ActionError, e:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  3623
                                raise apx.InvalidPackageErrors([e])
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  3624
                finally:
60ad60f7592c 2152 standalone package support needed (on-disk format)
Shawn Walker <shawn.walker@oracle.com>
parents: 2205
diff changeset
  3625
                        self.__cleanup_alt_pkg_certs()
45
8a3f00dea14f catalog refresh; basic catalog listing; precise manifest pulls
Stephen Hahn <sch@sun.com>
parents: 39
diff changeset
  3626
2089
c8b9d6341530 2775 pkg should provide a way to downgrade (reinstall) packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2074
diff changeset
  3627
        def make_install_plan(self, pkg_list, progtrack, check_cancelation,
2183
21ae45e8dfcf 17581 There should be a way of removing a package as part of upgrade
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2178
diff changeset
  3628
            noexecute, reject_list=EmptyI):
2089
c8b9d6341530 2775 pkg should provide a way to downgrade (reinstall) packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2074
diff changeset
  3629
                """Take a list of packages, specified in pkg_list, and attempt
c8b9d6341530 2775 pkg should provide a way to downgrade (reinstall) packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2074
diff changeset
  3630
                to assemble an appropriate image plan.  This is a helper
c8b9d6341530 2775 pkg should provide a way to downgrade (reinstall) packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2074
diff changeset
  3631
                routine for some common operations in the client.
c8b9d6341530 2775 pkg should provide a way to downgrade (reinstall) packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2074
diff changeset
  3632
                """
c8b9d6341530 2775 pkg should provide a way to downgrade (reinstall) packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2074
diff changeset
  3633
c8b9d6341530 2775 pkg should provide a way to downgrade (reinstall) packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2074
diff changeset
  3634
                self.__make_plan_common("install", progtrack, check_cancelation,
2183
21ae45e8dfcf 17581 There should be a way of removing a package as part of upgrade
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2178
diff changeset
  3635
                    noexecute, pkg_list, reject_list)
565
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3636
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  3637
        def make_uninstall_plan(self, fmri_list, recursive_removal,
2034
d5ee7746faeb 16108 boot environments should be created by default only when needed
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2028
diff changeset
  3638
            progtrack, check_cancelation, noexecute):
1505
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  3639
                """Create uninstall plan to remove the specified packages;
cc598d70bbbe 4425 pkg install should deal w/ complex dependency changes in one install
Bart Smaalders <Bart.Smaalders@Sun.COM>
parents: 1504
diff changeset
  3640
                do so recursively iff recursive_removal is set"""
565
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3641
2089
c8b9d6341530 2775 pkg should provide a way to downgrade (reinstall) packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2074
diff changeset
  3642
                self.__make_plan_common("uninstall", progtrack,
c8b9d6341530 2775 pkg should provide a way to downgrade (reinstall) packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2074
diff changeset
  3643
                    check_cancelation, noexecute, fmri_list,
c8b9d6341530 2775 pkg should provide a way to downgrade (reinstall) packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2074
diff changeset
  3644
                    recursive_removal)
c8b9d6341530 2775 pkg should provide a way to downgrade (reinstall) packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2074
diff changeset
  3645
c8b9d6341530 2775 pkg should provide a way to downgrade (reinstall) packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2074
diff changeset
  3646
        def make_update_plan(self, progtrack, check_cancelation, noexecute,
2183
21ae45e8dfcf 17581 There should be a way of removing a package as part of upgrade
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2178
diff changeset
  3647
            pkg_list=None, reject_list=EmptyI):
2089
c8b9d6341530 2775 pkg should provide a way to downgrade (reinstall) packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2074
diff changeset
  3648
                """Create a plan to update all packages or the specific ones as
c8b9d6341530 2775 pkg should provide a way to downgrade (reinstall) packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2074
diff changeset
  3649
                far as possible.  This is a helper routine for some common
c8b9d6341530 2775 pkg should provide a way to downgrade (reinstall) packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2074
diff changeset
  3650
                operations in the client.
c8b9d6341530 2775 pkg should provide a way to downgrade (reinstall) packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2074
diff changeset
  3651
                """
c8b9d6341530 2775 pkg should provide a way to downgrade (reinstall) packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2074
diff changeset
  3652
c8b9d6341530 2775 pkg should provide a way to downgrade (reinstall) packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2074
diff changeset
  3653
                self.__make_plan_common("update", progtrack,
2183
21ae45e8dfcf 17581 There should be a way of removing a package as part of upgrade
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2178
diff changeset
  3654
                    check_cancelation, noexecute, pkg_list, reject_list)
565
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3655
2200
155eda704b2f 16279 Need a way to revert certain editable files to a as-installed state
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2183
diff changeset
  3656
        def make_revert_plan(self, args, tagged, progtrack, check_cancelation,
155eda704b2f 16279 Need a way to revert certain editable files to a as-installed state
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2183
diff changeset
  3657
            noexecute):
155eda704b2f 16279 Need a way to revert certain editable files to a as-installed state
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2183
diff changeset
  3658
                """Revert the specified files, or all files tagged as specified
155eda704b2f 16279 Need a way to revert certain editable files to a as-installed state
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2183
diff changeset
  3659
                in args to their manifest definitions.
155eda704b2f 16279 Need a way to revert certain editable files to a as-installed state
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2183
diff changeset
  3660
                """
155eda704b2f 16279 Need a way to revert certain editable files to a as-installed state
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2183
diff changeset
  3661
155eda704b2f 16279 Need a way to revert certain editable files to a as-installed state
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2183
diff changeset
  3662
                self.__make_plan_common("revert", progtrack, check_cancelation,
155eda704b2f 16279 Need a way to revert certain editable files to a as-installed state
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2183
diff changeset
  3663
                    noexecute, args, tagged)
155eda704b2f 16279 Need a way to revert certain editable files to a as-installed state
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2183
diff changeset
  3664
2092
0ef66bf272d3 16852 pkg should look at its image for certs if active image lacks certs
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2089
diff changeset
  3665
        def ipkg_is_up_to_date(self, check_cancelation, noexecute,
996
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  3666
            refresh_allowed=True, progtrack=None):
1829
e581a205ec02 14907 references to old-style package names must be purged
Danek Duvall <danek.duvall@sun.com>
parents: 1801
diff changeset
  3667
                """Test whether the packaging system is updated to the latest
e581a205ec02 14907 references to old-style package names must be purged
Danek Duvall <danek.duvall@sun.com>
parents: 1801
diff changeset
  3668
                version known to be available for this image."""
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1328
diff changeset
  3669
565
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3670
                #
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3671
                # This routine makes the distinction between the "target image",
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3672
                # which will be altered, and the "running image", which is
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  3673
                # to say whatever image appears to contain the version of the
565
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3674
                # pkg command we're running.
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3675
                #
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3676
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3677
                #
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3678
                # There are two relevant cases here:
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3679
                #     1) Packaging code and image we're updating are the same
2089
c8b9d6341530 2775 pkg should provide a way to downgrade (reinstall) packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2074
diff changeset
  3680
                #        image.  (i.e. 'pkg update')
565
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3681
                #
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3682
                #     2) Packaging code's image and the image we're updating are
2089
c8b9d6341530 2775 pkg should provide a way to downgrade (reinstall) packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2074
diff changeset
  3683
                #        different (i.e. 'pkg update -R')
565
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3684
                #
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3685
                # In general, we care about getting the user to run the
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3686
                # most recent packaging code available for their build.  So,
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3687
                # if we're not in the liveroot case, we create a new image
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3688
                # which represents "/" on the system.
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3689
                #
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3690
625
e46b345645d6 3799 need to start progress tracker going early on
Brock Pytlik <bpytlik@sun.com>
parents: 621
diff changeset
  3691
                if not progtrack:
e46b345645d6 3799 need to start progress tracker going early on
Brock Pytlik <bpytlik@sun.com>
parents: 621
diff changeset
  3692
                        progtrack = progress.QuietProgressTracker()
565
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3693
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3694
                img = self
926
6ee411c9026a 5871 publisher apis desired
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 922
diff changeset
  3695
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3696
                if self.__cmddir and not img.is_liveroot():
565
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3697
                        #
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3698
                        # Find the path to ourselves, and use that
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3699
                        # as a way to locate the image we're in.  It's
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3700
                        # not perfect-- we could be in a developer's
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3701
                        # workspace, for example.
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3702
                        #
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3703
                        newimg = Image(self.__cmddir,
2158
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
  3704
                            allow_ondisk_upgrade=False, allow_ambiguous=True,
5a688b5b92a3 15864 inferring image location from current working directory can be harmful
Shawn Walker <shawn.walker@oracle.com>
parents: 2154
diff changeset
  3705
                            progtrack=progtrack)
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3706
                        useimg = True
996
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  3707
                        if refresh_allowed:
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  3708
                                # If refreshing publisher metadata is allowed,
1829
e581a205ec02 14907 references to old-style package names must be purged
Danek Duvall <danek.duvall@sun.com>
parents: 1801
diff changeset
  3709
                                # then perform a refresh so that a new packaging
e581a205ec02 14907 references to old-style package names must be purged
Danek Duvall <danek.duvall@sun.com>
parents: 1801
diff changeset
  3710
                                # system package can be discovered.
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3711
                                newimg.lock(allow_unprivileged=True)
565
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3712
                                try:
996
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  3713
                                        newimg.refresh_publishers(
31d152a5212b 7582 pkg set-publisher --no-refresh will delete catalogs
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 993
diff changeset
  3714
                                            progtrack=progtrack)
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3715
                                except (apx.ImageFormatUpdateNeeded,
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3716
                                    apx.PermissionsException):
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3717
                                        # Can't use the image to perform an
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3718
                                        # update check and it would be wrong
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3719
                                        # to prevent the operation from
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3720
                                        # continuing in these cases.
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3721
                                        useimg = False
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2069
diff changeset
  3722
                                except apx.CatalogRefreshException, cre:
1603
84bd53597209 13019 DeprecationWarnings seen after python 2.6 migration
Dan Price <dp@eng.sun.com>
parents: 1586
diff changeset
  3723
                                        cre.errmessage = \
1829
e581a205ec02 14907 references to old-style package names must be purged
Danek Duvall <danek.duvall@sun.com>
parents: 1801
diff changeset
  3724
                                            _("pkg(5) update check failed.")
565
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3725
                                        raise
1710
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  3726
                                finally:
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  3727
                                        newimg.unlock()
139720e2e756 1668 image locking needed to prevent race conditions
Shawn Walker <srw@sun.com>
parents: 1688
diff changeset
  3728
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3729
                        if useimg:
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3730
                                img = newimg
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3731
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3732
                # XXX call to progress tracker that the package is being
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3733
                # refreshed
1829
e581a205ec02 14907 references to old-style package names must be purged
Danek Duvall <danek.duvall@sun.com>
parents: 1801
diff changeset
  3734
                img.make_install_plan(["pkg:/package/pkg"], progtrack,
2144
2ac203b826ab 7276 /var/pkg metadata needs reorg (looks busy)
Shawn Walker <shawn.walker@oracle.com>
parents: 2141
diff changeset
  3735
                    check_cancelation, True)
565
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3736
1fb4f05220b9 3443 An api needs to be provided for safe interaction of front-ends
Brock Pytlik <bpytlik@sun.com>
parents: 562
diff changeset
  3737
                return img.imageplan.nothingtodo()
2228
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3738
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3739
        # avoid set implementation uses simplejson to store a
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3740
        # set of pkg_stems being avoided, and a set of tracked
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3741
        # stems that are obsolete.
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3742
        #
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3743
        # format is (version, dict((pkg stem, "avoid" or "obsolete"))
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3744
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3745
        __AVOID_SET_VERSION = 1
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3746
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3747
        def avoid_set_get(self):
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3748
                """Return copy of avoid set"""
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3749
                return self.__avoid_set.copy()
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3750
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3751
        def obsolete_set_get(self):
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3752
                """Return copy of tracked obsolete pkgs"""
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3753
                return self.__group_obsolete.copy()
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3754
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3755
        def __avoid_set_load(self):
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3756
                """Load avoid set fron image state directory"""
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3757
                state_file = os.path.join(self._statedir, "avoid_set")
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3758
                self.__avoid_set = set()
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3759
                self.__group_obsolete = set()
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3760
                if os.path.isfile(state_file):
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3761
                        version, d = json.load(file(state_file))
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3762
                        assert version == self.__AVOID_SET_VERSION
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3763
                        for stem in d:
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3764
                                if d[stem] == "avoid":
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3765
                                        self.__avoid_set.add(stem)
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3766
                                elif d[stem] == "obsolete":
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3767
                                        self.__group_obsolete.add(stem)
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3768
                                else:
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3769
                                        logger.warn("Corrupted avoid list - ignoring")
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3770
                                        self.__avoid_set = set()
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3771
                                        self.__group_obsolete = set()
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3772
                                        self.__avoid_set_altered = True
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3773
                else:
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3774
                        self.__avoid_set_altered = True
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3775
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3776
        def _avoid_set_save(self, new_set=None, obsolete=None):
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3777
                """Store avoid set to image state directory"""
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3778
                if new_set is not None:
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3779
                        self.__avoid_set_altered = True
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3780
                        self.__avoid_set = new_set
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3781
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3782
                if obsolete is not None:
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3783
                        self.__group_obsolete = obsolete
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3784
                        self.__avoid_set_altered = True
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3785
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3786
                if not self.__avoid_set_altered:
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3787
                        return
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3788
                
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3789
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3790
                state_file = os.path.join(self._statedir, "avoid_set")
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3791
                tmp_file   = os.path.join(self._statedir, "avoid_set.new")
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3792
                tf = file(tmp_file, "w")
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3793
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3794
                d = dict((a, "avoid") for a in self.__avoid_set)
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3795
                d.update((a, "obsolete") for a in self.__group_obsolete)
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3796
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3797
                try:
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3798
                        json.dump((self.__AVOID_SET_VERSION, d), tf)
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3799
                        tf.close()
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3800
                        portable.rename(tmp_file, state_file)
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3801
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3802
                except Exception, e:
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3803
                        logger.warn("Cannot save avoid list: %s" % str(e))
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3804
                        return
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3805
5319ee47781d 2774 new depend action behavior: follow if possible
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2219
diff changeset
  3806
                self.__avoid_set_altered = False