src/pull.py
author Jon Tibble <meths@btinternet.com>
Thu, 19 Jan 2012 19:25:18 +0000
branchoi_151a
changeset 2540 8dd3afe7cd4a
parent 2116 01cac360e383
child 2126 7f6719cd083b
child 2546 2b1fa6a54b5e
permissions -rwxr-xr-x
Uncommitted distro-import leftovers from oi_151_release
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/python2.6
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
     2
#
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
     3
# CDDL HEADER START
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
     4
#
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
     5
# The contents of this file are subject to the terms of the
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
     6
# Common Development and Distribution License (the "License").
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
     7
# You may not use this file except in compliance with the License.
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
     8
#
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
     9
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    10
# or http://www.opensolaris.org/os/licensing.
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    11
# See the License for the specific language governing permissions
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    12
# and limitations under the License.
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    13
#
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    14
# When distributing Covered Code, include this CDDL HEADER in each
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    15
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    16
# If applicable, add the following below this CDDL HEADER, with the
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    17
# fields enclosed by brackets "[]" replaced with your own identifying
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    18
# information: Portions Copyright [yyyy] [name of copyright owner]
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    19
#
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    20
# CDDL HEADER END
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    21
#
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    22
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    23
#
1946
8ef3acf32d54 16132 various bits of pkg specify non-existent domains to gettext.install
Richard Lowe <richlowe@richlowe.net>
parents: 1732
diff changeset
    24
# Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    25
#
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    26
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    27
import calendar
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    28
import getopt
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    29
import gettext
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    30
import os
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    31
import shutil
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    32
import sys
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    33
import tempfile
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    34
import traceback
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    35
import urllib
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    36
import urlparse
1715
8f305f0a6864 8265 EINVAL on rmdir running "make test"
Dan Price <dp@eng.sun.com>
parents: 1600
diff changeset
    37
import warnings
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    38
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
    39
import pkg.catalog as catalog
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    40
import pkg.client.progress as progress
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents: 1946
diff changeset
    41
import pkg.config as cfg
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    42
import pkg.fmri
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    43
import pkg.manifest as manifest
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2058
diff changeset
    44
import pkg.client.api_errors as apx
1977
1e2b423ee045 16565 transport module init exposes latent bug in packagemanager
johansen <johansen@opensolaris.org>
parents: 1974
diff changeset
    45
import pkg.client.transport.transport as transport
1507
b956ea23d3a6 11735 pkg history data files should not be executable
Richard Lowe <richlowe@richlowe.net>
parents: 1431
diff changeset
    46
import pkg.misc as misc
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    47
import pkg.publish.transaction as trans
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
    48
import pkg.search_errors as search_errors
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
    49
import pkg.server.repository as sr
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    50
import pkg.version as version
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    51
696
6bbfd2dece6f 4371 user-agent string needs to be different for different client front-ends
Danek Duvall <danek.duvall@sun.com>
parents: 440
diff changeset
    52
from pkg.client import global_settings
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2058
diff changeset
    53
from pkg.misc import emsg, get_pkg_otw_size, msg, PipeError
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    54
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    55
# Globals
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
    56
cache_dir = None
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    57
complete_catalog = None
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
    58
download_start = False
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    59
tmpdirs = []
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
    60
temp_root = None
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
    61
xport = None
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
    62
xport_cfg = None
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
    63
dest_xport = None
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
    64
targ_pub = None
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    65
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    66
def error(text):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    67
        """Emit an error message prefixed by the command name """
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    68
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    69
        # If we get passed something like an Exception, we can convert
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    70
        # it down to a string.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    71
        text = str(text)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    72
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    73
        # If the message starts with whitespace, assume that it should come
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    74
        # *before* the command-name prefix.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    75
        text_nows = text.lstrip()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    76
        ws = text[:len(text) - len(text_nows)]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    77
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    78
        # This has to be a constant value as we can't reliably get our actual
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    79
        # program name on all platforms.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    80
        emsg(ws + "pkgrecv: " + text_nows)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    81
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    82
def usage(usage_error=None, retcode=2):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    83
        """Emit a usage message and optionally prefix it with a more specific
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    84
        error message.  Causes program to exit."""
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    85
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    86
        if usage_error:
971
67d3507036ab 2422 error/usage message program identification is inconsistent in pkgrecv
Tom Mueller <Tom.Mueller@sun.com>
parents: 856
diff changeset
    87
                error(usage_error)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    88
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    89
        msg(_("""\
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    90
Usage:
2116
01cac360e383 17279 pkgrecv should support ssl certs and keys
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2115
diff changeset
    91
        pkgrecv [-s src_uri] [-d (path|dest_uri)] [-c cache_dir]
01cac360e383 17279 pkgrecv should support ssl certs and keys
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2115
diff changeset
    92
            [-kr] [-m match] [-n] [--raw] [--key keyfile --cert certfile] 
01cac360e383 17279 pkgrecv should support ssl certs and keys
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2115
diff changeset
    93
            (fmri|pattern) ...
01cac360e383 17279 pkgrecv should support ssl certs and keys
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2115
diff changeset
    94
        pkgrecv [-s src_repo_uri] --newest 
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    95
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    96
Options:
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
    97
        -c cache_dir    The path to a directory that will be used to cache
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
    98
                        downloaded content.  If one is not supplied, the
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
    99
                        client will automatically pick a cache directory.
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   100
                        In the case where a download is interrupted, and a
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   101
                        cache directory was automatically chosen, use this
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   102
                        option to resume the download.
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   103
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   104
        -d path_or_uri  The filesystem path or URI of the target repository to
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   105
                        republish packages to.  If not provided, the default
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   106
                        value is the current working directory.  The target
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   107
                        must already exist.  New repositories can be created
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   108
                        using pkgrepo(1).
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   109
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   110
        -h              Display this usage message.
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   111
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   112
        -k              Keep the retrieved package content compressed, ignored
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   113
                        when republishing.  Should not be used with pkgsend.
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   114
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   115
        -m match        Controls matching behaviour using the following values:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   116
                            all-timestamps
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   117
                                includes all matching timestamps, not just
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   118
                                latest (implies all-versions)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   119
                            all-versions
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   120
                                includes all matching versions, not just latest
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   121
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   122
        -n              Perform a trial run with no changes made.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   123
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   124
        -r              Recursively evaluates all dependencies for the provided
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   125
                        list of packages and adds them to the list.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   126
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   127
        -s src_repo_uri A URI representing the location of a pkg(5)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   128
                        repository to retrieve package data from.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   129
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   130
        --newest        List the most recent versions of the packages available
1732
05e756645b7f 8432 document proxy environment variables
Stephen Hahn <sch@sun.com>
parents: 1715
diff changeset
   131
                        from the specified repository and exit.  (All other
05e756645b7f 8432 document proxy environment variables
Stephen Hahn <sch@sun.com>
parents: 1715
diff changeset
   132
                        options except -s will be ignored.)
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   133
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   134
        --raw           Retrieve and store the raw package data in a set of
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   135
                        directory structures by stem and version at the location
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   136
                        specified by -d.  May only be used with filesystem-
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   137
                        based destinations.  This can be used with pkgsend(1)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   138
                        include to conveniently modify and republish packages,
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   139
                        perhaps by correcting file contents or providing
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   140
                        additional package metadata.
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   141
2116
01cac360e383 17279 pkgrecv should support ssl certs and keys
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2115
diff changeset
   142
        --key keyfile   Specify a client SSL key file to use for pkg retrieval.
01cac360e383 17279 pkgrecv should support ssl certs and keys
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2115
diff changeset
   143
01cac360e383 17279 pkgrecv should support ssl certs and keys
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2115
diff changeset
   144
        --cert certfile Specify a client SSL certificate file to use for pkg retrieval.
01cac360e383 17279 pkgrecv should support ssl certs and keys
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2115
diff changeset
   145
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   146
Environment:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   147
        PKG_DEST        Destination directory or repository URI
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   148
        PKG_SRC         Source repository URI"""))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   149
        sys.exit(retcode)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   150
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   151
def cleanup(caller_error=False):
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   152
        """To be called at program finish."""
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   153
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   154
        for d in tmpdirs:
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   155
                # If the cache_dir is in the list of directories that should
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   156
                # be cleaned up, but we're exiting with an error, then preserve
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   157
                # the directory so downloads may be resumed.
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   158
                if d == cache_dir and caller_error and download_start:
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   159
                        error(_("\n\nCached files were preserved in the "
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   160
                            "following directory:\n\t%s\nUse pkgrecv -c "
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   161
                            "to resume the interrupted download.") % cache_dir)
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   162
                        continue
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   163
                shutil.rmtree(d, True)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   164
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   165
        if caller_error and dest_xport and targ_pub:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   166
                try:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   167
                        dest_xport.publish_refresh_packages(targ_pub)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   168
                except apx.TransportError:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   169
                        # If this fails, ignore it as this was a last ditch
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   170
                        # attempt anyway.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   171
                        pass
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   172
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   173
def abort(err=None, retcode=1):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   174
        """To be called when a fatal error is encountered."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   175
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   176
        if err:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   177
                # Clear any possible output first.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   178
                msg("")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   179
                error(err)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   180
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   181
        cleanup(caller_error=True)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   182
        sys.exit(retcode)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   183
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   184
def get_tracker(quiet=False):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   185
        if quiet:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   186
                progresstracker = progress.QuietProgressTracker()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   187
        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   188
                try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   189
                        progresstracker = \
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   190
                            progress.FancyUNIXProgressTracker()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   191
                except progress.ProgressTrackerException:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   192
                        progresstracker = progress.CommandLineProgressTracker()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   193
        return progresstracker
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   194
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   195
def get_manifest(pfmri, basedir, contents=False):
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   196
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   197
        m = None
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   198
        pkgdir = os.path.join(basedir, pfmri.get_dir_path())
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   199
        mpath = os.path.join(pkgdir, "manifest")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   200
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   201
        if not os.path.exists(mpath):
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   202
                m = xport.get_manifest(pfmri)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   203
        else:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2058
diff changeset
   204
                # A FactoredManifest is used here to reduce peak memory
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2058
diff changeset
   205
                # usage (notably when -r was specified).
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   206
                try:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2058
diff changeset
   207
                        m = manifest.FactoredManifest(pfmri, pkgdir)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   208
                except:
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   209
                        abort(err=_("Unable to parse manifest '%(mpath)s' for "
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   210
                            "package '%(pfmri)s'") % locals())
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   211
1132
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   212
        if contents:
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   213
                return m.tostr_unsorted()
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   214
        return m
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   215
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   216
def expand_fmri(pfmri, constraint=version.CONSTRAINT_AUTO):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   217
        """Find matching fmri using CONSTRAINT_AUTO cache for performance.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   218
        Returns None if no matching fmri is found."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   219
        if isinstance(pfmri, str):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   220
                pfmri = pkg.fmri.PkgFmri(pfmri, "5.11")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   221
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   222
        for f in complete_catalog.get(pfmri.pkg_name, []):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   223
                if not pfmri.version or \
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   224
                    f.version.is_successor(pfmri.version, constraint):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   225
                        return f
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   226
        return
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   227
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   228
def expand_matching_fmris(fmri_list, pfmri_strings):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   229
        """find matching fmris using pattern matching and
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   230
        constraint auto."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   231
        counthash = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   232
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   233
        try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   234
                patterns = [
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   235
                    pkg.fmri.MatchingPkgFmri(s, "5.11")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   236
                    for s in pfmri_strings
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   237
                ]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   238
        except pkg.fmri.FmriError, e:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   239
                abort(err=e)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   240
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   241
        return catalog.extract_matching_fmris(fmri_list,
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   242
            patterns=patterns, constraint=version.CONSTRAINT_AUTO,
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   243
            matcher=pkg.fmri.glob_match)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   244
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   245
def get_dependencies(src_uri, fmri_list, basedir, tracker):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   246
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   247
        old_limit = sys.getrecursionlimit()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   248
        # The user may be recursing 'entire' or 'redistributable'.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   249
        sys.setrecursionlimit(3000)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   250
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   251
        s = set()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   252
        for f in fmri_list:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   253
                pfmri = expand_fmri(f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   254
                _get_dependencies(src_uri, s, pfmri, basedir, tracker)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   255
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   256
        # Restore the previous default.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   257
        sys.setrecursionlimit(old_limit)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   258
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   259
        return list(s)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   260
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   261
def _get_dependencies(src_uri, s, pfmri, basedir, tracker):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   262
        """Expand all dependencies."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   263
        tracker.evaluate_progress(fmri=pfmri)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   264
        s.add(pfmri)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   265
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   266
        m = get_manifest(pfmri, basedir)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   267
        for a in m.gen_actions_by_type("depend"):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   268
                new_fmri = expand_fmri(a.attrs["fmri"])
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   269
                if new_fmri and new_fmri not in s:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   270
                        _get_dependencies(src_uri, s, new_fmri, basedir,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   271
                            tracker)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   272
        return s
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   273
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   274
def add_hashes_to_multi(mfst, multi):
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   275
        """Takes a manifest and a multi object. Adds the hashes to the
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   276
        multi object, returns (get_bytes, send_bytes) tuple."""
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   277
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   278
        getb = 0
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   279
        sendb = 0
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   280
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   281
        for atype in ("file", "license"):
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   282
                for a in mfst.gen_actions_by_type(atype):
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   283
                        if a.needsdata(None, None):
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   284
                                multi.add_action(a)
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   285
                                getb += get_pkg_otw_size(a)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   286
                                sendb += int(a.attrs.get("pkg.size", 0))
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   287
        return getb, sendb
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   288
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   289
def prune(fmri_list, all_versions, all_timestamps):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   290
        """Returns a filtered version of fmri_list based on the provided
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   291
        parameters."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   292
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   293
        if all_timestamps:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   294
                pass
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   295
        elif all_versions:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   296
                dedup = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   297
                for f in fmri_list:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   298
                        dedup.setdefault(f.get_short_fmri(), []).append(f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   299
                fmri_list = [sorted(dedup[f], reverse=True)[0] for f in dedup]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   300
        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   301
                dedup = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   302
                for f in fmri_list:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   303
                        dedup.setdefault(f.pkg_name, []).append(f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   304
                fmri_list = [sorted(dedup[f], reverse=True)[0] for f in dedup]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   305
        return fmri_list
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   306
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   307
def list_newest_fmris(fmri_list):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   308
        """List the provided fmris."""
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   309
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   310
        fm_hash = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   311
        fm_list = []
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   312
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   313
        # Order all fmris by package name
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   314
        for f in sorted(fmri_list):
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   315
                if f.pkg_name in fm_hash:
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   316
                        fm_hash[f.pkg_name].append(f)
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   317
                else:
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   318
                        fm_hash[f.pkg_name] = [ f ]
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   319
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   320
        # sort each fmri list
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   321
        for k in fm_hash.keys():
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   322
                fm_hash[k].sort(reverse = True)
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   323
                l = fm_hash[k]
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   324
                fm_list.append(l[0])
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   325
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   326
        for e in fm_list:
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   327
                msg(e.get_fmri())
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   328
2057
874a83b3e8d1 10390 make pkgrecv gracefully handle existing packages in destination
johansen <johansen@opensolaris.org>
parents: 2054
diff changeset
   329
def fetch_catalog(src_pub, tracker, txport):
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   330
        """Fetch the catalog from src_uri."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   331
        global complete_catalog
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   332
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   333
        src_uri = src_pub.selected_repository.origins[0].uri
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   334
        tracker.catalog_start(src_uri)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   335
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   336
        if not src_pub.meta_root:
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   337
                # Create a temporary directory for catalog.
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   338
                cat_dir = tempfile.mkdtemp(dir=temp_root,
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   339
                    prefix=global_settings.client_name + "-")
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   340
                tmpdirs.append(cat_dir)
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   341
                src_pub.meta_root = cat_dir
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   342
2057
874a83b3e8d1 10390 make pkgrecv gracefully handle existing packages in destination
johansen <johansen@opensolaris.org>
parents: 2054
diff changeset
   343
        src_pub.transport = txport
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   344
        try:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   345
                src_pub.refresh(True, True)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   346
        except apx.TransportError, e:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   347
                # Assume that a catalog doesn't exist for the target publisher,
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   348
                # and drive on.  If there was an actual failure due to a
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   349
                # transport issue, let the failure happen whenever some other
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   350
                # operation is attempted later.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   351
                return []
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   352
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   353
        cat = src_pub.catalog
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   354
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   355
        d = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   356
        fmri_list = []
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   357
        for f in cat.fmris():
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   358
                fmri_list.append(f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   359
                d.setdefault(f.pkg_name, [f]).append(f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   360
        for k in d.keys():
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   361
                d[k].sort(reverse=True)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   362
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   363
        complete_catalog = d
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   364
        tracker.catalog_done()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   365
        return fmri_list
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   366
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   367
def main_func():
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   368
        global cache_dir, download_start, xport, xport_cfg, dest_xport, targ_pub
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   369
        all_timestamps = False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   370
        all_versions = False
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   371
        dry_run = False
420
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   372
        keep_compressed = False
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   373
        list_newest = False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   374
        recursive = False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   375
        src_uri = None
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   376
        target = None
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   377
        incoming_dir = None
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   378
        src_pub = None
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   379
        raw = False
2116
01cac360e383 17279 pkgrecv should support ssl certs and keys
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2115
diff changeset
   380
        key = None
01cac360e383 17279 pkgrecv should support ssl certs and keys
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2115
diff changeset
   381
        cert = None
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   382
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   383
        temp_root = misc.config_temp_root()
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   384
1946
8ef3acf32d54 16132 various bits of pkg specify non-existent domains to gettext.install
Richard Lowe <richlowe@richlowe.net>
parents: 1732
diff changeset
   385
        gettext.install("pkg", "/usr/share/locale")
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   386
696
6bbfd2dece6f 4371 user-agent string needs to be different for different client front-ends
Danek Duvall <danek.duvall@sun.com>
parents: 440
diff changeset
   387
        global_settings.client_name = "pkgrecv"
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   388
        target = os.environ.get("PKG_DEST", None)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   389
        src_uri = os.environ.get("PKG_SRC", None)
696
6bbfd2dece6f 4371 user-agent string needs to be different for different client front-ends
Danek Duvall <danek.duvall@sun.com>
parents: 440
diff changeset
   390
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   391
        try:
2116
01cac360e383 17279 pkgrecv should support ssl certs and keys
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2115
diff changeset
   392
                opts, pargs = getopt.getopt(sys.argv[1:], "c:d:hkm:nrs:", 
01cac360e383 17279 pkgrecv should support ssl certs and keys
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2115
diff changeset
   393
                    ["key=", "cert=", "newest", "raw"])
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   394
        except getopt.GetoptError, e:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   395
                usage(_("Illegal option -- %s") % e.opt)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   396
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   397
        for opt, arg in opts:
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   398
                if opt == "-c":
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   399
                        cache_dir = arg
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   400
                elif opt == "-d":
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   401
                        target = arg
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   402
                elif opt == "-h":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   403
                        usage(retcode=0)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   404
                elif opt == "-k":
420
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   405
                        keep_compressed = True
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   406
                elif opt == "-m":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   407
                        if arg == "all-timestamps":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   408
                                all_timestamps = True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   409
                        elif arg == "all-versions":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   410
                                all_versions = True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   411
                        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   412
                                usage(_("Illegal option value -- %s") % arg)
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   413
                elif opt == "-n":
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   414
                        dry_run = True
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   415
                elif opt == "-r":
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   416
                        recursive = True
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   417
                elif opt == "-s":
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   418
                        src_uri = arg
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   419
                elif opt == "--newest":
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   420
                        list_newest = True
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   421
                elif opt == "--raw":
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   422
                        raw = True
2116
01cac360e383 17279 pkgrecv should support ssl certs and keys
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2115
diff changeset
   423
                elif opt == "--key":
01cac360e383 17279 pkgrecv should support ssl certs and keys
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2115
diff changeset
   424
                        key= arg
01cac360e383 17279 pkgrecv should support ssl certs and keys
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2115
diff changeset
   425
                elif opt == "--cert":
01cac360e383 17279 pkgrecv should support ssl certs and keys
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2115
diff changeset
   426
                        cert = arg
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   427
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   428
        if not src_uri:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   429
                usage(_("a source repository must be provided"))
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   430
        else:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   431
                src_uri = misc.parse_uri(src_uri)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   432
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   433
        if not cache_dir:
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   434
                cache_dir = tempfile.mkdtemp(dir=temp_root,
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   435
                    prefix=global_settings.client_name + "-")
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   436
                # Only clean-up cache dir if implicitly created by pkgrecv.
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   437
                # User's cache-dirs should be preserved
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   438
                tmpdirs.append(cache_dir)
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   439
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   440
        incoming_dir = tempfile.mkdtemp(dir=temp_root,
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   441
            prefix=global_settings.client_name + "-")
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   442
        tmpdirs.append(incoming_dir)
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   443
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   444
        # Create transport and transport config
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   445
        xport, xport_cfg = transport.setup_transport()
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2058
diff changeset
   446
        xport_cfg.add_cache(cache_dir, readonly=False)
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2058
diff changeset
   447
        xport_cfg.incoming_root = incoming_dir
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   448
2057
874a83b3e8d1 10390 make pkgrecv gracefully handle existing packages in destination
johansen <johansen@opensolaris.org>
parents: 2054
diff changeset
   449
        # Since publication destionations may only have one repository
874a83b3e8d1 10390 make pkgrecv gracefully handle existing packages in destination
johansen <johansen@opensolaris.org>
parents: 2054
diff changeset
   450
        # configured per publisher, create destination as separate transport
874a83b3e8d1 10390 make pkgrecv gracefully handle existing packages in destination
johansen <johansen@opensolaris.org>
parents: 2054
diff changeset
   451
        # in case source and destination have identical publisher configuration
874a83b3e8d1 10390 make pkgrecv gracefully handle existing packages in destination
johansen <johansen@opensolaris.org>
parents: 2054
diff changeset
   452
        # but different repository endpoints.
874a83b3e8d1 10390 make pkgrecv gracefully handle existing packages in destination
johansen <johansen@opensolaris.org>
parents: 2054
diff changeset
   453
        dest_xport, dest_xport_cfg = transport.setup_transport()
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2058
diff changeset
   454
        dest_xport_cfg.add_cache(cache_dir, readonly=False)
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2058
diff changeset
   455
        dest_xport_cfg.incoming_root = incoming_dir
2057
874a83b3e8d1 10390 make pkgrecv gracefully handle existing packages in destination
johansen <johansen@opensolaris.org>
parents: 2054
diff changeset
   456
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   457
        # Configure src publisher(s).
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   458
        transport.setup_publisher(src_uri, "source", xport, xport_cfg,
2116
01cac360e383 17279 pkgrecv should support ssl certs and keys
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2115
diff changeset
   459
            remote_prefix=True, ssl_key=key, ssl_cert=cert)
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   460
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   461
        any_unmatched = []
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   462
        total_processed = 0
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   463
        for src_pub in xport_cfg.gen_publishers():
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   464
                tracker = get_tracker()
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   465
                if list_newest:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   466
                        if pargs or len(pargs) > 0:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   467
                                usage(_("-n takes no options"))
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   468
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   469
                        fmri_list = fetch_catalog(src_pub, tracker, xport)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   470
                        list_newest_fmris(fmri_list)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   471
                        continue
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   472
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   473
                msg(_("Processing packages for publisher %s ...") %
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   474
                    src_pub.prefix)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   475
                if pargs == None or len(pargs) == 0:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   476
                        usage(_("must specify at least one pkgfmri"))
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   477
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   478
                republish = False
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   479
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   480
                if not target:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   481
                        target = basedir = os.getcwd()
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   482
                elif target and not raw:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   483
                        basedir = tempfile.mkdtemp(dir=temp_root,
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   484
                            prefix=global_settings.client_name + "-")
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   485
                        tmpdirs.append(basedir)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   486
                        republish = True
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   487
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   488
                        # Turn target into a valid URI.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   489
                        target = misc.parse_uri(target)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   490
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   491
                        # Setup target for transport.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   492
                        targ_pub = transport.setup_publisher(target,
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   493
                            src_pub.prefix, dest_xport, dest_xport_cfg)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   494
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   495
                        # Files have to be decompressed for republishing.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   496
                        keep_compressed = False
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   497
                        if target.startswith("file://"):
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   498
                                # Check to see if the repository exists first.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   499
                                try:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   500
                                        t = trans.Transaction(target,
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   501
                                            xport=dest_xport, pub=targ_pub)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   502
                                except trans.TransactionRepositoryInvalidError, e:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   503
                                        txt = str(e) + "\n\n"
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   504
                                        txt += _("To create a repository, use "
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   505
                                            "the pkgsend command.")
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   506
                                        abort(err=txt)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   507
                                except trans.TransactionRepositoryConfigError, e:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   508
                                        txt = str(e) + "\n\n"
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   509
                                        txt += _("The repository configuration "
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   510
                                            "for the repository located at "
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   511
                                            "'%s' is not valid or the "
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   512
                                            "specified path does not exist.  "
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   513
                                            "Please correct the configuration "
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   514
                                            "of the repository or create a new "
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   515
                                            "one.") % target
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   516
                                        abort(err=txt)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   517
                                except trans.TransactionError, e:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   518
                                        abort(err=e)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   519
                else:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   520
                        basedir = target
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   521
                        if not os.path.exists(basedir):
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   522
                                try:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   523
                                        os.makedirs(basedir, misc.PKG_DIR_MODE)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   524
                                except Exception, e:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   525
                                        error(_("Unable to create basedir "
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   526
                                            "'%s': %s") % (basedir, e))
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   527
                                        abort()
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   528
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   529
                xport_cfg.pkg_root = basedir
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   530
                dest_xport_cfg.pkg_root = basedir
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   531
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   532
                if republish:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   533
                        targ_fmris = fetch_catalog(targ_pub, tracker, dest_xport)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   534
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   535
                all_fmris = fetch_catalog(src_pub, tracker, xport)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   536
                fmri_arguments = pargs
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   537
                matches, unmatched = expand_matching_fmris(all_fmris,
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   538
                    fmri_arguments)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   539
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   540
                # Track anything that failed to match.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   541
                any_unmatched.append(unmatched)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   542
                if not matches:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   543
                        # No matches at all; nothing to do for this publisher.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   544
                        continue
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   545
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   546
                fmri_list = prune(list(set(matches)), all_versions,
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   547
                    all_timestamps)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   548
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   549
                if recursive:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   550
                        msg(_("Retrieving manifests for dependency "
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   551
                            "evaluation ..."))
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   552
                        tracker.evaluate_start()
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   553
                        fmri_list = prune(get_dependencies(src_uri, fmri_list,
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   554
                            basedir, tracker), all_versions, all_timestamps)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   555
                        tracker.evaluate_done()
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   556
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   557
                def get_basename(pfmri):
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   558
                        open_time = pfmri.get_timestamp()
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   559
                        return "%d_%s" % \
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   560
                            (calendar.timegm(open_time.utctimetuple()),
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   561
                            urllib.quote(str(pfmri), ""))
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   562
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   563
                # First, retrieve the manifests and calculate package transfer
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   564
                # sizes.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   565
                npkgs = len(fmri_list)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   566
                get_bytes = 0
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   567
                send_bytes = 0
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   568
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   569
                if not recursive:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   570
                        msg(_("Retrieving and evaluating %d package(s)...") %
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   571
                            npkgs)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   572
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   573
                tracker.evaluate_start(npkgs=npkgs)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   574
                skipped = False
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   575
                retrieve_list = []
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   576
                while fmri_list:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   577
                        f = fmri_list.pop()
2057
874a83b3e8d1 10390 make pkgrecv gracefully handle existing packages in destination
johansen <johansen@opensolaris.org>
parents: 2054
diff changeset
   578
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   579
                        if republish and f in targ_fmris:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   580
                                if not skipped:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   581
                                        # Ensure a new line is output so message
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   582
                                        # is on separate line from spinner.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   583
                                        msg("")
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   584
                                msg(_("Skipping %s: already present "
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   585
                                    "at destination") % f)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   586
                                skipped = True
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   587
                                continue
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   588
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   589
                        m = get_manifest(f, basedir)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   590
                        pkgdir = xport_cfg.get_pkg_dir(f)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   591
                        mfile = xport.multi_file_ni(src_pub, pkgdir,
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   592
                            not keep_compressed, tracker)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   593
         
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   594
                        getb, sendb = add_hashes_to_multi(m, mfile)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   595
                        get_bytes += getb
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   596
                        if republish:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   597
                                send_bytes += sendb
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   598
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   599
                        retrieve_list.append((f, mfile))
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   600
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   601
                        tracker.evaluate_progress(fmri=f)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   602
                tracker.evaluate_done()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   603
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   604
                # Next, retrieve and store the content for each package.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   605
                tracker.republish_set_goal(len(retrieve_list), get_bytes,
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   606
                    send_bytes)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   607
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   608
                if dry_run:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   609
                        tracker.republish_done()
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   610
                        cleanup()
2057
874a83b3e8d1 10390 make pkgrecv gracefully handle existing packages in destination
johansen <johansen@opensolaris.org>
parents: 2054
diff changeset
   611
                        continue
874a83b3e8d1 10390 make pkgrecv gracefully handle existing packages in destination
johansen <johansen@opensolaris.org>
parents: 2054
diff changeset
   612
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   613
                processed = 0
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   614
                while retrieve_list:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   615
                        f, mfile = retrieve_list.pop()
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   616
                        tracker.republish_start_pkg(f.pkg_name)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   617
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   618
                        if mfile:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   619
                                download_start = True
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   620
                                mfile.wait_files()
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   621
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   622
                        if not republish:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   623
                                # Nothing more to do for this package.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   624
                                tracker.republish_end_pkg()
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   625
                                continue
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   626
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   627
                        m = get_manifest(f, basedir)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   628
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   629
                        # Get first line of original manifest so that inclusion
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   630
                        # of the scheme can be determined.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   631
                        use_scheme = True
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   632
                        contents = get_manifest(f, basedir, contents=True)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   633
                        if contents.splitlines()[0].find("pkg:/") == -1:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   634
                                use_scheme = False
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   635
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   636
                        pkg_name = f.get_fmri(include_scheme=use_scheme)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   637
                        pkgdir = xport_cfg.get_pkg_dir(f)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   638
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   639
                        # This is needed so any previous failures for a package
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   640
                        # can be aborted.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   641
                        trans_id = get_basename(f)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   642
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   643
                        if not targ_pub:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   644
                                targ_pub = transport.setup_publisher(target,
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   645
                                    src_pub.prefix, dest_xport, dest_xport_cfg,
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   646
                                    remote_prefix=True)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   647
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   648
                        try:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   649
                                t = trans.Transaction(target, pkg_name=pkg_name,
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   650
                                    trans_id=trans_id, xport=dest_xport,
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   651
                                    pub=targ_pub, progtrack=tracker)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   652
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   653
                                # Remove any previous failed attempt to
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   654
                                # to republish this package.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   655
                                try:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   656
                                        t.close(abandon=True)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   657
                                except:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   658
                                        # It might not exist already.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   659
                                        pass
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   660
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   661
                                t.open()
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   662
                                for a in m.gen_actions():
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   663
                                        if a.name == "set" and \
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   664
                                            a.attrs.get("name", "") in ("fmri",
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   665
                                            "pkg.fmri"):
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   666
                                                # To be consistent with the
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   667
                                                # server, the fmri can't be
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   668
                                                # added to the manifest.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   669
                                                continue
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   670
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   671
                                        if hasattr(a, "hash"):
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   672
                                                fname = os.path.join(pkgdir,
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   673
                                                    a.hash)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   674
                                                a.data = lambda: open(fname,
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   675
                                                    "rb")
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   676
                                        t.add(a)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   677
                                # Always defer catalog update.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   678
                                t.close(add_to_catalog=False)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   679
                        except trans.TransactionError, e:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   680
                                abort(err=e)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   681
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   682
                        # Dump data retrieved so far after each successful
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   683
                        # republish to conserve space.
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   684
                        try:
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   685
                                shutil.rmtree(dest_xport_cfg.incoming_root)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   686
                        except EnvironmentError, e:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   687
                                raise apx._convert_error(e)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   688
                        misc.makedirs(dest_xport_cfg.incoming_root)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   689
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   690
                        processed += 1
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   691
                        tracker.republish_end_pkg()
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   692
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   693
                tracker.republish_done()
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   694
                tracker.reset()
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   695
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   696
                if processed > 0:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   697
                        # If any packages were published, trigger an update of
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   698
                        # the catalog.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   699
                        total_processed += processed
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   700
                        dest_xport.publish_refresh_packages(targ_pub)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   701
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   702
                # Prevent further use.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   703
                targ_pub = None
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   704
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   705
        # Find the intersection of patterns that failed to match.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   706
        unmatched = {}
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   707
        for pub_unmatched in any_unmatched:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   708
                if not pub_unmatched:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   709
                        # If any publisher matched all patterns, then treat
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   710
                        # the operation as successful.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   711
                        unmatched = {}
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   712
                        break
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   713
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   714
                # Otherwise, find the intersection of unmatched patterns so far.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   715
                for k in pub_unmatched:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   716
                        try:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   717
                                src = set(unmatched[k])
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   718
                                unmatched[k] = \
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   719
                                    src.intersection(pub_unmatched[k])
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   720
                        except KeyError:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   721
                                # Nothing to intersect with; assign instead.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   722
                                unmatched[k] = pub_unmatched[k]
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   723
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   724
        # Prune types of matching that didn't have any match failures.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   725
        for k, v in unmatched.items():
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   726
                if not v:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   727
                        del unmatched[k]
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   728
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   729
        if unmatched:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   730
                # If any match failures remain, abort with an error.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   731
                match_err = apx.InventoryException(**unmatched)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   732
                emsg(match_err)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   733
                if total_processed > 0:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   734
                        # Partial failure.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   735
                        abort(retcode=3)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   736
                abort()
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   737
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   738
        # Dump all temporary data.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   739
        cleanup()
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   740
        return 0
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   741
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   742
if __name__ == "__main__":
1715
8f305f0a6864 8265 EINVAL on rmdir running "make test"
Dan Price <dp@eng.sun.com>
parents: 1600
diff changeset
   743
8f305f0a6864 8265 EINVAL on rmdir running "make test"
Dan Price <dp@eng.sun.com>
parents: 1600
diff changeset
   744
        # Make all warnings be errors.
8f305f0a6864 8265 EINVAL on rmdir running "make test"
Dan Price <dp@eng.sun.com>
parents: 1600
diff changeset
   745
        warnings.simplefilter('error')
8f305f0a6864 8265 EINVAL on rmdir running "make test"
Dan Price <dp@eng.sun.com>
parents: 1600
diff changeset
   746
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   747
        try:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   748
                __ret = main_func()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   749
        except (pkg.actions.ActionError, trans.TransactionError,
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2058
diff changeset
   750
            RuntimeError, apx.TransportError, apx.BadRepositoryURI,
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2058
diff changeset
   751
            apx.UnsupportedRepositoryURI), _e:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   752
                error(_e)
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   753
                cleanup(True)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   754
                __ret = 1
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   755
        except PipeError:
440
cbd8cd1564a9 2104 pkgrecv: Spurious error message while downloading package with no files
Brad Hall <bhall@eng.sun.com>
parents: 420
diff changeset
   756
                # We don't want to display any messages here to prevent
cbd8cd1564a9 2104 pkgrecv: Spurious error message while downloading package with no files
Brad Hall <bhall@eng.sun.com>
parents: 420
diff changeset
   757
                # possible further broken pipe (EPIPE) errors.
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   758
                cleanup(False)
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   759
                __ret = 1
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2058
diff changeset
   760
        except (KeyboardInterrupt, apx.CanceledException):
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   761
                cleanup(True)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   762
                __ret = 1
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   763
        except SystemExit, _e:
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   764
                cleanup(False)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   765
                raise _e
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   766
        except:
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   767
                cleanup(True)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   768
                traceback.print_exc()
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   769
                error(
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   770
                    _("\n\nThis is an internal error.  Please let the "
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   771
                    "developers know about this\nproblem by filing a bug at "
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   772
                    "http://defect.opensolaris.org and including the\nabove "
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   773
                    "traceback and this message.  The version of pkg(5) is "
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   774
                    "'%s'.") % pkg.VERSION)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   775
                __ret = 99
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   776
        sys.exit(__ret)