src/pull.py
author Brock Pytlik <bpytlik@sun.com>
Mon, 16 Aug 2010 16:48:50 -0700
changeset 2026 d1b30615bc99
parent 1977 1e2b423ee045
child 2028 b2c674e6ee28
permissions -rwxr-xr-x
9196 pkg(5) should have support for cryptographic manifest signatures 11611 pkg5 should provide for hash validation on manifests 16654 Expose ability to upload by file path
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1516
8c950a3b4171 10485 move pkg(5) to Python 2.6
Rich Burridge <rich.burridge@sun.com>
parents: 1507
diff changeset
     1
#!/usr/bin/python2.6
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
     2
#
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
     3
# CDDL HEADER START
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
     4
#
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
     5
# The contents of this file are subject to the terms of the
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
     6
# Common Development and Distribution License (the "License").
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
     7
# You may not use this file except in compliance with the License.
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
     8
#
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
     9
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    10
# or http://www.opensolaris.org/os/licensing.
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    11
# See the License for the specific language governing permissions
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    12
# and limitations under the License.
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    13
#
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    14
# When distributing Covered Code, include this CDDL HEADER in each
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    15
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    16
# If applicable, add the following below this CDDL HEADER, with the
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    17
# fields enclosed by brackets "[]" replaced with your own identifying
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    18
# information: Portions Copyright [yyyy] [name of copyright owner]
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    19
#
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    20
# CDDL HEADER END
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    21
#
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    22
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    23
#
1946
8ef3acf32d54 16132 various bits of pkg specify non-existent domains to gettext.install
Richard Lowe <richlowe@richlowe.net>
parents: 1732
diff changeset
    24
# Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    25
#
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    26
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    27
import calendar
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    28
import getopt
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    29
import gettext
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    30
import os
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    31
import shutil
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    32
import sys
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    33
import tempfile
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    34
import traceback
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    35
import urllib
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    36
import urlparse
1715
8f305f0a6864 8265 EINVAL on rmdir running "make test"
Dan Price <dp@eng.sun.com>
parents: 1600
diff changeset
    37
import warnings
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    38
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
    39
import pkg.catalog as catalog
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    40
import pkg.client.progress as progress
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents: 1946
diff changeset
    41
import pkg.config as cfg
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    42
import pkg.fmri
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    43
import pkg.manifest as manifest
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
    44
import pkg.client.api_errors as api_errors
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
    45
import pkg.client.publisher as publisher
1977
1e2b423ee045 16565 transport module init exposes latent bug in packagemanager
johansen <johansen@opensolaris.org>
parents: 1974
diff changeset
    46
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
    47
import pkg.misc as misc
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    48
import pkg.publish.transaction as trans
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
    49
import pkg.search_errors as search_errors
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
    50
import pkg.server.repository as sr
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    51
import pkg.version as version
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    52
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
    53
from pkg.client import global_settings
2026
d1b30615bc99 9196 pkg(5) should have support for cryptographic manifest signatures
Brock Pytlik <bpytlik@sun.com>
parents: 1977
diff changeset
    54
from pkg.misc import (config_temp_root, emsg, get_pkg_otw_size, msg, PipeError)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    55
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    56
# Globals
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
    57
cache_dir = None
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    58
complete_catalog = None
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
    59
download_start = False
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    60
repo_cache = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    61
tmpdirs = []
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
    62
temp_root = None
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
    63
xport = None
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
    64
xport_cfg = 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:
1732
05e756645b7f 8432 document proxy environment variables
Stephen Hahn <sch@sun.com>
parents: 1715
diff changeset
    91
        pkgrecv [-s src_repo_uri] [-d (path|dest_uri)] [-kr] [-m match]
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    92
            (fmri|pattern) ...
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    93
        pkgrecv [-s src_repo_uri] -n
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    94
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    95
Options:
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
    96
        -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
    97
                        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
    98
                        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
    99
                        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
   100
                        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
   101
                        option to resume the download.
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   102
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   103
        -d path_or_uri  The path of a directory to save the retrieved package
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   104
                        to, or the URI of a repository to republish it to.  If
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   105
                        not provided, the default value is the current working
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   106
                        directory.  If a directory path is provided, then
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   107
                        package content will only be retrieved if it does not
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   108
                        already exist in the target directory.  If a repository
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   109
                        URI is provided, a temporary directory will be created
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   110
                        and all of the package data retrieved before attempting
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   111
                        to republish it.
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.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   114
        -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
   115
                        when republishing.  Should not be used with pkgsend.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   116
        -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
   117
                            all-timestamps
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   118
                                includes all matching timestamps, not just
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   119
                                latest (implies all-versions)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   120
                            all-versions
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   121
                                includes all matching versions, not just latest
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   122
        -n              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
   123
                        from the specified repository and exit.  (All other
05e756645b7f 8432 document proxy environment variables
Stephen Hahn <sch@sun.com>
parents: 1715
diff changeset
   124
                        options except -s will be ignored.)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   125
        -r              Recursively evaluates all dependencies for the provided
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   126
                        list of packages and adds them to the list.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   127
        -s src_repo_uri A URI representing the location of a pkg(5)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   128
                        repository to retrieve package data from.
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   129
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   130
Environment:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   131
        PKG_DEST        Destination directory or repository URI
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   132
        PKG_SRC         Source repository URI"""))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   133
        sys.exit(retcode)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   134
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   135
def cleanup(caller_error=False):
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   136
        """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
   137
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   138
        for d in tmpdirs:
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   139
                # 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
   140
                # 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
   141
                # 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
   142
                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
   143
                        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
   144
                            "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
   145
                            "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
   146
                        continue
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   147
                shutil.rmtree(d, True)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   148
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   149
def abort(err=None, retcode=1):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   150
        """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
   151
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   152
        if err:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   153
                # Clear any possible output first.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   154
                msg("")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   155
                error(err)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   156
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   157
        cleanup()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   158
        sys.exit(retcode)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   159
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   160
def get_tracker(quiet=False):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   161
        if quiet:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   162
                progresstracker = progress.QuietProgressTracker()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   163
        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   164
                try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   165
                        progresstracker = \
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   166
                            progress.FancyUNIXProgressTracker()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   167
                except progress.ProgressTrackerException:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   168
                        progresstracker = progress.CommandLineProgressTracker()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   169
        return progresstracker
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   170
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   171
def get_manifest(pfmri, basedir, contents=False):
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   172
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   173
        m = None
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   174
        pkgdir = os.path.join(basedir, pfmri.get_dir_path())
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   175
        mpath = os.path.join(pkgdir, "manifest")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   176
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   177
        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
   178
                m = xport.get_manifest(pfmri)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   179
        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   180
                try:
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   181
                        m = manifest.CachedManifest(pfmri, basedir)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   182
                except:
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   183
                        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
   184
                            "package '%(pfmri)s'") % locals())
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   185
1132
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   186
        if contents:
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   187
                return m.tostr_unsorted()
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   188
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   189
        return m
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   190
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   191
def get_repo(uri):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   192
        if uri in repo_cache:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   193
                return repo_cache[uri]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   194
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   195
        parts = urlparse.urlparse(uri, "file", allow_fragments=0)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   196
        path = urllib.url2pathname(parts[2])
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   197
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   198
        try:
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   199
                repo = sr.Repository(read_only=True, repo_root=path)
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   200
        except EnvironmentError, _e:
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   201
                error("an error occurred while trying to " \
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   202
                    "initialize the repository directory " \
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   203
                    "structures:\n%s" % _e)
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   204
                sys.exit(1)
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   205
        except sr.RepositoryError, _e:
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   206
                error(_e)
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   207
                sys.exit(1)
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents: 1946
diff changeset
   208
        except cfg.ConfigError, _e:
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   209
                error("repository configuration error: %s" % _e)
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   210
                sys.exit(1)
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   211
        except (search_errors.IndexingException,
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   212
            api_errors.PermissionsException), _e:
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   213
                emsg(str(_e), "INDEX")
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   214
                sys.exit(1)
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   215
        repo_cache[uri] = repo
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   216
        return repo
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   217
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   218
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
   219
        """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
   220
        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
   221
        if isinstance(pfmri, str):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   222
                pfmri = pkg.fmri.PkgFmri(pfmri, "5.11")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   223
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   224
        for f in complete_catalog.get(pfmri.pkg_name, []):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   225
                if not pfmri.version or \
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   226
                    f.version.is_successor(pfmri.version, constraint):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   227
                        return f
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   228
        return
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   229
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   230
def expand_matching_fmris(fmri_list, pfmri_strings):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   231
        """find matching fmris using pattern matching and
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   232
        constraint auto."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   233
        counthash = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   234
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   235
        try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   236
                patterns = [
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   237
                    pkg.fmri.MatchingPkgFmri(s, "5.11")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   238
                    for s in pfmri_strings
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   239
                ]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   240
        except pkg.fmri.FmriError, e:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   241
                abort(err=e)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   242
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   243
        # XXX publisher prefixes have to be stripped for catalog matching
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   244
        # for now; awaits v1 client support, etc.
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   245
        pattern_pubs = {}
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   246
        for f in patterns:
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   247
                if f.publisher:
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   248
                        pattern_pubs[f.get_fmri(anarchy=True)] = f.publisher
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   249
                        f.publisher = None
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   250
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   251
        matches, unmatched = catalog.extract_matching_fmris(fmri_list,
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   252
            patterns=patterns, constraint=version.CONSTRAINT_AUTO,
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   253
            matcher=pkg.fmri.glob_match)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   254
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   255
        if unmatched:
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   256
                match_err = api_errors.InventoryException(**unmatched)
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   257
                emsg(match_err)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   258
                abort()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   259
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   260
        # XXX restore stripped publisher information.
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   261
        for m in matches:
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   262
                pub = pattern_pubs.pop(str(m), None)
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   263
                if pub:
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   264
                        m.publisher = pub
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   265
        return matches
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   266
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   267
def get_dependencies(src_uri, fmri_list, basedir, tracker):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   268
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   269
        old_limit = sys.getrecursionlimit()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   270
        # 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
   271
        sys.setrecursionlimit(3000)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   272
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   273
        s = set()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   274
        for f in fmri_list:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   275
                pfmri = expand_fmri(f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   276
                _get_dependencies(src_uri, s, pfmri, basedir, tracker)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   277
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   278
        # Restore the previous default.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   279
        sys.setrecursionlimit(old_limit)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   280
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   281
        return list(s)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   282
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   283
def _get_dependencies(src_uri, s, pfmri, basedir, tracker):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   284
        """Expand all dependencies."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   285
        tracker.evaluate_progress(fmri=pfmri)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   286
        s.add(pfmri)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   287
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   288
        m = get_manifest(pfmri, basedir)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   289
        for a in m.gen_actions_by_type("depend"):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   290
                new_fmri = expand_fmri(a.attrs["fmri"])
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   291
                if new_fmri and new_fmri not in s:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   292
                        _get_dependencies(src_uri, s, new_fmri, basedir,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   293
                            tracker)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   294
        return s
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   295
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   296
def add_hashes_to_multi(mfst, multi):
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   297
        """Takes a manifest and a multi object. Adds the hashes to the
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   298
        multi object, returns (nfiles, nbytes) tuple."""
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   299
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   300
        nf = 0
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   301
        nb = 0
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   302
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   303
        for atype in ("file", "license"):
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   304
                for a in mfst.gen_actions_by_type(atype):
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   305
                        if a.needsdata(None, None):
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   306
                                multi.add_action(a)
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   307
                                nf += 1
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   308
                                nb += get_pkg_otw_size(a)
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   309
        return nf, nb
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   310
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   311
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
   312
        """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
   313
        parameters."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   314
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   315
        if all_timestamps:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   316
                pass
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   317
        elif all_versions:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   318
                dedup = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   319
                for f in fmri_list:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   320
                        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
   321
                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
   322
        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   323
                dedup = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   324
                for f in fmri_list:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   325
                        dedup.setdefault(f.pkg_name, []).append(f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   326
                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
   327
        return fmri_list
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   328
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   329
def list_newest_fmris(fmri_list):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   330
        """List the provided fmris."""
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   331
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   332
        fm_hash = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   333
        fm_list = []
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   334
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   335
        # Order all fmris by package name
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   336
        for f in sorted(fmri_list):
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   337
                if f.pkg_name in fm_hash:
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   338
                        fm_hash[f.pkg_name].append(f)
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   339
                else:
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   340
                        fm_hash[f.pkg_name] = [ f ]
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   341
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   342
        # sort each fmri list
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   343
        for k in fm_hash.keys():
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   344
                fm_hash[k].sort(reverse = True)
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   345
                l = fm_hash[k]
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   346
                fm_list.append(l[0])
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   347
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   348
        for e in fm_list:
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   349
                msg(e.get_fmri(anarchy=True))
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   350
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   351
def fetch_catalog(src_pub, tracker):
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   352
        """Fetch the catalog from src_uri."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   353
        global complete_catalog
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   354
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   355
        src_uri = src_pub.selected_repository.origins[0].uri
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   356
        tracker.catalog_start(src_uri)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   357
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   358
        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
   359
                # Create a temporary directory for catalog.
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   360
                cat_dir = tempfile.mkdtemp(dir=temp_root)
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   361
                tmpdirs.append(cat_dir)
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   362
                src_pub.meta_root = cat_dir
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   363
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   364
        src_pub.transport = xport
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   365
        src_pub.refresh(True, True)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   366
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   367
        cat = src_pub.catalog
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   368
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   369
        d = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   370
        fmri_list = []
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   371
        for f in cat.fmris():
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   372
                fmri_list.append(f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   373
                d.setdefault(f.pkg_name, [f]).append(f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   374
        for k in d.keys():
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   375
                d[k].sort(reverse=True)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   376
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   377
        complete_catalog = d
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   378
        tracker.catalog_done()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   379
        return fmri_list
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   380
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   381
def main_func():
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   382
        global cache_dir, download_start, xport, xport_cfg
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   383
        all_timestamps = False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   384
        all_versions = False
420
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   385
        keep_compressed = False
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   386
        list_newest = False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   387
        recursive = False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   388
        src_uri = None
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   389
        target = None
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   390
        incoming_dir = None
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   391
        src_pub = None
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   392
        targ_pub = None
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   393
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   394
        temp_root = config_temp_root()
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   395
1946
8ef3acf32d54 16132 various bits of pkg specify non-existent domains to gettext.install
Richard Lowe <richlowe@richlowe.net>
parents: 1732
diff changeset
   396
        gettext.install("pkg", "/usr/share/locale")
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   397
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
   398
        global_settings.client_name = "pkgrecv"
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   399
        target = os.environ.get("PKG_DEST", None)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   400
        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
   401
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   402
        try:
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   403
                opts, pargs = getopt.getopt(sys.argv[1:], "c:d:hkm:nrs:")
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   404
        except getopt.GetoptError, e:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   405
                usage(_("Illegal option -- %s") % e.opt)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   406
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   407
        for opt, arg in opts:
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   408
                if opt == "-c":
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   409
                        cache_dir = arg
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   410
                elif opt == "-d":
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   411
                        target = arg
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   412
                elif opt == "-h":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   413
                        usage(retcode=0)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   414
                elif opt == "-k":
420
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   415
                        keep_compressed = True
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   416
                elif opt == "-n":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   417
                        list_newest = True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   418
                elif opt == "-r":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   419
                        recursive = True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   420
                elif opt == "-s":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   421
                        src_uri = arg
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   422
                elif opt == "-m":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   423
                        if arg == "all-timestamps":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   424
                                all_timestamps = True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   425
                        elif arg == "all-versions":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   426
                                all_versions = True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   427
                        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   428
                                usage(_("Illegal option value -- %s") % arg)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   429
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   430
        if not src_uri:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   431
                usage(_("a source repository must be provided"))
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   432
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   433
        if not cache_dir:
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   434
                cache_dir = tempfile.mkdtemp(dir=temp_root)
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   435
                # 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
   436
                # 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
   437
                tmpdirs.append(cache_dir)
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   438
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   439
        incoming_dir = tempfile.mkdtemp(dir=temp_root)
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   440
        tmpdirs.append(incoming_dir)
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   441
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   442
        # Create transport and transport config
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   443
        xport, xport_cfg = transport.setup_transport()
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   444
        xport_cfg.cached_download_dir = cache_dir
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   445
        xport_cfg.incoming_download_dir = incoming_dir
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   446
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   447
        # Configure src publisher
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   448
        src_pub = transport.setup_publisher(src_uri, "source", xport, xport_cfg,
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   449
            remote_publishers=True)
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   450
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   451
        tracker = get_tracker()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   452
        if list_newest:
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   453
                if pargs or len(pargs) > 0:
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   454
                        usage(_("-n takes no options"))
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   455
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   456
                fmri_list = fetch_catalog(src_pub, tracker)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   457
                list_newest_fmris(fmri_list)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   458
                return 0
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   459
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   460
        if pargs == None or len(pargs) == 0:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   461
                usage(_("must specify at least one pkgfmri"))
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   462
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   463
        defer_refresh = False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   464
        republish = False
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   465
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   466
        if not target:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   467
                target = basedir = os.getcwd()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   468
        elif target.find("://") != -1:
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   469
                basedir = tempfile.mkdtemp(dir=temp_root)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   470
                tmpdirs.append(basedir)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   471
                republish = True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   472
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   473
                targ_pub = transport.setup_publisher(target, "target",
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   474
                    xport, xport_cfg)
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   475
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   476
                # Files have to be decompressed for republishing.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   477
                keep_compressed = False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   478
                if target.startswith("file://"):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   479
                        # For efficiency, and publishing speed, don't update
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   480
                        # indexes until all file publishing is finished.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   481
                        defer_refresh = True
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   482
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   483
                        # Check to see if the repository exists first.
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   484
                        try:
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   485
                                t = trans.Transaction(target, xport=xport,
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   486
                                    pub=targ_pub)
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   487
                        except trans.TransactionRepositoryInvalidError, e:
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   488
                                txt = str(e) + "\n\n"
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   489
                                txt += _("To create a repository, use the "
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   490
                                    "pkgsend command.")
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   491
                                abort(err=txt)
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   492
                        except trans.TransactionRepositoryConfigError, e:
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   493
                                txt = str(e) + "\n\n"
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   494
                                txt += _("The repository configuration for "
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   495
                                    "the repository located at '%s' is not "
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   496
                                    "valid or the specified path does not "
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   497
                                    "exist.  Please correct the configuration "
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   498
                                    "of the repository or create a new "
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   499
                                    "one.") % target
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   500
                                abort(err=txt)
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   501
                        except trans.TransactionError, e:
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   502
                                abort(err=e)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   503
        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   504
                basedir = target
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   505
                if not os.path.exists(basedir):
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   506
                        try:
1507
b956ea23d3a6 11735 pkg history data files should not be executable
Richard Lowe <richlowe@richlowe.net>
parents: 1431
diff changeset
   507
                                os.makedirs(basedir, misc.PKG_DIR_MODE)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   508
                        except:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   509
                                error(_("Unable to create basedir '%s'.") % \
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   510
                                    basedir)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   511
                                return 1
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   512
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   513
        xport_cfg.pkgdir = basedir
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   514
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   515
        all_fmris = fetch_catalog(src_pub, tracker)
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   516
        fmri_arguments = pargs
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   517
        fmri_list = prune(list(set(expand_matching_fmris(all_fmris,
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   518
            fmri_arguments))), all_versions, all_timestamps)
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   519
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   520
        if recursive:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   521
                msg(_("Retrieving manifests for dependency evaluation ..."))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   522
                tracker.evaluate_start()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   523
                fmri_list = prune(get_dependencies(src_uri, fmri_list, basedir,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   524
                    tracker), all_versions, all_timestamps)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   525
                tracker.evaluate_done()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   526
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   527
        def get_basename(pfmri):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   528
                open_time = pfmri.get_timestamp()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   529
                return "%d_%s" % \
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   530
                    (calendar.timegm(open_time.utctimetuple()),
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   531
                    urllib.quote(str(pfmri), ""))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   532
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   533
        # First, retrieve the manifests and calculate package transfer sizes.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   534
        npkgs = len(fmri_list)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   535
        nfiles = 0
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   536
        nbytes = 0
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   537
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   538
        if not recursive:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   539
                msg(_("Retrieving manifests for package evaluation ..."))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   540
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   541
        tracker.evaluate_start(npkgs=npkgs)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   542
        retrieve_list = []
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   543
        while fmri_list:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   544
                f = fmri_list.pop()
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   545
                m = get_manifest(f, basedir)
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   546
                pkgdir = os.path.join(basedir, f.get_dir_path())
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   547
                mfile = xport.multi_file_ni(src_pub, pkgdir,
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   548
                    not keep_compressed, tracker)
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   549
 
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   550
                nf, nb = add_hashes_to_multi(m, mfile)
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   551
                nfiles += nf
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   552
                nbytes += nb
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   553
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   554
                retrieve_list.append((f, mfile))
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   555
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   556
                tracker.evaluate_progress(fmri=f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   557
        tracker.evaluate_done()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   558
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   559
        # Next, retrieve and store the content for each package.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   560
        msg(_("Retrieving package content ..."))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   561
        tracker.download_set_goal(len(retrieve_list), nfiles, nbytes)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   562
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   563
        publish_list = []
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   564
        while retrieve_list:
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   565
                f, mfile = retrieve_list.pop()
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   566
                tracker.download_start_pkg(f.get_fmri(include_scheme=False))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   567
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   568
                if mfile:
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   569
                        mfile.wait_files()
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   570
                        if not download_start:
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   571
                                download_start = True
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   572
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   573
                if republish:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   574
                        publish_list.append(f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   575
                tracker.download_end_pkg()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   576
        tracker.download_done()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   577
        tracker.reset()
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   578
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   579
        # Finally, republish the packages if needed.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   580
        while publish_list:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   581
                f = publish_list.pop()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   582
                msg(_("Republishing %s ...") % f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   583
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   584
                m = get_manifest(f, basedir)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   585
1132
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   586
                # Get first line of original manifest so that inclusion of the
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   587
                # scheme can be determined.
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   588
                use_scheme = True
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   589
                contents = get_manifest(f, basedir, contents=True)
1132
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   590
                if contents.splitlines()[0].find("pkg:/") == -1:
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   591
                        use_scheme = False
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   592
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   593
                pkg_name = f.get_fmri(include_scheme=use_scheme)
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   594
                pkgdir = os.path.join(basedir, f.get_dir_path())
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   595
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   596
                # This is needed so any previous failures for a package
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   597
                # can be aborted.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   598
                trans_id = get_basename(f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   599
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   600
                if not targ_pub:
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   601
                        targ_pub = transport.setup_publisher(target, "target",
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   602
                            xport, xport_cfg)
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   603
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   604
                try:
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   605
                        t = trans.Transaction(target, pkg_name=pkg_name,
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   606
                            trans_id=trans_id, refresh_index=not defer_refresh,
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   607
                            xport=xport, pub=targ_pub)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   608
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   609
                        # Remove any previous failed attempt to
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   610
                        # to republish this package.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   611
                        try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   612
                                t.close(abandon=True)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   613
                        except:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   614
                                # It might not exist already.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   615
                                pass
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   616
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   617
                        t.open()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   618
                        for a in m.gen_actions():
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   619
                                if a.name == "set" and \
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   620
                                    a.attrs.get("name", "") in ("fmri",
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   621
                                    "pkg.fmri"):
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   622
                                        # To be consistent with the server,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   623
                                        # the fmri can't be added to the
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   624
                                        # manifest.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   625
                                        continue
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   626
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   627
                                if hasattr(a, "hash"):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   628
                                        fname = os.path.join(pkgdir,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   629
                                            a.hash)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   630
                                        a.data = lambda: open(fname,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   631
                                            "rb")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   632
                                t.add(a)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   633
                        t.close(refresh_index=not defer_refresh)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   634
                except trans.TransactionError, e:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   635
                        abort(err=e)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   636
                        return 1
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   637
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   638
        # Dump all temporary data.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   639
        cleanup()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   640
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   641
        if republish:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   642
                if defer_refresh:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   643
                        msg(_("Refreshing repository search indices ..."))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   644
                        try:
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   645
                                t = trans.Transaction(target, xport=xport,
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   646
                                    pub=targ_pub)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   647
                                t.refresh_index()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   648
                        except trans.TransactionError, e:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   649
                                error(e)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   650
                                return 1
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   651
        return 0
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   652
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   653
if __name__ == "__main__":
1715
8f305f0a6864 8265 EINVAL on rmdir running "make test"
Dan Price <dp@eng.sun.com>
parents: 1600
diff changeset
   654
8f305f0a6864 8265 EINVAL on rmdir running "make test"
Dan Price <dp@eng.sun.com>
parents: 1600
diff changeset
   655
        # Make all warnings be errors.
8f305f0a6864 8265 EINVAL on rmdir running "make test"
Dan Price <dp@eng.sun.com>
parents: 1600
diff changeset
   656
        warnings.simplefilter('error')
8f305f0a6864 8265 EINVAL on rmdir running "make test"
Dan Price <dp@eng.sun.com>
parents: 1600
diff changeset
   657
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   658
        try:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   659
                __ret = main_func()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   660
        except (pkg.actions.ActionError, trans.TransactionError,
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   661
            RuntimeError, api_errors.TransportError,
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   662
            api_errors.BadRepositoryURI,
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   663
            api_errors.UnsupportedRepositoryURI), _e:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   664
                error(_e)
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   665
                cleanup(True)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   666
                __ret = 1
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   667
        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
   668
                # 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
   669
                # possible further broken pipe (EPIPE) errors.
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   670
                cleanup(False)
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   671
                __ret = 1
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   672
        except (KeyboardInterrupt, api_errors.CanceledException):
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   673
                cleanup(True)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   674
                __ret = 1
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   675
        except SystemExit, _e:
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   676
                cleanup(False)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   677
                raise _e
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   678
        except:
1974
6af683c5bde5 9203 pkgrecv should check for valid destination before beginning download
johansen <johansen@opensolaris.org>
parents: 1968
diff changeset
   679
                cleanup(True)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   680
                traceback.print_exc()
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   681
                error(
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   682
                    _("\n\nThis is an internal error.  Please let the "
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   683
                    "developers know about this\nproblem by filing a bug at "
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   684
                    "http://defect.opensolaris.org and including the\nabove "
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   685
                    "traceback and this message.  The version of pkg(5) is "
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   686
                    "'%s'.") % pkg.VERSION)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   687
                __ret = 99
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   688
        sys.exit(__ret)