src/pull.py
author Jon Tibble <meths@btinternet.com>
Sat, 25 Feb 2012 15:16:48 +0000
branchoi_151a
changeset 2546 2b1fa6a54b5e
parent 2116 01cac360e383
permissions -rwxr-xr-x
Apply Shawn Walker's backport - breaking some branding
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
#
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
    24
# Copyright (c) 2008, 2011, 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
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
    28
import errno
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    29
import getopt
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    30
import gettext
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    31
import os
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    32
import shutil
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    33
import sys
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    34
import tempfile
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    35
import traceback
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    36
import urllib
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
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    41
import pkg.fmri
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    42
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
    43
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
    44
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
    45
import pkg.misc as misc
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
    46
import pkg.p5p
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
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    48
import pkg.version as version
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    49
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
    50
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
    51
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
    52
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    53
# Globals
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
    54
archive = False
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
    55
cache_dir = None
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
    56
src_cat = None
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
    57
download_start = False
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    58
tmpdirs = []
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
    59
temp_root = None
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
    60
xport = None
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
    61
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
    62
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
    63
targ_pub = None
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
    64
target = 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:
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
    91
        pkgrecv [-s src_uri] [-a] [-d (path|dest_uri)] [-c cache_dir]
2116
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:
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
    97
        -a              Store the retrieved package data in a pkg(5) archive
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
    98
                        at the location specified by -d.  The file may not
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
    99
                        already exist, and this option may only be used with
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   100
                        filesystem-based destinations.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   101
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   102
        -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
   103
                        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
   104
                        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
   105
                        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
   106
                        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
   107
                        option to resume the download.
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   108
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   109
        -d path_or_uri  The filesystem path or URI of the target repository to
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   110
                        republish packages to.  The target must already exist.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   111
                        New repositories can be created using pkgrepo(1).
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   112
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   113
        -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
   114
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   115
        -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
   116
                        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
   117
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   118
        -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
   119
                            all-timestamps
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   120
                                includes all matching timestamps, not just
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   121
                                latest (implies all-versions)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   122
                            all-versions
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   123
                                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
   124
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   125
        -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
   126
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   127
        -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
   128
                        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
   129
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   130
        -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
   131
                        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
   132
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   133
        --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
   134
                        from the specified repository and exit.  (All other
05e756645b7f 8432 document proxy environment variables
Stephen Hahn <sch@sun.com>
parents: 1715
diff changeset
   135
                        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
   136
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   137
        --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
   138
                        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
   139
                        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
   140
                        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
   141
                        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
   142
                        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
   143
                        additional package metadata.
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   144
2116
01cac360e383 17279 pkgrecv should support ssl certs and keys
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2115
diff changeset
   145
        --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
   146
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   147
        --cert certfile Specify a client SSL certificate file to use for pkg
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   148
                        retrieval.
2116
01cac360e383 17279 pkgrecv should support ssl certs and keys
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2115
diff changeset
   149
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   150
Environment:
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   151
        PKG_DEST        Destination directory or URI
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   152
        PKG_SRC         Source URI or path"""))
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   153
        sys.exit(retcode)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   154
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   155
def cleanup(caller_error=False):
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   156
        """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
   157
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   158
        for d in tmpdirs:
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   159
                # 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
   160
                # 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
   161
                # 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
   162
                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
   163
                        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
   164
                            "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
   165
                            "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
   166
                        continue
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   167
                shutil.rmtree(d, ignore_errors=True)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   168
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   169
        if caller_error and dest_xport and targ_pub and not archive:
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   170
                try:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   171
                        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
   172
                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
   173
                        # 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
   174
                        # attempt anyway.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   175
                        pass
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   176
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   177
def abort(err=None, retcode=1):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   178
        """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
   179
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   180
        if err:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   181
                # Clear any possible output first.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   182
                msg("")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   183
                error(err)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   184
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   185
        cleanup(caller_error=True)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   186
        sys.exit(retcode)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   187
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   188
def get_tracker(quiet=False):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   189
        if quiet:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   190
                progresstracker = progress.QuietProgressTracker()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   191
        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   192
                try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   193
                        progresstracker = \
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   194
                            progress.FancyUNIXProgressTracker()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   195
                except progress.ProgressTrackerException:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   196
                        progresstracker = progress.CommandLineProgressTracker()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   197
        return progresstracker
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   198
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   199
def get_manifest(pfmri, xport_cfg, contents=False):
1118
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
        m = None
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   202
        pkgdir = xport_cfg.get_pkg_dir(pfmri)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   203
        mpath = xport_cfg.get_pkg_pathname(pfmri)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   204
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   205
        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
   206
                m = xport.get_manifest(pfmri)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   207
        else:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2058
diff changeset
   208
                # 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
   209
                # usage (notably when -r was specified).
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   210
                try:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2058
diff changeset
   211
                        m = manifest.FactoredManifest(pfmri, pkgdir)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   212
                except:
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   213
                        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
   214
                            "package '%(pfmri)s'") % locals())
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   215
1132
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   216
        if contents:
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   217
                return m.tostr_unsorted()
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   218
        return m
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   219
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   220
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
   221
        """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
   222
        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
   223
        if isinstance(pfmri, str):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   224
                pfmri = pkg.fmri.PkgFmri(pfmri, "5.11")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   225
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   226
        # Iterate in reverse so newest version is evaluated first.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   227
        versions = [e for e in src_cat.fmris_by_version(pfmri.pkg_name)]
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   228
        for v, fmris in reversed(versions):
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   229
                for f in fmris:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   230
                        if not pfmri.version or \
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   231
                            f.version.is_successor(pfmri.version, constraint):
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   232
                                return f
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   233
        return
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   234
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   235
def get_dependencies(fmri_list, xport_cfg, tracker):
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   236
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   237
        old_limit = sys.getrecursionlimit()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   238
        # 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
   239
        sys.setrecursionlimit(3000)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   240
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   241
        s = set()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   242
        for f in fmri_list:
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   243
                _get_dependencies(s, f, xport_cfg, tracker)
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
        # Restore the previous default.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   246
        sys.setrecursionlimit(old_limit)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   247
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   248
        return list(s)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   249
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   250
def _get_dependencies(s, pfmri, xport_cfg, tracker):
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   251
        """Expand all dependencies."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   252
        tracker.evaluate_progress(fmri=pfmri)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   253
        s.add(pfmri)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   254
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   255
        m = get_manifest(pfmri, xport_cfg)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   256
        for a in m.gen_actions_by_type("depend"):
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   257
                for fmri_str in a.attrlist("fmri"):
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   258
                        new_fmri = expand_fmri(fmri_str)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   259
                        if new_fmri and new_fmri not in s:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   260
                                _get_dependencies(s, new_fmri, xport_cfg, tracker)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   261
        return s
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   262
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   263
def add_hashes_to_multi(mfst, multi):
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   264
        """Takes a manifest and a multi object. Adds the hashes to the multi
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   265
        object, returns (get_bytes, get_files, send_bytes, send_comp_bytes)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   266
        tuple."""
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   267
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   268
        getb = 0
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   269
        getf = 0
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   270
        sendb = 0
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   271
        sendcb = 0
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   272
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   273
        for a in mfst.gen_actions():
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   274
                if a.has_payload:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   275
                        multi.add_action(a)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   276
                        getb += get_pkg_otw_size(a)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   277
                        getf += 1
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   278
                        sendb += int(a.attrs.get("pkg.size", 0))
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   279
                        sendcb += int(a.attrs.get("pkg.csize", 0))
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   280
                        if a.name == "signature":
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   281
                                getf += len(a.get_chain_certs())
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   282
                                getb += a.get_action_chain_csize()
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   283
        return getb, getf, sendb, sendcb
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   284
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   285
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
   286
        """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
   287
        parameters."""
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
        if all_timestamps:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   290
                pass
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   291
        elif all_versions:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   292
                dedup = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   293
                for f in fmri_list:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   294
                        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
   295
                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
   296
        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   297
                dedup = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   298
                for f in fmri_list:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   299
                        dedup.setdefault(f.pkg_name, []).append(f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   300
                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
   301
        return fmri_list
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   302
2057
874a83b3e8d1 10390 make pkgrecv gracefully handle existing packages in destination
johansen <johansen@opensolaris.org>
parents: 2054
diff changeset
   303
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
   304
        """Fetch the catalog from src_uri."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   305
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   306
        src_uri = src_pub.repository.origins[0].uri
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   307
        tracker.catalog_start(src_uri)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   308
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   309
        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
   310
                # 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
   311
                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
   312
                    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
   313
                tmpdirs.append(cat_dir)
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   314
                src_pub.meta_root = cat_dir
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   315
2057
874a83b3e8d1 10390 make pkgrecv gracefully handle existing packages in destination
johansen <johansen@opensolaris.org>
parents: 2054
diff changeset
   316
        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
   317
        try:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   318
                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
   319
        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
   320
                # 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
   321
                # 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
   322
                # 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
   323
                # operation is attempted later.
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   324
                tracker.catalog_done()
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   325
                return catalog.Catalog(read_only=True)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   326
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   327
        tracker.catalog_done()
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   328
        return src_pub.catalog
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   329
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   330
def main_func():
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   331
        global archive, cache_dir, download_start, xport, xport_cfg, \
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   332
            dest_xport, temp_root, targ_pub, target
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   333
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   334
        all_timestamps = False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   335
        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
   336
        dry_run = False
420
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   337
        keep_compressed = False
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   338
        list_newest = False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   339
        recursive = False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   340
        src_uri = None
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   341
        incoming_dir = None
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   342
        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
   343
        raw = False
2116
01cac360e383 17279 pkgrecv should support ssl certs and keys
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2115
diff changeset
   344
        key = None
01cac360e383 17279 pkgrecv should support ssl certs and keys
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2115
diff changeset
   345
        cert = None
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   346
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   347
        temp_root = misc.config_temp_root()
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   348
1946
8ef3acf32d54 16132 various bits of pkg specify non-existent domains to gettext.install
Richard Lowe <richlowe@richlowe.net>
parents: 1732
diff changeset
   349
        gettext.install("pkg", "/usr/share/locale")
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   350
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
   351
        global_settings.client_name = "pkgrecv"
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   352
        target = os.environ.get("PKG_DEST", None)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   353
        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
   354
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   355
        try:
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   356
                opts, pargs = getopt.getopt(sys.argv[1:], "ac:d:hkm:nrs:", 
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   357
                    ["cert=", "key=", "newest", "raw"])
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   358
        except getopt.GetoptError, e:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   359
                usage(_("Illegal option -- %s") % e.opt)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   360
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   361
        for opt, arg in opts:
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   362
                if opt == "-a":
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   363
                        archive = True
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   364
                elif opt == "-c":
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   365
                        cache_dir = arg
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   366
                elif opt == "-d":
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   367
                        target = arg
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   368
                elif opt == "-h":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   369
                        usage(retcode=0)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   370
                elif opt == "-k":
420
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   371
                        keep_compressed = True
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   372
                elif opt == "-m":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   373
                        if arg == "all-timestamps":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   374
                                all_timestamps = True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   375
                        elif arg == "all-versions":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   376
                                all_versions = True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   377
                        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   378
                                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
   379
                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
   380
                        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
   381
                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
   382
                        recursive = True
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   383
                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
   384
                        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
   385
                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
   386
                        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
   387
                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
   388
                        raw = True
2116
01cac360e383 17279 pkgrecv should support ssl certs and keys
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2115
diff changeset
   389
                elif opt == "--key":
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   390
                        key = arg
2116
01cac360e383 17279 pkgrecv should support ssl certs and keys
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2115
diff changeset
   391
                elif opt == "--cert":
01cac360e383 17279 pkgrecv should support ssl certs and keys
Bart Smaalders <Bart.Smaalders@Oracle.COM>
parents: 2115
diff changeset
   392
                        cert = arg
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   393
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   394
        if not list_newest and not target:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   395
                usage(_("a destination must be provided"))
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   396
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   397
        if not src_uri:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   398
                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
   399
        else:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   400
                src_uri = misc.parse_uri(src_uri)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   401
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   402
        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
   403
                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
   404
                    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
   405
                # 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
   406
                # 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
   407
                tmpdirs.append(cache_dir)
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   408
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   409
        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
   410
            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
   411
        tmpdirs.append(incoming_dir)
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   412
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   413
        # Create transport and transport config
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   414
        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
   415
        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
   416
        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
   417
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   418
        # Since publication destinations may only have one repository configured
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   419
        # per publisher, create destination as separate transport in case source
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   420
        # and destination have identical publisher configuration but different
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   421
        # repository endpoints.
2057
874a83b3e8d1 10390 make pkgrecv gracefully handle existing packages in destination
johansen <johansen@opensolaris.org>
parents: 2054
diff changeset
   422
        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
   423
        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
   424
        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
   425
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   426
        # 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
   427
        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
   428
            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
   429
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   430
        args = (pargs, target, list_newest, all_versions,
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   431
            all_timestamps, keep_compressed, raw, recursive, dry_run,
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   432
            dest_xport_cfg, src_uri)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   433
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   434
        if archive:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   435
                # Retrieving package data for archival requires a different mode
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   436
                # of operation so gets its own routine.  Notably, it requires
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   437
                # that all package data be retrieved before the archival process
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   438
                # is started.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   439
                return archive_pkgs(*args)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   440
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   441
        # Normal package transfer allows operations on a per-package basis.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   442
        return transfer_pkgs(*args)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   443
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   444
def check_processed(any_matched, any_unmatched, total_processed):
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   445
        # Reduce unmatched patterns to those that were unmatched for all
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   446
        # publishers.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   447
        unmatched = set(any_unmatched) - set(any_matched)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   448
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   449
        if not unmatched:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   450
                return
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   451
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   452
        # If any match failures remain, abort with an error.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   453
        rval = 1
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   454
        if total_processed > 0:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   455
                rval = 3
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   456
        abort(str(apx.PackageMatchErrors(unmatched_fmris=unmatched)),
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   457
            retcode=rval)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   458
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   459
def get_matches(src_pub, tracker, xport, pargs, any_unmatched, any_matched,
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   460
    all_versions, all_timestamps, recursive):
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   461
        """Returns the set of matching FMRIs for the given arguments."""
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   462
        global src_cat
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   463
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   464
        src_cat = fetch_catalog(src_pub, tracker, xport)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   465
        # Avoid overhead of going through matching if user requested all
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   466
        # packages.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   467
        if "*" not in pargs and "*@*" not in pargs:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   468
                try:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   469
                        matches, refs, unmatched = \
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   470
                            src_cat.get_matching_fmris(pargs,
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   471
                            raise_unmatched=False)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   472
                except apx.PackageMatchErrors, e:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   473
                        abort(str(e))
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   474
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   475
                # Track anything that failed to match.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   476
                any_unmatched.extend(unmatched)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   477
                any_matched.extend(set(p for p in refs.values()))
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   478
                matches = list(set(f for m in matches.values() for f in m))
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   479
        else:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   480
                matches = [f for f in src_cat.fmris()]
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   481
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   482
        if not matches:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   483
                # No matches at all; nothing to do for this publisher.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   484
                return matches
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   485
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   486
        matches = prune(matches, all_versions, all_timestamps)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   487
        if recursive:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   488
                msg(_("Retrieving manifests for dependency "
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   489
                    "evaluation ..."))
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   490
                tracker.evaluate_start()
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   491
                matches = prune(get_dependencies(matches, xport_cfg, tracker),
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   492
                    all_versions, all_timestamps)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   493
                tracker.evaluate_done()
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   494
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   495
        return matches
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   496
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   497
def archive_pkgs(pargs, target, list_newest, all_versions, all_timestamps,
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   498
    keep_compresed, raw, recursive, dry_run, dest_xport_cfg, src_uri):
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   499
        """Retrieve source package data completely and then archive it."""
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   500
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   501
        global cache_dir, download_start, xport, xport_cfg
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   502
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   503
        target = os.path.abspath(target)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   504
        if os.path.exists(target):
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   505
                error(_("Target archive '%s' already "
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   506
                    "exists.") % target)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   507
                abort()
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   508
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   509
        # Open the archive early so that permissions failures, etc. can be
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   510
        # detected before actual work is started.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   511
        pkg_arc = pkg.p5p.Archive(target, mode="w")
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   512
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   513
        basedir = tempfile.mkdtemp(dir=temp_root,
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   514
            prefix=global_settings.client_name + "-")
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   515
        tmpdirs.append(basedir)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   516
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   517
        # Retrieve package data for all publishers.
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   518
        any_unmatched = []
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   519
        any_matched = []
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   520
        total_processed = 0
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   521
        arc_bytes = 0
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   522
        archive_list = []
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   523
        for src_pub in xport_cfg.gen_publishers():
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   524
                # Root must be per publisher on the off chance that multiple
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   525
                # publishers have the same package.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   526
                xport_cfg.pkg_root = os.path.join(basedir, src_pub.prefix)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   527
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   528
                tracker = get_tracker()
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   529
                msg(_("Retrieving packages for publisher %s ...") %
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   530
                    src_pub.prefix)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   531
                if pargs == None or len(pargs) == 0:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   532
                        usage(_("must specify at least one pkgfmri"))
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   533
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   534
                matches = get_matches(src_pub, tracker, xport, pargs,
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   535
                    any_unmatched, any_matched, all_versions, all_timestamps,
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   536
                    recursive)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   537
                if not matches:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   538
                        # No matches at all; nothing to do for this publisher.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   539
                        continue
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   540
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   541
                # First, retrieve the manifests and calculate package transfer
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   542
                # sizes.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   543
                npkgs = len(matches)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   544
                get_bytes = 0
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   545
                get_files = 0
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   547
                if not recursive:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   548
                        msg(_("Retrieving and evaluating %d package(s)...") %
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   549
                            npkgs)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   550
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   551
                tracker.evaluate_start(npkgs=npkgs)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   552
                retrieve_list = []
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   553
                while matches:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   554
                        f = matches.pop()
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   555
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   556
                        m = get_manifest(f, xport_cfg)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   557
                        pkgdir = xport_cfg.get_pkg_dir(f)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   558
                        mfile = xport.multi_file_ni(src_pub, pkgdir,
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   559
                            progtrack=tracker)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   560
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   561
                        getb, getf, arcb, arccb = add_hashes_to_multi(m, mfile)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   562
                        get_bytes += getb
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   563
                        get_files += getf
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   564
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   565
                        # Since files are going into the archive, progress
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   566
                        # can be tracked in terms of compressed bytes for
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   567
                        # the package files themselves.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   568
                        arc_bytes += arccb
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   569
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   570
                        # Also include the the manifest file itself in the
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   571
                        # amount of bytes to archive.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   572
                        try:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   573
                                fs = os.stat(m.pathname)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   574
                                arc_bytes += fs.st_size
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   575
                        except EnvironmentError, e:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   576
                                raise apx._convert_error(e)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   577
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   578
                        retrieve_list.append((f, mfile))
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   579
                        if not dry_run:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   580
                                archive_list.append((f, m.pathname, pkgdir))
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   581
                        tracker.evaluate_progress(fmri=f)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   582
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   583
                tracker.evaluate_done()
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   584
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   585
                # Next, retrieve the content for this publisher's packages.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   586
                tracker.download_set_goal(len(retrieve_list), get_files,
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   587
                    get_bytes)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   588
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   589
                if dry_run:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   590
                        # Don't call download_done here; it would cause an
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   591
                        # assertion failure since nothing was downloaded.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   592
                        # Instead, call the method that simply finishes
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   593
                        # up the progress output.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   594
                        tracker.dl_output_done()
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   595
                        cleanup()
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   596
                        continue
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   597
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   598
                processed = 0
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   599
                while retrieve_list:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   600
                        f, mfile = retrieve_list.pop()
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   601
                        tracker.download_start_pkg(f.pkg_name)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   602
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   603
                        if mfile:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   604
                                download_start = True
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   605
                                mfile.wait_files()
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   606
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   607
                        # Nothing more to do for this package.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   608
                        tracker.download_end_pkg()
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   609
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   610
                tracker.download_done()
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   611
                tracker.reset()
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   612
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   613
        # Check processed patterns and abort with failure if some were
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   614
        # unmatched.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   615
        check_processed(any_matched, any_unmatched, total_processed)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   616
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   617
        if dry_run:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   618
                # Dump all temporary data.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   619
                cleanup()
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   620
                return 0
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   621
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   622
        # Now create archive and then archive retrieved package data.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   623
        while archive_list:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   624
                pfmri, mpath, pkgdir = archive_list.pop()
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   625
                pkg_arc.add_package(pfmri, mpath, pkgdir)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   626
        pkg_arc.close(progtrack=tracker)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   627
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   628
        # Dump all temporary data.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   629
        cleanup()
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   630
        return 0
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   631
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   632
def transfer_pkgs(pargs, target, list_newest, all_versions, all_timestamps,
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   633
    keep_compressed, raw, recursive, dry_run, dest_xport_cfg, src_uri):
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   634
        """Retrieve source package data and optionally republish it as each
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   635
        package is retrieved.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   636
        """
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   637
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   638
        global cache_dir, download_start, xport, xport_cfg, dest_xport, targ_pub
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   639
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   640
        any_unmatched = []
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   641
        any_matched = []
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   642
        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
   643
        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
   644
                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
   645
                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
   646
                        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
   647
                                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
   648
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   649
                        src_cat = fetch_catalog(src_pub, tracker,
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   650
                            xport)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   651
                        for f in src_cat.fmris(ordered=True, last=True):
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   652
                                msg(f.get_fmri())
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   653
                        continue
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   654
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   655
                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
   656
                    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
   657
                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
   658
                        usage(_("must specify at least one pkgfmri"))
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   659
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   660
                republish = False
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   661
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   662
                if not raw:
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   663
                        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
   664
                            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
   665
                        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
   666
                        republish = True
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   667
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   668
                        # 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
   669
                        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
   670
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   671
                        # 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
   672
                        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
   673
                            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
   674
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   675
                        # 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
   676
                        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
   677
                        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
   678
                                # 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
   679
                                try:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   680
                                        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
   681
                                            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
   682
                                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
   683
                                        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
   684
                                        txt += _("To create a repository, use "
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   685
                                            "the pkgrepo command.")
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   686
                                        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
   687
                                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
   688
                                        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
   689
                                        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
   690
                                            "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
   691
                                            "'%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
   692
                                            "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
   693
                                            "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
   694
                                            "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
   695
                                            "one.") % target
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   696
                                        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
   697
                                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
   698
                                        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
   699
                else:
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   700
                        basedir = target = os.path.abspath(target)
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   701
                        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
   702
                                try:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   703
                                        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
   704
                                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
   705
                                        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
   706
                                            "'%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
   707
                                        abort()
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   708
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   709
                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
   710
                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
   711
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   712
                if republish:
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   713
                        targ_cat = fetch_catalog(targ_pub, tracker,
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   714
                            dest_xport)
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   715
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   716
                matches = get_matches(src_pub, tracker, xport, pargs,
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   717
                    any_unmatched, any_matched, all_versions, all_timestamps,
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   718
                    recursive)
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   719
                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
   720
                        # 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
   721
                        continue
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   722
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   723
                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
   724
                        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
   725
                        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
   726
                            (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
   727
                            urllib.quote(str(pfmri), ""))
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   728
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   729
                # 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
   730
                # sizes.
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   731
                npkgs = len(matches)
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   732
                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
   733
                send_bytes = 0
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   734
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   735
                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
   736
                        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
   737
                            npkgs)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   738
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   739
                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
   740
                retrieve_list = []
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   741
                while matches:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   742
                        f = matches.pop()
2057
874a83b3e8d1 10390 make pkgrecv gracefully handle existing packages in destination
johansen <johansen@opensolaris.org>
parents: 2054
diff changeset
   743
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   744
                        if republish and targ_cat.get_entry(f):
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   745
                                continue
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   746
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   747
                        m = get_manifest(f, xport_cfg)
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   748
                        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
   749
                        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
   750
                            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
   751
         
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   752
                        getb, getf, sendb, sendcb = add_hashes_to_multi(m,
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   753
                            mfile)
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   754
                        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
   755
                        if republish:
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   756
                                # For now, normal republication always uses
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   757
                                # uncompressed data as already compressed data
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   758
                                # is not supported for publication.
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   759
                                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
   760
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   761
                        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
   762
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   763
                        tracker.evaluate_progress(fmri=f)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   764
                tracker.evaluate_done()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   765
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   766
                # 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
   767
                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
   768
                    send_bytes)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   769
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   770
                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
   771
                        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
   772
                        cleanup()
2057
874a83b3e8d1 10390 make pkgrecv gracefully handle existing packages in destination
johansen <johansen@opensolaris.org>
parents: 2054
diff changeset
   773
                        continue
874a83b3e8d1 10390 make pkgrecv gracefully handle existing packages in destination
johansen <johansen@opensolaris.org>
parents: 2054
diff changeset
   774
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   775
                processed = 0
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   776
                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
   777
                        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
   778
                        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
   779
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   780
                        if mfile:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   781
                                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
   782
                                mfile.wait_files()
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   783
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   784
                        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
   785
                                # 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
   786
                                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
   787
                                continue
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   788
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   789
                        m = get_manifest(f, xport_cfg)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   790
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   791
                        # 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
   792
                        # 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
   793
                        use_scheme = True
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   794
                        contents = get_manifest(f, xport_cfg, contents=True)
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   795
                        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
   796
                                use_scheme = False
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   797
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   798
                        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
   799
                        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
   800
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   801
                        # 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
   802
                        # 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
   803
                        trans_id = get_basename(f)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   804
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   805
                        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
   806
                                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
   807
                                    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
   808
                                    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
   809
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   810
                        try:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   811
                                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
   812
                                    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
   813
                                    pub=targ_pub, progtrack=tracker)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   814
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   815
                                # 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
   816
                                # 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
   817
                                try:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   818
                                        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
   819
                                except:
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   820
                                        # 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
   821
                                        pass
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   822
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   823
                                t.open()
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   824
                                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
   825
                                        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
   826
                                            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
   827
                                            "pkg.fmri"):
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   828
                                                # 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
   829
                                                # 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
   830
                                                # 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
   831
                                                continue
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   832
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   833
                                        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
   834
                                                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
   835
                                                    a.hash)
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   836
                                                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
   837
                                                    "rb")
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   838
                                        t.add(a)
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   839
                                        if a.name == "signature":
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   840
                                                for f in a.get_chain_certs():
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   841
                                                        fname = os.path.join(
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   842
                                                            pkgdir, f)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   843
                                                        t.add_file(fname)
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   844
                                # 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
   845
                                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
   846
                        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
   847
                                abort(err=e)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   848
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   849
                        # 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
   850
                        # republish to conserve space.
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   851
                        try:
2115
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   852
                                shutil.rmtree(dest_xport_cfg.incoming_root)
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   853
                                shutil.rmtree(pkgdir)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   854
                                if cache_dir in tmpdirs:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   855
                                        # If cache_dir is listed in tmpdirs,
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   856
                                        # then it's safe to dump cache contents.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   857
                                        # Otherwise, it's a user cache directory
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   858
                                        # and shouldn't be dumped.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   859
                                        shutil.rmtree(cache_dir)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   860
                                        misc.makedirs(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
   861
                        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
   862
                                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
   863
                        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
   864
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   865
                        processed += 1
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   866
                        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
   867
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   868
                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
   869
                tracker.reset()
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   870
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   871
                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
   872
                        # 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
   873
                        # the catalog.
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   874
                        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
   875
                        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
   876
c6a812ab117a 16818 pkgrecv -d should publish per-package, not in one lump
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
   877
                # 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
   878
                targ_pub = None
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   879
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   880
        # Check processed patterns and abort with failure if some were
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   881
        # unmatched.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   882
        check_processed(any_matched, any_unmatched, total_processed)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   883
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   884
        # Dump all temporary data.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   885
        cleanup()
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   886
        return 0
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   887
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   888
if __name__ == "__main__":
1715
8f305f0a6864 8265 EINVAL on rmdir running "make test"
Dan Price <dp@eng.sun.com>
parents: 1600
diff changeset
   889
8f305f0a6864 8265 EINVAL on rmdir running "make test"
Dan Price <dp@eng.sun.com>
parents: 1600
diff changeset
   890
        # Make all warnings be errors.
8f305f0a6864 8265 EINVAL on rmdir running "make test"
Dan Price <dp@eng.sun.com>
parents: 1600
diff changeset
   891
        warnings.simplefilter('error')
8f305f0a6864 8265 EINVAL on rmdir running "make test"
Dan Price <dp@eng.sun.com>
parents: 1600
diff changeset
   892
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   893
        try:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   894
                __ret = main_func()
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   895
        except (KeyboardInterrupt, apx.CanceledException):
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   896
                try:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   897
                        cleanup(True)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   898
                except:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   899
                        __ret = 99
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   900
                else:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   901
                        __ret = 1
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   902
        except (pkg.actions.ActionError, trans.TransactionError, RuntimeError,
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   903
            apx.ApiException), _e:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   904
                error(_e)
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   905
                try:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   906
                        cleanup(True)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   907
                except:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   908
                        __ret = 99
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   909
                else:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   910
                        __ret = 1
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   911
        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
   912
                # 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
   913
                # possible further broken pipe (EPIPE) errors.
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   914
                try:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   915
                        cleanup(False)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   916
                except:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   917
                        __ret = 99
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   918
                else:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   919
                        __ret = 1
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   920
        except SystemExit, _e:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   921
                try:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   922
                        cleanup(False)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   923
                except:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   924
                        __ret = 99
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   925
                raise _e
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   926
        except EnvironmentError, _e:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   927
                if _e.errno != errno.ENOSPC and _e.errno != errno.EDQUOT:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   928
                        raise
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   929
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   930
                txt = "\n"
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   931
                if _e.errno == errno.EDQUOT:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   932
                        txt += _("Storage space quota exceeded.")
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   933
                else:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   934
                        txt += _("No storage space left.")
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   935
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   936
                tdirs = [temp_root]
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   937
                if cache_dir not in tmpdirs:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   938
                        # Only include in message if user specified.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   939
                        tdirs.append(cache_dir)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   940
                if target and target.startswith("file://"):
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   941
                        tdirs.append(target)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   942
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   943
                txt += "\n"
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   944
                error(txt + _("Please verify that the filesystem containing "
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   945
                   "the following directories has enough space available:\n"
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   946
                   "%s") % "\n".join(tdirs))
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   947
                __ret = 1
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   948
        except:
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   949
                traceback.print_exc()
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   950
                error(misc.get_traceback_message())
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   951
                __ret = 99
2546
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   952
                # Cleanup must be called *after* error messaging so that
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   953
                # exceptions processed during cleanup don't cause the wrong
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   954
                # traceback to be printed.
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   955
                try:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   956
                        cleanup(True)
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   957
                except:
2b1fa6a54b5e Apply Shawn Walker's backport - breaking some branding
Jon Tibble <meths@btinternet.com>
parents: 2116
diff changeset
   958
                        pass
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   959
        sys.exit(__ret)