src/pull.py
author Shawn Walker <srw@sun.com>
Fri, 23 Oct 2009 17:43:37 -0500
changeset 1431 62b6033670e4
parent 1352 5c92c9d342ef
child 1507 b956ea23d3a6
permissions -rwxr-xr-x
10416 server catalog v1 support desired 243 need localized descriptions, other metadata at catalog level 2424 Need to use UTC consistently everywhere 3092 messaging api/framework needed for pkg clients (cli, gui, etc.) 7063 "pkg list -a -s" needs performance improvement 7163 manifests are modified by client before being written to disk 8217 package fmri should be added to manifest during publishing 9061 importer should not refresh indexes 9446 traceback for cfg_cache operations if read-only filesystem 10415 client catalog v1 support desired 11094 Client transport for catalog v1 11523 only permit FMRIs from same publisher for network repositories 11831 server api version incompatible templates can cause traceback 11832 depot needs ability to seed / alter repository configuration 11954 importer shows zero packages processed unless debug enabled 12006 merge utility should have a test suite
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
409
713e20963dc2 2314 shebang lines should use minimum python version
Shawn Walker <swalker@opensolaris.org>
parents: 375
diff changeset
     1
#!/usr/bin/python2.4
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
#
971
67d3507036ab 2422 error/usage message program identification is inconsistent in pkgrecv
Tom Mueller <Tom.Mueller@sun.com>
parents: 856
diff changeset
    24
# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    25
# Use is subject to license terms.
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    26
#
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    27
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    28
import calendar
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    29
import getopt
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    30
import gettext
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    31
import os
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    32
import shutil
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    33
import sys
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    34
import tempfile
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    35
import traceback
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    36
import urllib
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    37
import urlparse
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    38
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
    39
import pkg.catalog as catalog
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    40
import pkg.client.progress as progress
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    41
import pkg.fmri
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    42
import pkg.manifest as manifest
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
    43
import pkg.client.api_errors as api_errors
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    44
import pkg.pkgtarfile as ptf
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    45
import pkg.portable as portable
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    46
import pkg.publish.transaction as trans
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
    47
import pkg.search_errors as search_errors
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
    48
import pkg.server.catalog as sc
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
    49
import pkg.server.repository as sr
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    50
import pkg.server.repositoryconfig as rc
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
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    54
from pkg.misc import (emsg, get_pkg_otw_size, gunzip_from_stream, msg,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    55
    versioned_urlopen, PipeError)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    56
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    57
# Globals
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    58
complete_catalog = None
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    59
repo_cache = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    60
tmpdirs = []
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    61
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    62
def error(text):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    63
        """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
    64
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    65
        # 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
    66
        # it down to a string.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    67
        text = str(text)
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 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
    70
        # *before* the command-name prefix.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    71
        text_nows = text.lstrip()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    72
        ws = text[:len(text) - len(text_nows)]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    73
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    74
        # 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
    75
        # program name on all platforms.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    76
        emsg(ws + "pkgrecv: " + 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
def usage(usage_error=None, retcode=2):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    79
        """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
    80
        error message.  Causes program to exit."""
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    81
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    82
        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
    83
                error(usage_error)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    84
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    85
        msg(_("""\
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
    86
Usage:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    87
        pkgrecv [-s src_repo_uri] [-d (path|dest_uri)] [-k] [-m] [-n] [-r]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    88
            (fmri|pattern) ...
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    89
        pkgrecv [-s src_repo_uri] -n
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    90
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    91
Options:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
    92
        -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
    93
                        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
    94
                        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
    95
                        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
    96
                        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
    97
                        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
    98
                        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
    99
                        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
   100
                        to republish it.
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   101
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   102
        -h              Display this usage message.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   103
        -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
   104
                        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
   105
        -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
   106
                            all-timestamps
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   107
                                includes all matching timestamps, not just
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   108
                                latest (implies all-versions)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   109
                            all-versions
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   110
                                includes all matching versions, not just latest
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   111
        -n              List the most recent versions of the packages available
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   112
                        from the specified repository and exit (all other
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   113
                        options except -s will be ignored).
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   114
        -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
   115
                        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
   116
        -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
   117
                        repository to retrieve package data from.
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   118
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   119
Environment:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   120
        PKG_DEST        Destination directory or repository URI
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   121
        PKG_SRC         Source repository URI"""))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   122
        sys.exit(retcode)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   123
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   124
def cleanup():
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   125
        """To be called at program finish."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   126
        for d in tmpdirs:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   127
                shutil.rmtree(d, True)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   128
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   129
def abort(err=None, retcode=1):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   130
        """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
   131
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   132
        if err:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   133
                # Clear any possible output first.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   134
                msg("")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   135
                error(err)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   136
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   137
        cleanup()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   138
        sys.exit(retcode)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   139
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   140
def get_tracker(quiet=False):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   141
        if quiet:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   142
                progresstracker = progress.QuietProgressTracker()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   143
        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   144
                try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   145
                        progresstracker = \
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   146
                            progress.FancyUNIXProgressTracker()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   147
                except progress.ProgressTrackerException:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   148
                        progresstracker = progress.CommandLineProgressTracker()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   149
        return progresstracker
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   150
1132
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   151
def get_manifest(src_uri, pfmri, basedir, contents=False):
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   152
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   153
        m = None
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   154
        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
   155
        mpath = os.path.join(pkgdir, "manifest")
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
        raw = None
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   158
        overwrite = False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   159
        if not os.path.exists(mpath):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   160
                raw = fetch_manifest(src_uri, pfmri)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   161
                overwrite = True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   162
        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   163
                try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   164
                        raw = file(mpath, "rb").read()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   165
                except:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   166
                        abort(err=_("Unable to load manifest '%s' for package "
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   167
                            " '%s'.") % (mpath, pfmri))
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   168
1132
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   169
        if contents:
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   170
                return raw
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   171
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   172
        try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   173
                m = manifest.CachedManifest(pfmri, basedir, None,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   174
                    contents=raw)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   175
        except:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   176
                abort(err=_("Unable to parse manifest '%s' for package "
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   177
                    "'%s'") % (mpath, pfmri))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   178
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   179
        if overwrite:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   180
                # Overwrite the manifest file so that the on-disk version will
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   181
                # be consistent with the server (due to fmri addition).
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   182
                try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   183
                        f = open(mpath, "wb")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   184
                        f.write(raw)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   185
                        f.close()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   186
                except:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   187
                        abort(err=_("Unable to write manifest '%s' for package "
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   188
                           " '%s'.") % (mpath, pfmri))
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)
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   208
        except rc.PropertyError, _e:
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 fetch_manifest(src_uri, pfmri):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   219
        """Return the manifest data for package-fmri 'fmri' from the repository
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   220
        at 'src_uri'."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   221
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   222
        if src_uri.startswith("file://"):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   223
                try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   224
                        r = get_repo(src_uri)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   225
                        m = file(r.manifest(pfmri), "rb")
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   226
                except (EnvironmentError, sr.RepositoryError), e:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   227
                        abort(err=e)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   228
        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   229
                # Request manifest from repository.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   230
                try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   231
                        m = versioned_urlopen(src_uri, "manifest", [0],
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   232
                            pfmri.get_url_path())[0]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   233
                except Exception, e:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   234
                        abort(err=_("Unable to retrieve manifest %s from "
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   235
                            "%s: %s") % (pfmri.get_url_path(), src_uri, e))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   236
                except:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   237
                        abort()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   238
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   239
        # Read from repository, return to caller.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   240
        try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   241
                mfst_str = m.read()
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   242
        except:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   243
                abort(err=_("Error occurred while reading from: %s") % src_uri)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   244
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   245
        if hasattr(m, "close"):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   246
                m.close()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   247
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   248
        return mfst_str
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   249
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   250
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
   251
        """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
   252
        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
   253
        if isinstance(pfmri, str):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   254
                pfmri = pkg.fmri.PkgFmri(pfmri, "5.11")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   255
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   256
        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
   257
                if not pfmri.version or \
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   258
                    f.version.is_successor(pfmri.version, constraint):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   259
                        return f
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   260
        return
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   261
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   262
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
   263
        """find matching fmris using pattern matching and
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   264
        constraint auto."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   265
        counthash = {}
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
        try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   268
                patterns = [
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   269
                    pkg.fmri.MatchingPkgFmri(s, "5.11")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   270
                    for s in pfmri_strings
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   271
                ]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   272
        except pkg.fmri.FmriError, e:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   273
                abort(err=e)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   274
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   275
        # 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
   276
        # for now; awaits v1 client support, etc.
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   277
        pattern_pubs = {}
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   278
        for f in patterns:
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   279
                if f.publisher:
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   280
                        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
   281
                        f.publisher = None
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   282
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   283
        matches, unmatched = catalog.extract_matching_fmris(fmri_list,
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   284
            patterns=patterns, constraint=version.CONSTRAINT_AUTO,
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   285
            matcher=pkg.fmri.glob_match)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   286
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   287
        if unmatched:
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   288
                match_err = api_errors.InventoryException(**unmatched)
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   289
                emsg(match_err)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   290
                abort()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   291
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   292
        # XXX restore stripped publisher information.
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   293
        for m in matches:
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   294
                pub = pattern_pubs.pop(str(m), None)
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   295
                if pub:
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   296
                        m.publisher = pub
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   297
        return matches
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   298
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   299
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
   300
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   301
        old_limit = sys.getrecursionlimit()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   302
        # 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
   303
        sys.setrecursionlimit(3000)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   304
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   305
        s = set()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   306
        for f in fmri_list:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   307
                pfmri = expand_fmri(f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   308
                _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
   309
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   310
        # Restore the previous default.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   311
        sys.setrecursionlimit(old_limit)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   312
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   313
        return list(s)
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
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
   316
        """Expand all dependencies."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   317
        tracker.evaluate_progress(fmri=pfmri)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   318
        s.add(pfmri)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   319
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   320
        m = get_manifest(src_uri, pfmri, basedir)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   321
        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
   322
                new_fmri = expand_fmri(a.attrs["fmri"])
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   323
                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
   324
                        _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
   325
                            tracker)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   326
        return s
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   327
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   328
def get_hashes_and_sizes(m):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   329
        """Returns a dict of hashes and transfer sizes of actions with content
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   330
        in a manifest."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   331
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   332
        seen_hashes = set()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   333
        def repeated(a):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   334
                if a in seen_hashes:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   335
                        return True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   336
                seen_hashes.add(a)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   337
                return False
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   338
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   339
        cshashes = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   340
        for atype in ("file", "license"):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   341
                for a in m.gen_actions_by_type(atype):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   342
                        if hasattr(a, "hash") and not repeated(a.hash):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   343
                                sz = int(a.attrs.get("pkg.size", 0))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   344
                                csize = int(a.attrs.get("pkg.csize", 0))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   345
                                otw_sz = get_pkg_otw_size(a)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   346
                                cshashes[a.hash] = (sz, csize, otw_sz)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   347
        return cshashes
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   348
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   349
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
   350
        """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
   351
        parameters."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   352
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   353
        if all_timestamps:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   354
                pass
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   355
        elif all_versions:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   356
                dedup = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   357
                for f in fmri_list:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   358
                        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
   359
                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
   360
        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   361
                dedup = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   362
                for f in fmri_list:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   363
                        dedup.setdefault(f.pkg_name, []).append(f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   364
                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
   365
        return fmri_list
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   366
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   367
def fetch_files_byhash(src_uri, cshashes, destdir, keep_compressed, tracker):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   368
        """Given a list of tuples containing content hash, and size and download
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   369
        the content from src_uri into destdir."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   370
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   371
        def valid_file(h):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   372
                # XXX this should check data digest
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   373
                fname = os.path.join(destdir, h)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   374
                if os.path.exists(fname):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   375
                        if keep_compressed:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   376
                                sz = cshashes[h][1]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   377
                        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   378
                                sz = cshashes[h][0]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   379
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   380
                        if sz == 0:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   381
                                return True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   382
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   383
                        try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   384
                                fs = os.stat(fname)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   385
                        except:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   386
                                pass
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   387
                        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   388
                                if fs.st_size == sz:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   389
                                        return True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   390
                return False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   391
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   392
        if src_uri.startswith("file://"):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   393
                try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   394
                        r = get_repo(src_uri)
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   395
                except sr.RepositoryError, e:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   396
                        abort(err=e)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   397
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   398
                for h in cshashes.keys():
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   399
                        dest = os.path.join(destdir, h)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   400
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   401
                        # Check to see if the file already exists first, so the
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   402
                        # user can continue interrupted pkgrecv operations.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   403
                        retrieve = not valid_file(h)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   404
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   405
                        try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   406
                                if retrieve and keep_compressed:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   407
                                        src = r.file(h)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   408
                                        shutil.copy(src, dest)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   409
                                elif retrieve:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   410
                                        src = file(r.file(h), "rb")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   411
                                        outfile = open(dest, "wb")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   412
                                        gunzip_from_stream(src, outfile)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   413
                                        outfile.close()
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   414
                        except (EnvironmentError, sr.RepositoryError), e:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   415
                                try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   416
                                        portable.remove(dest)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   417
                                except:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   418
                                        pass
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   419
                                abort(err=e)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   420
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   421
                        tracker.download_add_progress(1, cshashes[h][2])
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   422
                return
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   423
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   424
        req_dict = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   425
        for i, k in enumerate(cshashes.keys()):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   426
                # Check to see if the file already exists first, so the user can
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   427
                # continue interrupted pkgrecv operations.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   428
                if valid_file(k):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   429
                        tracker.download_add_progress(1, cshashes[k][2])
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   430
                        continue
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   431
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   432
                entry = "File-Name-%s" % i
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   433
                req_dict[entry] = k
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   434
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   435
        req_str = urllib.urlencode(req_dict)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   436
        if not req_str:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   437
                # Nothing to retrieve.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   438
                return
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   439
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   440
        tmpdir = tempfile.mkdtemp()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   441
        tmpdirs.append(tmpdir)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   442
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   443
        try:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   444
                f = versioned_urlopen(src_uri, "filelist", [0],
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   445
                    data=req_str)[0]
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   446
        except:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   447
                abort(err=_("Unable to retrieve content from: %s") % src_uri)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   448
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   449
        tar_stream = ptf.PkgTarFile.open(mode = "r|", fileobj = f)
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   450
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   451
        for info in tar_stream:
420
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   452
                gzfobj = None
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   453
                try:
420
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   454
                        if not keep_compressed:
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   455
                                # Uncompress as we retrieve the files
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   456
                                gzfobj = tar_stream.extractfile(info)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   457
                                fpath = os.path.join(tmpdir,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   458
                                    info.name)
420
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   459
                                outfile = open(fpath, "wb")
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   460
                                gunzip_from_stream(gzfobj, outfile)
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   461
                                outfile.close()
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   462
                                gzfobj.close()
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   463
                        else:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   464
                                # We want to keep the files compressed
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   465
                                # on disk.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   466
                                tar_stream.extract_to(info, tmpdir,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   467
                                    info.name)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   468
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   469
                        # Copy the file into place (rename can cause a cross-
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   470
                        # link device failure) and then remove the original.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   471
                        src = os.path.join(tmpdir, info.name)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   472
                        shutil.copy(src, os.path.join(destdir, info.name))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   473
                        portable.remove(src)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   474
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   475
                        tracker.download_add_progress(1, cshashes[info.name][2])
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   476
                except KeyboardInterrupt:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   477
                        raise
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   478
                except:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   479
                        abort(err=_("Unable to extract file: %s") % info.name)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   480
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   481
        shutil.rmtree(tmpdirs.pop(), True)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   482
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   483
        tar_stream.close()
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   484
        f.close()
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   485
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   486
def list_newest_fmris(fmri_list):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   487
        """List the provided fmris."""
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   488
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   489
        fm_hash = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   490
        fm_list = []
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   491
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   492
        # Order all fmris by package name
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   493
        for f in sorted(fmri_list):
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   494
                if f.pkg_name in fm_hash:
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   495
                        fm_hash[f.pkg_name].append(f)
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   496
                else:
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   497
                        fm_hash[f.pkg_name] = [ f ]
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   498
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   499
        # sort each fmri list
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   500
        for k in fm_hash.keys():
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   501
                fm_hash[k].sort(reverse = True)
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   502
                l = fm_hash[k]
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   503
                fm_list.append(l[0])
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   504
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   505
        for e in fm_list:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   506
                msg(e)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   507
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   508
def fetch_catalog(src_uri, tracker):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   509
        """Fetch the catalog from src_uri."""
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   510
        global complete_catalog
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   511
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   512
        tracker.catalog_start(src_uri)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   513
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   514
        if src_uri.startswith("file://"):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   515
                try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   516
                        r = get_repo(src_uri)
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   517
                        c = r.catalog_0()
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   518
                except sr.RepositoryError, e:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   519
                        error(e)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   520
                        abort()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   521
        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   522
                # open connection for catalog
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   523
                try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   524
                        c = versioned_urlopen(src_uri, "catalog", [0])[0]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   525
                except:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   526
                        abort(err=_("Unable to download catalog from: %s") % \
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   527
                            src_uri)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   528
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   529
        # Create a temporary directory for catalog.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   530
        cat_dir = tempfile.mkdtemp()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   531
        tmpdirs.append(cat_dir)
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
        # Call catalog.recv to retrieve catalog.
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   534
        try:
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   535
                sc.ServerCatalog.recv(c, cat_dir)
1352
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1132
diff changeset
   536
        except Exception, e:
5c92c9d342ef 11065 client v1 catalog support for v0 catalogs
Shawn Walker <srw@sun.com>
parents: 1132
diff changeset
   537
                abort(err=_("Error: %s while reading from: %s") % (e, src_uri))
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   538
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   539
        if hasattr(c, "close"):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   540
                c.close()
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   541
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   542
        cat = sc.ServerCatalog(cat_dir, read_only=True)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   543
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   544
        d = {}
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   545
        fmri_list = []
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   546
        for f in cat.fmris():
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   547
                fmri_list.append(f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   548
                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
   549
        for k in d.keys():
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   550
                d[k].sort(reverse=True)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   551
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   552
        complete_catalog = d
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   553
        tracker.catalog_done()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   554
        return fmri_list
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   555
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   556
def main_func():
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   557
        all_timestamps = False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   558
        all_versions = False
420
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   559
        keep_compressed = False
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   560
        list_newest = False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   561
        recursive = False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   562
        src_uri = None
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   563
        target = None
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   564
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   565
        # XXX /usr/lib/locale is OpenSolaris-specific.
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   566
        gettext.install("pkgrecv", "/usr/lib/locale")
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   567
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
   568
        global_settings.client_name = "pkgrecv"
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   569
        target = os.environ.get("PKG_DEST", None)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   570
        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
   571
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   572
        try:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   573
                opts, pargs = getopt.getopt(sys.argv[1:], "d:hkm:nrs:")
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   574
        except getopt.GetoptError, e:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   575
                usage(_("Illegal option -- %s") % e.opt)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   576
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   577
        for opt, arg in opts:
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   578
                if opt == "-d":
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   579
                        target = arg
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   580
                elif opt == "-h":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   581
                        usage(retcode=0)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   582
                elif opt == "-k":
420
0b6ecdba5641 2272 pkgrecv should uncompress by default
Brad Hall <bhall@eng.sun.com>
parents: 409
diff changeset
   583
                        keep_compressed = True
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   584
                elif opt == "-n":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   585
                        list_newest = True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   586
                elif opt == "-r":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   587
                        recursive = True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   588
                elif opt == "-s":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   589
                        src_uri = arg
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   590
                elif opt == "-m":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   591
                        if arg == "all-timestamps":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   592
                                all_timestamps = True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   593
                        elif arg == "all-versions":
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   594
                                all_versions = True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   595
                        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   596
                                usage(_("Illegal option value -- %s") % arg)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   597
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   598
        if not src_uri:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   599
                usage(_("a source repository must be provided"))
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   600
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   601
        tracker = get_tracker()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   602
        if list_newest:
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   603
                if pargs or len(pargs) > 0:
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   604
                        usage(_("-n takes no options"))
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   605
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   606
                fmri_list = fetch_catalog(src_uri, tracker)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   607
                list_newest_fmris(fmri_list)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   608
                return 0
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   609
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   610
        if pargs == None or len(pargs) == 0:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   611
                usage(_("must specify at least one pkgfmri"))
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   612
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   613
        defer_refresh = False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   614
        republish = False
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   615
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   616
        if not target:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   617
                target = basedir = os.getcwd()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   618
        elif target.find("://") != -1:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   619
                basedir = tempfile.mkdtemp()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   620
                tmpdirs.append(basedir)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   621
                republish = True
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   622
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   623
                # Files have to be decompressed for republishing.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   624
                keep_compressed = False
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   625
                if target.startswith("file://"):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   626
                        # 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
   627
                        # indexes until all file publishing is finished.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   628
                        defer_refresh = True
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   629
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   630
                        # Check to see if the repository exists first.
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   631
                        try:
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   632
                                t = trans.Transaction(target)
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   633
                        except trans.TransactionRepositoryInvalidError, e:
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   634
                                txt = str(e) + "\n\n"
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   635
                                txt += _("To create a repository, use the "
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   636
                                    "pkgsend command.")
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   637
                                abort(err=msg)
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   638
                        except trans.TransactionRepositoryConfigError, e:
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   639
                                txt = str(e) + "\n\n"
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   640
                                txt += _("The repository configuration for "
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   641
                                    "the repository located at '%s' is not "
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   642
                                    "valid or the specified path does not "
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   643
                                    "exist.  Please correct the configuration "
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   644
                                    "of the repository or create a new "
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   645
                                    "one.") % target
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   646
                                abort(err=txt)
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   647
                        except trans.TransactionError, e:
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   648
                                abort(err=e)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   649
        else:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   650
                basedir = target
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   651
                if not os.path.exists(basedir):
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   652
                        try:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   653
                                os.makedirs(basedir, 0755)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   654
                        except:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   655
                                error(_("Unable to create basedir '%s'.") % \
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   656
                                    basedir)
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   657
                                return 1
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   658
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   659
        all_fmris = fetch_catalog(src_uri, tracker)
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   660
        fmri_arguments = pargs
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   661
        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
   662
            fmri_arguments))), all_versions, all_timestamps)
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   663
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   664
        if recursive:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   665
                msg(_("Retrieving manifests for dependency evaluation ..."))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   666
                tracker.evaluate_start()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   667
                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
   668
                    tracker), all_versions, all_timestamps)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   669
                tracker.evaluate_done()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   670
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   671
        def get_basename(pfmri):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   672
                open_time = pfmri.get_timestamp()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   673
                return "%d_%s" % \
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   674
                    (calendar.timegm(open_time.utctimetuple()),
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   675
                    urllib.quote(str(pfmri), ""))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   676
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   677
        # 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
   678
        npkgs = len(fmri_list)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   679
        nfiles = 0
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   680
        nbytes = 0
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   681
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   682
        if not recursive:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   683
                msg(_("Retrieving manifests for package evaluation ..."))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   684
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   685
        tracker.evaluate_start(npkgs=npkgs)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   686
        retrieve_list = []
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   687
        while fmri_list:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   688
                f = fmri_list.pop()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   689
                m = get_manifest(src_uri, f, basedir)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   690
                cshashes = get_hashes_and_sizes(m)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   691
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   692
                for entry in cshashes.itervalues():
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   693
                        nfiles += 1
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   694
                        nbytes += entry[2]
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   695
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   696
                retrieve_list.append((f, cshashes))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   697
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   698
                tracker.evaluate_progress(fmri=f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   699
        tracker.evaluate_done()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   700
        tracker.reset()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   701
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   702
        # 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
   703
        msg(_("Retrieving package content ..."))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   704
        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
   705
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   706
        publish_list = []
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   707
        while retrieve_list:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   708
                f, cshashes = retrieve_list.pop()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   709
                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
   710
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   711
                if len(cshashes) > 0:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   712
                        pkgdir = os.path.join(basedir, f.get_dir_path())
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   713
                        fetch_files_byhash(src_uri, cshashes, pkgdir,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   714
                            keep_compressed, tracker)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   715
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   716
                if republish:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   717
                        publish_list.append(f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   718
                tracker.download_end_pkg()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   719
        tracker.download_done()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   720
        tracker.reset()
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   721
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   722
        # Finally, republish the packages if needed.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   723
        while publish_list:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   724
                f = publish_list.pop()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   725
                msg(_("Republishing %s ...") % f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   726
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   727
                m = get_manifest(src_uri, f, basedir)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   728
1132
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   729
                # 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
   730
                # 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
   731
                use_scheme = True
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   732
                contents = get_manifest(src_uri, f, basedir, contents=True)
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   733
                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
   734
                        use_scheme = False
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   735
1abf9cf8f69c 9206 pkgrecv'd packages may not have matching comment in manifest
Shawn Walker <srw@sun.com>
parents: 1118
diff changeset
   736
                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
   737
                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
   738
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   739
                # 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
   740
                # can be aborted.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   741
                trans_id = get_basename(f)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   742
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   743
                try:
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   744
                        t = trans.Transaction(target, pkg_name=pkg_name,
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   745
                            trans_id=trans_id)
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   746
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   747
                        # Remove any previous failed attempt to
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   748
                        # to republish this package.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   749
                        try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   750
                                t.close(abandon=True)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   751
                        except:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   752
                                # It might not exist already.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   753
                                pass
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   754
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   755
                        t.open()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   756
                        for a in m.gen_actions():
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   757
                                if a.name == "set" and \
1431
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   758
                                    a.attrs.get("name", "") in ("fmri",
62b6033670e4 10416 server catalog v1 support desired
Shawn Walker <srw@sun.com>
parents: 1352
diff changeset
   759
                                    "pkg.fmri"):
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   760
                                        # To be consistent with the server,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   761
                                        # 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
   762
                                        # manifest.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   763
                                        continue
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   764
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   765
                                if hasattr(a, "hash"):
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   766
                                        fname = os.path.join(pkgdir,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   767
                                            a.hash)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   768
                                        a.data = lambda: open(fname,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   769
                                            "rb")
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   770
                                t.add(a)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   771
                        t.close(refresh_index=not defer_refresh)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   772
                except trans.TransactionError, e:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   773
                        abort(err=e)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   774
                        return 1
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   775
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   776
        # Dump all temporary data.
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   777
        cleanup()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   778
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   779
        if republish:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   780
                if defer_refresh:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   781
                        msg(_("Refreshing repository search indices ..."))
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   782
                        try:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   783
                                t = trans.Transaction(target)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   784
                                t.refresh_index()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   785
                        except trans.TransactionError, e:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   786
                                error(e)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   787
                                return 1
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   788
        return 0
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   789
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   790
if __name__ == "__main__":
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   791
        try:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   792
                __ret = main_func()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   793
        except (pkg.actions.ActionError, trans.TransactionError,
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   794
            RuntimeError), _e:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   795
                error(_e)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   796
                cleanup()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   797
                __ret = 1
440
cbd8cd1564a9 2104 pkgrecv: Spurious error message while downloading package with no files
Brad Hall <bhall@eng.sun.com>
parents: 420
diff changeset
   798
        except (PipeError, KeyboardInterrupt):
cbd8cd1564a9 2104 pkgrecv: Spurious error message while downloading package with no files
Brad Hall <bhall@eng.sun.com>
parents: 420
diff changeset
   799
                # 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
   800
                # possible further broken pipe (EPIPE) errors.
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   801
                cleanup()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   802
                __ret = 1
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   803
        except SystemExit, _e:
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   804
                cleanup()
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   805
                raise _e
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   806
        except:
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   807
                cleanup()
375
fa5286b09191 1773 Want tool to obtain contents of packages
johansen <johansen@sun.com>
parents:
diff changeset
   808
                traceback.print_exc()
1118
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   809
                error(
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   810
                    _("\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
   811
                    "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
   812
                    "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
   813
                    "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
   814
                    "'%s'.") % pkg.VERSION)
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   815
                __ret = 99
f2dd69165173 6342 pkgrecv should support local disk repository
Shawn Walker <srw@sun.com>
parents: 1063
diff changeset
   816
        sys.exit(__ret)