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