src/pkgrepo.py
author Edward Pilatowicz <edward.pilatowicz@oracle.com>
Mon, 16 Sep 2013 21:26:31 -0700
changeset 2945 24196b483cc6
parent 2864 96d3957712da
child 2938 1d287dc7a674
child 2958 868e07939116
permissions -rwxr-xr-x
17461187 packagemanager displays unexpected error message
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
     1
#!/usr/bin/python2.6
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
     2
#
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
     3
# CDDL HEADER START
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
     4
#
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
     5
# The contents of this file are subject to the terms of the
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
     6
# Common Development and Distribution License (the "License").
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
     7
# You may not use this file except in compliance with the License.
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
     8
#
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
     9
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    10
# or http://www.opensolaris.org/os/licensing.
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    11
# See the License for the specific language governing permissions
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    12
# and limitations under the License.
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    13
#
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    14
# When distributing Covered Code, include this CDDL HEADER in each
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    15
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    16
# If applicable, add the following below this CDDL HEADER, with the
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    17
# fields enclosed by brackets "[]" replaced with your own identifying
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    18
# information: Portions Copyright [yyyy] [name of copyright owner]
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    19
#
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    20
# CDDL HEADER END
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    21
#
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    22
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    23
#
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
    24
# Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    25
#
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    26
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    27
PKG_CLIENT_NAME = "pkgrepo"
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    28
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    29
# pkgrepo exit codes
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    30
EXIT_OK      = 0
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    31
EXIT_OOPS    = 1
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    32
EXIT_BADOPT  = 2
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    33
EXIT_PARTIAL = 3
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    34
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    35
# listing constants
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
    36
LISTING_FORMATS = ("json", "json-formatted", "tsv")
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    37
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
    38
# globals
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
    39
tmpdirs = []
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
    40
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
    41
import atexit
2301
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
    42
import collections
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
    43
import copy
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    44
import errno
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    45
import getopt
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    46
import gettext
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    47
import locale
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    48
import logging
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
    49
import shlex
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
    50
import shutil
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    51
import sys
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
    52
import tempfile
2843
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
    53
import textwrap
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
    54
import traceback
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    55
import warnings
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    56
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    57
from pkg.client import global_settings
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
    58
from pkg.client.debugvalues import DebugValues
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    59
from pkg.misc import msg, PipeError
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    60
import pkg
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
    61
import pkg.catalog
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    62
import pkg.client.api_errors as apx
2616
3c00fe4465d3 19148 PKG_STATE_* defines need a new home
Edward Pilatowicz <edward.pilatowicz@oracle.com>
parents: 2569
diff changeset
    63
import pkg.client.pkgdefs as pkgdefs
2301
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
    64
import pkg.client.progress
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    65
import pkg.client.publisher as publisher
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
    66
import pkg.client.transport.transport as transport
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    67
import pkg.misc as misc
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    68
import pkg.server.repository as sr
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    69
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    70
logger = global_settings.logger
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
    71
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
    72
@atexit.register
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
    73
def cleanup():
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
    74
        """To be called at program finish."""
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
    75
        for d in tmpdirs:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
    76
                shutil.rmtree(d, True)
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    77
2301
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
    78
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    79
def error(text, cmd=None):
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    80
        """Emit an error message prefixed by the command name """
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    81
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    82
        if cmd:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    83
                text = "%s: %s" % (cmd, text)
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    84
                pkg_cmd = "pkgrepo "
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    85
        else:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    86
                pkg_cmd = "pkgrepo: "
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    87
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    88
                # If we get passed something like an Exception, we can convert
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    89
                # it down to a string.
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    90
                text = str(text)
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    91
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    92
        # If the message starts with whitespace, assume that it should come
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    93
        # *before* the command-name prefix.
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    94
        text_nows = text.lstrip()
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    95
        ws = text[:len(text) - len(text_nows)]
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    96
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    97
        # This has to be a constant value as we can't reliably get our actual
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    98
        # program name on all platforms.
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
    99
        logger.error(ws + pkg_cmd + text_nows)
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   100
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   101
2301
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   102
def get_tracker(quiet=False):
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   103
        if quiet:
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   104
                progtrack = pkg.client.progress.QuietProgressTracker()
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   105
        else:
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   106
                try:
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   107
                        progtrack = \
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   108
                            pkg.client.progress.FancyUNIXProgressTracker()
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   109
                except pkg.client.progress.ProgressTrackerException:
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   110
                        progtrack = \
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   111
                            pkg.client.progress.CommandLineProgressTracker()
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   112
        return progtrack
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   113
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   114
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   115
def usage(usage_error=None, cmd=None, retcode=2, full=False):
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   116
        """Emit a usage message and optionally prefix it with a more
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   117
        specific error message.  Causes program to exit.
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   118
        """
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   119
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   120
        if usage_error:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   121
                error(usage_error, cmd=cmd)
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   122
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   123
        if not full:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   124
                # The full usage message isn't desired.
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   125
                logger.error(_("Try `pkgrepo --help or -?' for more "
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   126
                    "information."))
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   127
                sys.exit(retcode)
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   128
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   129
        msg(_("""\
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   130
Usage:
1978
69f2ff97bcd8 16567 pkgrepo help and manpage need to be consistent, and manpage needs publishing
Shawn Walker <shawn.walker@oracle.com>
parents: 1968
diff changeset
   131
        pkgrepo [options] command [cmd_options] [operands]
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   132
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   133
Subcommands:
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   134
     pkgrepo create [--version ver] uri_or_path
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   135
2301
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   136
     pkgrepo add-publisher -s repo_uri_or_path publisher ...
2142
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   137
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   138
     pkgrepo get [-F format] [-p publisher ...] -s repo_uri_or_path 
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   139
         [--key ssl_key ... --cert ssl_cert ...] [section/property ...]
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   140
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   141
     pkgrepo info [-F format] [-H] [-p publisher ...] -s repo_uri_or_path
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   142
         [--key ssl_key ... --cert ssl_cert ...]
1978
69f2ff97bcd8 16567 pkgrepo help and manpage need to be consistent, and manpage needs publishing
Shawn Walker <shawn.walker@oracle.com>
parents: 1968
diff changeset
   143
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   144
     pkgrepo list [-F format] [-H] [-p publisher ...] -s repo_uri_or_path 
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   145
         [--key ssl_key ... --cert ssl_cert ...] [pkg_fmri_pattern ...]
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   146
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   147
     pkgrepo rebuild [-p publisher ...] -s repo_uri_or_path [--key ssl_key ...
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   148
         --cert ssl_cert ...] [--no-catalog] [--no-index]
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   149
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   150
     pkgrepo refresh [-p publisher ...] -s repo_uri_or_path [--key ssl_key ...
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   151
         --cert ssl_cert ...] [--no-catalog] [--no-index]
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   152
2301
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   153
     pkgrepo remove [-n] [-p publisher ...] -s repo_uri_or_path
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   154
         pkg_fmri_pattern ...
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   155
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   156
     pkgrepo set [-p publisher ...] -s repo_uri_or_path
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   157
         section/property[+|-]=[value] ... or
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   158
         section/property[+|-]=([value]) ...
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   159
2843
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   160
     pkgrepo verify [-p publisher ...] -s repo_uri_or_path
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   161
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   162
     pkgrepo fix [-v] [-p publisher ...] -s repo_uri_or_path
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   163
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   164
     pkgrepo help
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   165
     pkgrepo version
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   166
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   167
Options:
1978
69f2ff97bcd8 16567 pkgrepo help and manpage need to be consistent, and manpage needs publishing
Shawn Walker <shawn.walker@oracle.com>
parents: 1968
diff changeset
   168
        --help or -?
69f2ff97bcd8 16567 pkgrepo help and manpage need to be consistent, and manpage needs publishing
Shawn Walker <shawn.walker@oracle.com>
parents: 1968
diff changeset
   169
            Displays a usage message."""))
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   170
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   171
        sys.exit(retcode)
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   172
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   173
class OptionError(Exception):
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   174
        """Option exception. """
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   175
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   176
        def __init__(self, *args):
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   177
                Exception.__init__(self, *args)
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   178
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   179
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   180
def parse_uri(uri):
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   181
        """Parse the repository location provided and attempt to transform it
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   182
        into a valid repository URI.
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   183
        """
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   184
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   185
        return publisher.RepositoryURI(misc.parse_uri(uri))
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   186
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   187
2301
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   188
def subcmd_remove(conf, args):
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   189
        subcommand = "remove"
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   190
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   191
        opts, pargs = getopt.getopt(args, "np:s:")
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   192
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   193
        dry_run = False
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   194
        pubs = set()
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   195
        for opt, arg in opts:
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   196
                if opt == "-n":
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   197
                        dry_run = True
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   198
                elif opt == "-p":
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   199
                        pubs.add(arg)
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   200
                elif opt == "-s":
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   201
                        conf["repo_uri"] = parse_uri(arg)
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   202
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   203
        if not pargs:
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   204
                usage(_("At least one package pattern must be provided."),
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   205
                    cmd=subcommand)
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   206
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   207
        # Get repository object.
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   208
        if not conf.get("repo_uri", None):
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   209
                usage(_("A package repository location must be provided "
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   210
                    "using -s."), cmd=subcommand)
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   211
        repo = get_repo(conf, read_only=False, subcommand=subcommand)
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   212
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   213
        if "all" in pubs:
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   214
                pubs = set()
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   215
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   216
        # Find matching packages.
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   217
        try:
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   218
                matching, refs = repo.get_matching_fmris(pargs, pubs=pubs)
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   219
        except apx.PackageMatchErrors, e:
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   220
                error(str(e), cmd=subcommand)
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   221
                return EXIT_OOPS
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   222
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   223
        if dry_run:
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   224
                # Don't make any changes; display list of packages to be
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   225
                # removed and exit.
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   226
                packages = set(f for m in matching.values() for f in m)
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   227
                count = len(packages)
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   228
                plist = "\n".join("\t%s" % p for p in sorted(packages))
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   229
                logger.info(_("%(count)d package(s) will be removed:\n"
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   230
                    "%(plist)s") % locals())
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   231
                return EXIT_OK
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   232
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   233
        progtrack = get_tracker()
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   234
        packages = collections.defaultdict(list)
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   235
        for m in matching.values():
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   236
                for f in m:
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   237
                        packages[f.publisher].append(f)
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   238
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   239
        for pub in packages:
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   240
                logger.info(_("Removing packages for publisher %s ...") % pub)
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   241
                repo.remove_packages(packages[pub], progtrack=progtrack,
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   242
                    pub=pub)
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   243
                if len(packages) > 1:
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   244
                        # Add a newline between each publisher.
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   245
                        logger.info("")
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   246
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   247
        return EXIT_OK
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   248
d4b6490d2c24 7213 pkgrepo should support package removal
Shawn Walker <shawn.walker@oracle.com>
parents: 2286
diff changeset
   249
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   250
def get_repo(conf, read_only=True, subcommand=None):
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   251
        """Return the repository object for current program configuration."""
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   252
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   253
        repo_uri = conf["repo_uri"]
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   254
        if repo_uri.scheme != "file":
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   255
                usage(_("Network repositories are not currently supported "
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   256
                    "for this operation."), cmd=subcommand)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   257
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   258
        path = repo_uri.get_pathname()
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   259
        if not path:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   260
                # Bad URI?
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   261
                raise sr.RepositoryInvalidError(str(repo_uri))
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   262
        return sr.Repository(read_only=read_only, root=path)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   263
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   264
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   265
def setup_transport(conf, subcommand=None, verbose=False, ssl_key=None,
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   266
    ssl_cert=None):
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   267
        repo_uri = conf.get("repo_uri", None)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   268
        if not repo_uri:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   269
                usage(_("No repository location specified."), cmd=subcommand)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   270
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   271
        temp_root = misc.config_temp_root()
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   272
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   273
        tmp_dir = tempfile.mkdtemp(dir=temp_root)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   274
        tmpdirs.append(tmp_dir)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   275
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   276
        incoming_dir = tempfile.mkdtemp(dir=temp_root)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   277
        tmpdirs.append(incoming_dir)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   278
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   279
        cache_dir = tempfile.mkdtemp(dir=temp_root)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   280
        tmpdirs.append(cache_dir)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   281
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   282
        # Create transport and transport config.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   283
        xport, xport_cfg = transport.setup_transport()
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2028
diff changeset
   284
        xport_cfg.add_cache(cache_dir, readonly=False)
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2028
diff changeset
   285
        xport_cfg.incoming_root = incoming_dir
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   286
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   287
        # Configure target publisher.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   288
        src_pub = transport.setup_publisher(str(repo_uri), "target", xport,
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   289
            xport_cfg, remote_prefix=True, ssl_key=ssl_key, ssl_cert=ssl_cert)
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   290
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   291
        return xport, src_pub, tmp_dir
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   292
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   293
2142
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   294
def subcmd_add_publisher(conf, args):
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   295
        """Add publisher(s) to the specified repository."""
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   296
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   297
        subcommand = "add-publisher"
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   298
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   299
        opts, pargs = getopt.getopt(args, "s:")
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   300
        for opt, arg in opts:
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   301
                if opt == "-s":
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   302
                        conf["repo_uri"] = parse_uri(arg)
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   303
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   304
        repo_uri = conf.get("repo_uri", None)
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   305
        if not repo_uri:
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   306
                usage(_("No repository location specified."), cmd=subcommand)
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   307
        if repo_uri.scheme != "file":
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   308
                usage(_("Network repositories are not currently supported "
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   309
                    "for this operation."), cmd=subcommand)
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   310
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   311
        if not pargs:
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   312
                usage(_("At least one publisher must be specified"),
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   313
                    cmd=subcommand)
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   314
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   315
        abort = False
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   316
        for pfx in pargs:
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   317
                if not misc.valid_pub_prefix(pfx):
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   318
                        error(_("Invalid publisher prefix '%s'") % pfx,
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   319
                            cmd=subcommand)
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   320
                        abort = True
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   321
        if abort:
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   322
                return EXIT_OOPS
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   323
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   324
        repo = get_repo(conf, read_only=False, subcommand=subcommand)
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   325
        make_default = not repo.publishers
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   326
        existing = repo.publishers & set(pargs)
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   327
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   328
        # Elide the publishers that already exist, but retain the order
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   329
        # publishers were specified in.
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   330
        new_pubs = [
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   331
            pfx for pfx in pargs
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   332
            if pfx not in repo.publishers
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   333
        ]
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   334
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   335
        # Tricky logic; _set_pub will happily add new publishers if necessary
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   336
        # and not set any properties if you didn't specify any.
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   337
        rval = _set_pub(conf, subcommand, {}, new_pubs, repo)
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   338
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   339
        if make_default:
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   340
                # No publisher existed previously, so set the default publisher
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   341
                # to be the first new one that was added.
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   342
                _set_repo(conf, subcommand, { "publisher": {
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   343
                    "prefix": new_pubs[0] } }, repo)
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   344
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   345
        if rval == EXIT_OK and existing:
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   346
                # Some of the publishers that were requested for addition
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   347
                # were already known.
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   348
                error(_("specified publisher(s) already exist: %s") %
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   349
                    ", ".join(existing), cmd=subcommand)
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   350
                if new_pubs:
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   351
                        return EXIT_PARTIAL
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   352
                return EXIT_OOPS
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   353
        return rval
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   354
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
   355
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   356
def subcmd_create(conf, args):
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   357
        """Create a package repository at the given location."""
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   358
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   359
        subcommand = "create"
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   360
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   361
        opts, pargs = getopt.getopt(args, "s:", ["version="])
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   362
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   363
        version = None
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   364
        for opt, arg in opts:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   365
                if opt == "-s":
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   366
                        conf["repo_uri"] = parse_uri(arg)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   367
                elif opt == "--version":
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   368
                        # This option is currently private and allows creating a
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   369
                        # repository with a specific format based on version.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   370
                        try:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   371
                                version = int(arg)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   372
                        except ValueError:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   373
                                usage(_("Version must be an integer value."),
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   374
                                    cmd=subcommand)
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   375
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   376
        if len(pargs) > 1:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   377
                usage(_("Only one repository location may be specified."),
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   378
                    cmd=subcommand)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   379
        elif pargs:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   380
                conf["repo_uri"] = parse_uri(pargs[0])
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   381
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   382
        repo_uri = conf.get("repo_uri", None)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   383
        if not repo_uri:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   384
                usage(_("No repository location specified."), cmd=subcommand)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   385
        if repo_uri.scheme != "file":
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   386
                usage(_("Network repositories are not currently supported "
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   387
                    "for this operation."), cmd=subcommand)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   388
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   389
        # Attempt to create a repository at the specified location.  Allow
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   390
        # whatever exceptions are raised to bubble up.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   391
        sr.repository_create(repo_uri, version=version)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   392
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   393
        return EXIT_OK
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   394
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   395
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   396
def subcmd_get(conf, args):
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   397
        """Display repository properties."""
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   398
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   399
        subcommand = "get"
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   400
        omit_headers = False
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   401
        out_format = "default"
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   402
        pubs = set()
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   403
        key = None
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   404
        cert = None
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   405
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   406
        opts, pargs = getopt.getopt(args, "F:Hp:s:", ["key=", "cert="])
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   407
        for opt, arg in opts:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   408
                if opt == "-F":
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   409
                        out_format = arg
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   410
                        if out_format not in LISTING_FORMATS:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   411
                                usage(_("Unrecognized format %(format)s."
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   412
                                    " Supported formats: %(valid)s") % \
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   413
                                    { "format": out_format,
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   414
                                    "valid": LISTING_FORMATS }, cmd=subcommand)
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   415
                                return EXIT_OOPS
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   416
                elif opt == "-H":
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   417
                        omit_headers = True
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   418
                elif opt == "-p":
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   419
                        pubs.add(arg)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   420
                elif opt == "-s":
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   421
                        conf["repo_uri"] = parse_uri(arg)
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   422
                elif opt == "--key":
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   423
                        key = arg
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   424
                elif opt == "--cert":
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   425
                        cert = arg
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   426
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   427
        # Setup transport so configuration can be retrieved.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   428
        if not conf.get("repo_uri", None):
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   429
                usage(_("A package repository location must be provided "
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   430
                    "using -s."), cmd=subcommand)
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   431
        xport, xpub, tmp_dir = setup_transport(conf, subcommand=subcommand,
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   432
            ssl_key=key, ssl_cert=cert)
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   433
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   434
        # Get properties.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   435
        if pubs:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   436
                return _get_pub(conf, subcommand, xport, xpub, omit_headers,
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   437
                    out_format, pubs, pargs)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   438
        return _get_repo(conf, subcommand, xport, xpub, omit_headers,
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   439
            out_format, pargs)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   440
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   441
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   442
def _get_repo(conf, subcommand, xport, xpub, omit_headers, out_format, pargs):
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   443
        """Display repository properties."""
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   444
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   445
        # Configuration index is indexed by section name and property name.
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   446
        # Retrieve and flatten it to simplify listing process.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   447
        stat_idx = xport.get_status(xpub)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   448
        cfg_idx = stat_idx.get("repository", {}).get("configuration", {})
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   449
        props = set()
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   450
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   451
        # Set minimum widths for section and property name columns by using the
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   452
        # length of the column headers.
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   453
        max_sname_len = len(_("SECTION"))
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   454
        max_pname_len = len(_("PROPERTY"))
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   455
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   456
        for sname in cfg_idx:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   457
                max_sname_len = max(max_sname_len, len(sname))
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   458
                for pname in cfg_idx[sname]:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   459
                        max_pname_len = max(max_pname_len, len(pname))
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   460
                        props.add("/".join((sname, pname)))
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   461
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   462
        req_props = set(pargs)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   463
        if len(req_props) >= 1:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   464
                found = props & req_props
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   465
                notfound = req_props - found
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   466
                del props
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   467
        else:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   468
                found = props
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   469
                notfound = set()
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   470
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   471
        def gen_listing():
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   472
                for prop in sorted(found):
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   473
                        sname, pname = prop.rsplit("/", 1)
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   474
                        sval = cfg_idx[sname][pname]
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   475
                        yield {
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   476
                            "section": sname,
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   477
                            "property": pname,
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   478
                            "value": sval,
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   479
                        }
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   480
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   481
        #    SECTION PROPERTY VALUE
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   482
        #    <sec_1> <prop_1> <prop_1_value>
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   483
        #    <sec_2> <prop_2> <prop_2_value>
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   484
        #    ...
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   485
        field_data = {
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   486
            "section" : [("default", "json", "tsv"), _("SECTION"), ""],
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   487
            "property" : [("default", "json", "tsv"), _("PROPERTY"), ""],
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   488
            "value" : [("default", "json", "tsv"), _("VALUE"), ""],
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   489
        }
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   490
        desired_field_order = (_("SECTION"), _("PROPERTY"), _("VALUE"))
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   491
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   492
        # Default output formatting.
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   493
        def_fmt = "%-" + str(max_sname_len) + "s %-" + str(max_pname_len) + \
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   494
            "s %s"
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   495
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   496
        if found or (not req_props and out_format == "default"):
2453
330443795456 18619 link mediation support needed
Shawn Walker <shawn.walker@oracle.com>
parents: 2310
diff changeset
   497
                # print without trailing newline.
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   498
                sys.stdout.write(misc.get_listing(desired_field_order,
2453
330443795456 18619 link mediation support needed
Shawn Walker <shawn.walker@oracle.com>
parents: 2310
diff changeset
   499
                    field_data, gen_listing(), out_format, def_fmt,
330443795456 18619 link mediation support needed
Shawn Walker <shawn.walker@oracle.com>
parents: 2310
diff changeset
   500
                    omit_headers))
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   501
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   502
        if found and notfound:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   503
                return EXIT_PARTIAL
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   504
        if req_props and not found:
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   505
                if out_format == "default":
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   506
                        # Don't pollute other output formats.
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   507
                        error(_("no matching properties found"),
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   508
                            cmd=subcommand)
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   509
                return EXIT_OOPS
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   510
        return EXIT_OK
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   511
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   512
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   513
def _get_matching_pubs(subcommand, pubs, xport, xpub, out_format="default",
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   514
    use_transport=False):
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   515
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   516
        # Retrieve publisher information.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   517
        pub_data = xport.get_publisherdata(xpub)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   518
        known_pubs = set(p.prefix for p in pub_data)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   519
        if len(pubs) > 0 and "all" not in pubs:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   520
                found = known_pubs & pubs
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   521
                notfound = pubs - found
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   522
                pub_data = [p for p in pub_data if p.prefix in found]
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   523
        else:
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   524
                found = known_pubs
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   525
                notfound = set()
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   526
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   527
        if use_transport:
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   528
                # Assign transport information.
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   529
                for p in pub_data:
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   530
                        p.repository = xpub.repository
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   531
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   532
        # Establish initial return value and perform early exit if appropriate.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   533
        rval = EXIT_OK
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   534
        if found and notfound:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   535
                rval = EXIT_PARTIAL
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   536
        elif pubs and not found:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   537
                if out_format == "default":
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   538
                        # Don't pollute other output formats.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   539
                        error(_("no matching publishers found"),
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   540
                            cmd=subcommand)
2132
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   541
                return EXIT_OOPS, None, None
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   542
        return rval, found, pub_data
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   543
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   544
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   545
def _get_pub(conf, subcommand, xport, xpub, omit_headers, out_format, pubs,
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   546
    pargs):
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   547
        """Display publisher properties."""
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   548
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   549
        rval, found, pub_data = _get_matching_pubs(subcommand, pubs, xport,
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   550
            xpub, out_format=out_format)
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   551
        if rval == EXIT_OOPS:
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   552
                return rval
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   553
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   554
        # Set minimum widths for section and property name columns by using the
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   555
        # length of the column headers and data.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   556
        max_pubname_len = str(max(
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   557
            [len(_("PUBLISHER"))] + [len(p) for p in found]
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   558
        ))
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   559
        max_sname_len = len(_("SECTION"))
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   560
        max_pname_len = len(_("PROPERTY"))
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   561
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   562
        # For each requested publisher, retrieve the requested property data.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   563
        pub_idx = {}
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   564
        for pub in pub_data:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   565
                pub_idx[pub.prefix] = {
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   566
                    "publisher": {
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   567
                        "alias": pub.alias,
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   568
                        "prefix": pub.prefix,
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   569
                    },
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   570
                }
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   571
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2301
diff changeset
   572
                pub_repo = pub.repository
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   573
                if pub_repo:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   574
                        pub_idx[pub.prefix]["repository"] = {
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   575
                            "collection-type": pub_repo.collection_type,
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   576
                            "description": pub_repo.description,
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   577
                            "legal-uris": pub_repo.legal_uris,
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   578
                            "mirrors": pub_repo.mirrors,
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   579
                            "name": pub_repo.name,
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   580
                            "origins": pub_repo.origins,
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   581
                            "refresh-seconds": pub_repo.refresh_seconds,
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   582
                            "registration-uri": pub_repo.registration_uri,
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   583
                            "related-uris": pub_repo.related_uris,
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   584
                        }
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   585
                else:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   586
                        pub_idx[pub.prefix]["repository"] = {
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   587
                            "collection-type": "core",
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   588
                            "description": "",
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   589
                            "legal-uris": [],
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   590
                            "mirrors": [],
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   591
                            "name": "",
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   592
                            "origins": [],
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   593
                            "refresh-seconds": "",
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   594
                            "registration-uri": "",
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   595
                            "related-uris": [],
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   596
                        }
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   597
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   598
        # Determine possible set of properties and lengths.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   599
        props = set()
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   600
        for pub in pub_idx:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2028
diff changeset
   601
                for sname in pub_idx[pub]:
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2028
diff changeset
   602
                        max_sname_len = max(max_sname_len, len(sname))
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2028
diff changeset
   603
                        for pname in pub_idx[pub][sname]:
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2028
diff changeset
   604
                                max_pname_len = max(max_pname_len, len(pname))
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2028
diff changeset
   605
                                props.add("/".join((sname, pname)))
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   606
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   607
        # Determine properties to display.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   608
        req_props = set(pargs)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   609
        if len(req_props) >= 1:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   610
                found = props & req_props
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   611
                notfound = req_props - found
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   612
                del props
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   613
        else:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   614
                found = props
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   615
                notfound = set()
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   616
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   617
        def gen_listing():
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   618
                for pub in sorted(pub_idx.keys()):
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   619
                        for prop in sorted(found):
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   620
                                sname, pname = prop.rsplit("/", 1)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   621
                                sval = pub_idx[pub][sname][pname]
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   622
                                yield {
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   623
                                    "publisher": pub,
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   624
                                    "section": sname,
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   625
                                    "property": pname,
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   626
                                    "value": sval,
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   627
                                }
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   628
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   629
        #    PUBLISHER SECTION PROPERTY VALUE
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   630
        #    <pub_1>   <sec_1> <prop_1> <prop_1_value>
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   631
        #    <pub_1>   <sec_2> <prop_2> <prop_2_value>
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   632
        #    ...
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   633
        field_data = {
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   634
            "publisher" : [("default", "json", "tsv"), _("PUBLISHER"), ""],
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   635
            "section" : [("default", "json", "tsv"), _("SECTION"), ""],
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   636
            "property" : [("default", "json", "tsv"), _("PROPERTY"), ""],
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   637
            "value" : [("default", "json", "tsv"), _("VALUE"), ""],
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   638
        }
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   639
        desired_field_order = (_("PUBLISHER"), _("SECTION"), _("PROPERTY"),
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   640
            _("VALUE"))
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   641
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   642
        # Default output formatting.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   643
        def_fmt = "%-" + str(max_pubname_len) + "s %-" + str(max_sname_len) + \
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   644
            "s %-" + str(max_pname_len) + "s %s"
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   645
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   646
        if found or (not req_props and out_format == "default"):
2453
330443795456 18619 link mediation support needed
Shawn Walker <shawn.walker@oracle.com>
parents: 2310
diff changeset
   647
                # print without trailing newline.
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   648
                sys.stdout.write(misc.get_listing(desired_field_order,
2453
330443795456 18619 link mediation support needed
Shawn Walker <shawn.walker@oracle.com>
parents: 2310
diff changeset
   649
                    field_data, gen_listing(), out_format, def_fmt,
330443795456 18619 link mediation support needed
Shawn Walker <shawn.walker@oracle.com>
parents: 2310
diff changeset
   650
                    omit_headers))
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   651
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   652
        if found and notfound:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   653
                rval = EXIT_PARTIAL
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   654
        if req_props and not found:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   655
                if out_format == "default":
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   656
                        # Don't pollute other output formats.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   657
                        error(_("no matching properties found"),
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   658
                            cmd=subcommand)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   659
                rval = EXIT_OOPS
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   660
        return rval
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   661
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   662
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   663
def subcmd_info(conf, args):
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   664
        """Display a list of known publishers and a summary of known packages
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   665
        and when the package data for the given publisher was last updated.
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   666
        """
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   667
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   668
        subcommand = "info"
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   669
        omit_headers = False
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   670
        out_format = "default"
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   671
        pubs = set()
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   672
        key = None
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   673
        cert = None
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   674
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   675
        opts, pargs = getopt.getopt(args, "F:Hp:s:", ["key=", "cert="])
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   676
        for opt, arg in opts:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   677
                if opt == "-F":
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   678
                        if arg not in LISTING_FORMATS:
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   679
                                usage(_("Unrecognized format %(format)s."
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   680
                                    " Supported formats: %(valid)s") % \
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   681
                                    { "format": arg,
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   682
                                    "valid": LISTING_FORMATS }, cmd=subcommand)
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   683
                                return EXIT_OOPS
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   684
                        out_format = arg
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   685
                elif opt == "-H":
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   686
                        omit_headers = True
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   687
                elif opt == "-p":
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   688
                        pubs.add(arg)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   689
                elif opt == "-s":
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   690
                        conf["repo_uri"] = parse_uri(arg)
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   691
                elif opt == "--key":
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   692
                        key = arg
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   693
                elif opt == "--cert":
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   694
                        cert = arg
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   695
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   696
        if pargs:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   697
                usage(_("command does not take operands"), cmd=subcommand)
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   698
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   699
        # Setup transport so status can be retrieved.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   700
        if not conf.get("repo_uri", None):
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   701
                usage(_("A package repository location must be provided "
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   702
                    "using -s."), cmd=subcommand)
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   703
        xport, xpub, tmp_dir = setup_transport(conf, subcommand=subcommand,
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   704
            ssl_key=key, ssl_cert=cert)
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   705
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   706
        # Retrieve repository status information.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   707
        stat_idx = xport.get_status(xpub)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   708
        pub_idx = stat_idx.get("repository", {}).get("publishers", {})
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   709
        if len(pubs) > 0 and "all" not in pubs:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   710
                found = set(pub_idx.keys()) & pubs
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   711
                notfound = pubs - found
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   712
        else:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   713
                found = set(pub_idx.keys())
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   714
                notfound = set()
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   715
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   716
        def gen_listing():
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   717
                for pfx in found:
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   718
                        pdata = pub_idx[pfx]
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   719
                        pkg_count = pdata.get("package-count", 0)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   720
                        last_update = pdata.get("last-catalog-update", "")
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   721
                        if last_update:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   722
                                # Reformat the date into something more user
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   723
                                # friendly (and locale specific).
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   724
                                last_update = pkg.catalog.basic_ts_to_datetime(
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   725
                                    last_update)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   726
                                last_update = "%sZ" % pkg.catalog.datetime_to_ts(
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   727
                                    last_update)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   728
                        rstatus = _(pub_idx[pfx].get("status", "online"))
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   729
                        yield {
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   730
                            "publisher": pfx,
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   731
                            "packages": pkg_count,
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   732
                            "status": rstatus,
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   733
                            "updated": last_update,
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   734
                        }
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   735
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   736
        #    PUBLISHER PACKAGES        STATUS   UPDATED
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   737
        #    <pub_1>   <num_uniq_pkgs> <status> <cat_last_modified>
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   738
        #    <pub_2>   <num_uniq_pkgs> <status> <cat_last_modified>
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   739
        #    ...
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   740
        field_data = {
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   741
            "publisher" : [("default", "json", "tsv"), _("PUBLISHER"), ""],
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   742
            "packages" : [("default", "json", "tsv"), _("PACKAGES"), ""],
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   743
            "status" : [("default", "json", "tsv"), _("STATUS"), ""],
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   744
            "updated" : [("default", "json", "tsv"), _("UPDATED"), ""],
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   745
        }
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   746
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   747
        desired_field_order = (_("PUBLISHER"), "", _("PACKAGES"), _("STATUS"),
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   748
            _("UPDATED"))
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   749
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   750
        # Default output formatting.
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   751
        pub_len = str(max(
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   752
            [len(desired_field_order[0])] + [len(p) for p in found]
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   753
        ))
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   754
        def_fmt = "%-" + pub_len + "s %-8s %-16s %s"
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   755
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   756
        if found or (not pubs and out_format == "default"):
2453
330443795456 18619 link mediation support needed
Shawn Walker <shawn.walker@oracle.com>
parents: 2310
diff changeset
   757
                # print without trailing newline.
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   758
                sys.stdout.write(misc.get_listing(desired_field_order,
2453
330443795456 18619 link mediation support needed
Shawn Walker <shawn.walker@oracle.com>
parents: 2310
diff changeset
   759
                    field_data, gen_listing(), out_format, def_fmt,
330443795456 18619 link mediation support needed
Shawn Walker <shawn.walker@oracle.com>
parents: 2310
diff changeset
   760
                    omit_headers))
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   761
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   762
        if found and notfound:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   763
                return EXIT_PARTIAL
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   764
        if pubs and not found:
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   765
                if out_format == "default":
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   766
                        # Don't pollute other output formats.
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   767
                        error(_("no matching publishers found"),
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   768
                            cmd=subcommand)
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   769
                return EXIT_OOPS
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   770
        return EXIT_OK
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   771
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   772
def subcmd_list(conf, args):
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   773
        """List all packages matching the specified patterns."""
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   774
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   775
        subcommand = "list"
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   776
        omit_headers = False
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   777
        out_format = "default"
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   778
        pubs = set()
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   779
        key = None
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   780
        cert = None
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   781
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   782
        opts, pargs = getopt.getopt(args, "F:Hp:s:", ["key=", "cert="])
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   783
        for opt, arg in opts:
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   784
                if opt == "-F":
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   785
                        out_format = arg
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   786
                        if out_format not in LISTING_FORMATS:
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   787
                                usage(_("Unrecognized format %(format)s."
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   788
                                    " Supported formats: %(valid)s") %
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   789
                                    { "format": out_format,
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   790
                                    "valid": LISTING_FORMATS }, cmd=subcommand)
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   791
                                return EXIT_OOPS
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   792
                elif opt == "-H":
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   793
                        omit_headers = True
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   794
                elif opt == "-p":
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   795
                        pubs.add(arg)
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   796
                elif opt == "-s":
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   797
                        conf["repo_uri"] = parse_uri(arg)
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   798
                elif opt == "--key":
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   799
                        key = arg
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   800
                elif opt == "--cert":
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   801
                        cert = arg
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   802
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   803
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   804
        # Setup transport so configuration can be retrieved.
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   805
        if not conf.get("repo_uri", None):
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   806
                usage(_("A package repository location must be provided "
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   807
                    "using -s."), cmd=subcommand)
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   808
        xport, xpub, tmp_dir = setup_transport(conf, subcommand=subcommand,
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   809
            ssl_key=key, ssl_cert=cert)
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   810
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   811
        rval, found, pub_data = _get_matching_pubs(subcommand, pubs, xport,
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   812
            xpub, out_format=out_format, use_transport=True)
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   813
        if rval == EXIT_OOPS:
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   814
                return rval
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   815
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   816
        temp_root = misc.config_temp_root()
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   817
        progtrack = get_tracker()
2693
cfee571ea6d5 7154388 Progress tracking API and functionality improvements
Dan Price <daniel.price@oracle.com>
parents: 2616
diff changeset
   818
        progtrack.set_purpose(progtrack.PURPOSE_LISTING)
cfee571ea6d5 7154388 Progress tracking API and functionality improvements
Dan Price <daniel.price@oracle.com>
parents: 2616
diff changeset
   819
cfee571ea6d5 7154388 Progress tracking API and functionality improvements
Dan Price <daniel.price@oracle.com>
parents: 2616
diff changeset
   820
        progtrack.refresh_start(pub_cnt=len(pub_data), full_refresh=True,
cfee571ea6d5 7154388 Progress tracking API and functionality improvements
Dan Price <daniel.price@oracle.com>
parents: 2616
diff changeset
   821
            target_catalog=False)
cfee571ea6d5 7154388 Progress tracking API and functionality improvements
Dan Price <daniel.price@oracle.com>
parents: 2616
diff changeset
   822
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   823
        for pub in pub_data:
2693
cfee571ea6d5 7154388 Progress tracking API and functionality improvements
Dan Price <daniel.price@oracle.com>
parents: 2616
diff changeset
   824
                progtrack.refresh_start_pub(pub)
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   825
                meta_root = tempfile.mkdtemp(dir=temp_root)
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   826
                tmpdirs.append(meta_root)
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   827
                pub.meta_root = meta_root
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   828
                pub.transport = xport
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   829
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   830
                try:
2693
cfee571ea6d5 7154388 Progress tracking API and functionality improvements
Dan Price <daniel.price@oracle.com>
parents: 2616
diff changeset
   831
                        pub.refresh(True, True, progtrack=progtrack)
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   832
                except apx.TransportError:
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   833
                        # Assume that a catalog doesn't exist for the target
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   834
                        # publisher and drive on.
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   835
                        pass
2693
cfee571ea6d5 7154388 Progress tracking API and functionality improvements
Dan Price <daniel.price@oracle.com>
parents: 2616
diff changeset
   836
                progtrack.refresh_end_pub(pub)
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   837
2693
cfee571ea6d5 7154388 Progress tracking API and functionality improvements
Dan Price <daniel.price@oracle.com>
parents: 2616
diff changeset
   838
        progtrack.refresh_done()
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   839
        listed = {}
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   840
        matched = set()
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   841
        unmatched = set()
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   842
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   843
        def gen_listing():
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   844
                collect_attrs = out_format.startswith("json")
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   845
                for pub in pub_data:
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   846
                        cat = pub.catalog
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   847
                        for f, states, attrs in cat.gen_packages(
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   848
                            collect_attrs=collect_attrs, matched=matched,
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   849
                            patterns=pargs, pubs=[pub.prefix],
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   850
                            unmatched=unmatched, return_fmris=True):
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   851
                                if not listed:
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   852
                                        listed["packages"] = True
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   853
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   854
                                state = None
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   855
                                if out_format == "default" or \
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   856
                                    out_format == "tsv":
2616
3c00fe4465d3 19148 PKG_STATE_* defines need a new home
Edward Pilatowicz <edward.pilatowicz@oracle.com>
parents: 2569
diff changeset
   857
                                        if pkgdefs.PKG_STATE_OBSOLETE in \
3c00fe4465d3 19148 PKG_STATE_* defines need a new home
Edward Pilatowicz <edward.pilatowicz@oracle.com>
parents: 2569
diff changeset
   858
                                            states:
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   859
                                                state = "o"
2616
3c00fe4465d3 19148 PKG_STATE_* defines need a new home
Edward Pilatowicz <edward.pilatowicz@oracle.com>
parents: 2569
diff changeset
   860
                                        elif pkgdefs.PKG_STATE_RENAMED in \
3c00fe4465d3 19148 PKG_STATE_* defines need a new home
Edward Pilatowicz <edward.pilatowicz@oracle.com>
parents: 2569
diff changeset
   861
                                            states:
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   862
                                                state = "r"
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   863
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   864
                                ret = {
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   865
                                    "publisher": f.publisher,
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   866
                                    "name": f.pkg_name,
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   867
                                    "version": str(f.version),
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   868
                                    "release": str(f.version.release),
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   869
                                    "build-release":
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   870
                                        str(f.version.build_release),
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   871
                                    "branch": str(f.version.branch),
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   872
                                    "timestamp":
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   873
                                        str(f.version.timestr),
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   874
                                    "pkg.fmri": str(f),
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   875
                                    "short_state": state,
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   876
                                }
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   877
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   878
                                for attr in attrs:
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   879
                                        ret[attr] = []
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   880
                                        for mods in attrs[attr]:
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   881
                                                d = dict(mods)
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   882
                                                d["value"] = \
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   883
                                                    attrs[attr][mods]
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   884
                                                ret[attr].append(d)
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   885
                                yield ret
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   886
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   887
                        unmatched.difference_update(matched)
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   888
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   889
        field_data = {
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   890
            "publisher": [("default", "json", "tsv"), _("PUBLISHER"), ""],
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   891
            "name": [("default", "json", "tsv"), _("NAME"), ""],
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   892
            "version": [("default", "json"), _("VERSION"), ""],
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   893
            "release": [("json", "tsv",), _("RELEASE"), ""],
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   894
            "build-release": [("json", "tsv",), _("BUILD RELEASE"), ""],
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   895
            "branch": [("json", "tsv",), _("BRANCH"), ""],
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   896
            "timestamp": [("json", "tsv",), _("PACKAGING DATE"), ""],
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   897
            "pkg.fmri": [("json", "tsv",), _("FMRI"), ""],
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   898
            "short_state": [("default", "tsv"), "O", ""],
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   899
         }
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   900
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   901
        desired_field_order = (_("PUBLISHER"), _("NAME"), "O", _("VERSION"),
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   902
            _("SUMMARY"), _("DESCRIPTION"), _("CATEGORIES"), _("RELEASE"),
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   903
            _("BUILD RELEASE"), _("BRANCH"), _("PACKAGING DATE"), _("FMRI"),
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   904
            _("STATE"))
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   905
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   906
        # Default output formatting.
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   907
        max_pub_name_len = str(
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   908
            max(list(len(p) for p in found) + [len(_("PUBLISHER"))]))
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   909
        def_fmt = "%-" + max_pub_name_len + "s %-45s %-1s %-s"
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   910
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   911
        # print without trailing newline.
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   912
        sys.stdout.write(misc.get_listing(
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   913
            desired_field_order, field_data, gen_listing(),
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   914
            out_format, def_fmt, omit_headers))
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   915
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   916
        if not listed and pargs:
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   917
                # No matching packages.
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   918
                logger.error("")
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   919
                if not unmatched:
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   920
                        unmatched = pargs
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   921
                error(apx.PackageMatchErrors(unmatched_fmris=unmatched),
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   922
                    cmd=subcommand)
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   923
                return EXIT_OOPS
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   924
        elif unmatched:
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   925
                # One or more patterns didn't match a package from any
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   926
                # publisher; only display the error.
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   927
                logger.error("")
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   928
                error(apx.PackageMatchErrors(unmatched_fmris=unmatched),
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   929
                    cmd=subcommand)
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   930
                return EXIT_PARTIAL
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   931
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   932
        return EXIT_OK
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
   933
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   934
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   935
def subcmd_rebuild(conf, args):
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   936
        """Rebuild the repository's catalog and index data (as permitted)."""
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   937
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   938
        subcommand = "rebuild"
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   939
        build_catalog = True
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   940
        build_index = True
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   941
        key = None
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   942
        cert = None
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   943
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   944
        opts, pargs = getopt.getopt(args, "p:s:", ["no-catalog", "no-index",
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   945
            "key=", "cert="])
2132
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   946
        pubs = set()
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   947
        for opt, arg in opts:
2132
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   948
                if opt == "-p":
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   949
                        if not misc.valid_pub_prefix(arg):
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   950
                                error(_("Invalid publisher prefix '%s'") % arg,
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   951
                                    cmd=subcommand)
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   952
                        pubs.add(arg)
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   953
                elif opt == "-s":
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   954
                        conf["repo_uri"] = parse_uri(arg)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   955
                elif opt == "--no-catalog":
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   956
                        build_catalog = False
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   957
                elif opt == "--no-index":
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   958
                        build_index = False
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   959
                elif opt == "--key":
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   960
                        key = arg
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   961
                elif opt == "--cert":
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   962
                        cert = arg
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   963
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   964
        if pargs:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   965
                usage(_("command does not take operands"), cmd=subcommand)
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   966
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   967
        if not build_catalog and not build_index:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   968
                # Why?  Who knows; but do what was requested--nothing!
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   969
                return EXIT_OK
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   970
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   971
        # Setup transport so operation can be performed.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   972
        if not conf.get("repo_uri", None):
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   973
                usage(_("A package repository location must be provided "
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   974
                    "using -s."), cmd=subcommand)
2132
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   975
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   976
        def do_rebuild(xport, xpub):
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   977
                if build_catalog and build_index:
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   978
                        xport.publish_rebuild(xpub)
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   979
                elif build_catalog:
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   980
                        xport.publish_rebuild_packages(xpub)
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   981
                elif build_index:
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   982
                        xport.publish_rebuild_indexes(xpub)
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
   983
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   984
        xport, xpub, tmp_dir = setup_transport(conf, subcommand=subcommand,
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
   985
            ssl_key=key, ssl_cert=cert)
2132
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   986
        rval, found, pub_data = _get_matching_pubs(subcommand, pubs, xport,
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   987
            xpub)
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   988
        if rval == EXIT_OOPS:
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   989
                return rval
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   990
2132
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   991
        logger.info("Initiating repository rebuild.")
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   992
        for pfx in found:
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   993
                xpub.prefix = pfx
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   994
                do_rebuild(xport, xpub)
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   995
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
   996
        return rval
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   997
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   998
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
   999
def subcmd_refresh(conf, args):
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1000
        """Refresh the repository's catalog and index data (as permitted)."""
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1001
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1002
        subcommand = "refresh"
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1003
        add_content = True
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1004
        refresh_index = True
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
  1005
        key = None
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
  1006
        cert = None
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1007
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
  1008
        opts, pargs = getopt.getopt(args, "p:s:", ["no-catalog", "no-index",
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
  1009
            "key=", "cert="])
2132
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1010
        pubs = set()
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1011
        for opt, arg in opts:
2132
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1012
                if opt == "-p":
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1013
                        if not misc.valid_pub_prefix(arg):
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1014
                                error(_("Invalid publisher prefix '%s'") % arg,
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1015
                                    cmd=subcommand)
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1016
                        pubs.add(arg)
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1017
                elif opt == "-s":
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1018
                        conf["repo_uri"] = parse_uri(arg)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1019
                elif opt == "--no-catalog":
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1020
                        add_content = False
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1021
                elif opt == "--no-index":
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1022
                        refresh_index = False
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
  1023
                elif opt == "--key":
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
  1024
                        key = arg
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
  1025
                elif opt == "--cert":
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
  1026
                        cert = arg
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1027
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1028
        if pargs:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1029
                usage(_("command does not take operands"), cmd=subcommand)
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1030
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1031
        if not add_content and not refresh_index:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1032
                # Why?  Who knows; but do what was requested--nothing!
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1033
                return EXIT_OK
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1034
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1035
        # Setup transport so operation can be performed.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1036
        if not conf.get("repo_uri", None):
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1037
                usage(_("A package repository location must be provided "
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1038
                    "using -s."), cmd=subcommand)
2132
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1039
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1040
        def do_refresh(xport, xpub):
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1041
                if add_content and refresh_index:
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1042
                        xport.publish_refresh(xpub)
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1043
                elif add_content:
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1044
                        xport.publish_refresh_packages(xpub)
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1045
                elif refresh_index:
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1046
                        xport.publish_refresh_indexes(xpub)
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1047
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
  1048
        xport, xpub, tmp_dir = setup_transport(conf, subcommand=subcommand,
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
  1049
            ssl_key=key, ssl_cert=cert)
2132
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1050
        rval, found, pub_data = _get_matching_pubs(subcommand, pubs, xport,
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1051
            xpub)
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1052
        if rval == EXIT_OOPS:
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1053
                return rval
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1054
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1055
        logger.info("Initiating repository refresh.")
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1056
        for pfx in found:
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1057
                xpub.prefix = pfx
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1058
                do_refresh(xport, xpub)
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1059
f9a27f85a897 17303 pkgrepo refresh/rebuild should allow specifying publisher
Shawn Walker <shawn.walker@oracle.com>
parents: 2126
diff changeset
  1060
        return rval
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1061
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1062
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1063
def subcmd_set(conf, args):
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1064
        """Set repository properties."""
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1065
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1066
        subcommand = "set"
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1067
        pubs = set()
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1068
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1069
        opts, pargs = getopt.getopt(args, "p:s:")
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1070
        for opt, arg in opts:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1071
                if opt == "-p":
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1072
                        pubs.add(arg)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1073
                elif opt == "-s":
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1074
                        conf["repo_uri"] = parse_uri(arg)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1075
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1076
        bad_args = False
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1077
        props = {}
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1078
        if not pargs:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1079
                bad_args = True
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1080
        else:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1081
                for arg in pargs:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1082
                        try:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1083
                                # Attempt to parse property into components.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1084
                                prop, val = arg.split("=", 1)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1085
                                sname, pname = prop.rsplit("/", 1)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1086
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1087
                                # Store property values by section.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1088
                                props.setdefault(sname, {})
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1089
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1090
                                # Parse the property value into a list if
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1091
                                # necessary, otherwise append it to the list
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1092
                                # of values for the property.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1093
                                if len(val) > 0  and val[0] == "(" and \
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1094
                                    val[-1] == ")":
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1095
                                        val = shlex.split(val.strip("()"))
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1096
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1097
                                if sname in props and pname in props[sname]:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1098
                                        # Determine if previous value is already
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1099
                                        # a list, and if not, convert and append
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1100
                                        # the value.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1101
                                        pval = props[sname][pname]
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1102
                                        if not isinstance(pval, list):
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1103
                                                pval = [pval]
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1104
                                        if isinstance(val, list):
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1105
                                                pval.extend(val)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1106
                                        else:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1107
                                                pval.append(val)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1108
                                        props[sname][pname] = pval
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1109
                                else:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1110
                                        # Otherwise, just store the value.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1111
                                        props[sname][pname] = val
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1112
                        except ValueError:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1113
                                bad_args = True
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1114
                                break
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1115
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1116
        if bad_args:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1117
                usage(_("a property name and value must be provided in the "
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1118
                    "form <section/property>=<value> or "
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1119
                    "<section/property>=([\"<value>\" ...])"))
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1120
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1121
        # Get repository object.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1122
        if not conf.get("repo_uri", None):
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1123
                usage(_("A package repository location must be provided "
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1124
                    "using -s."), cmd=subcommand)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1125
        repo = get_repo(conf, read_only=False, subcommand=subcommand)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1126
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1127
        # Set properties.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1128
        if pubs:
2142
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
  1129
                return _set_pub(conf, subcommand, props, pubs, repo)
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1130
2142
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
  1131
        return _set_repo(conf, subcommand, props, repo)
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1132
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1133
2142
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
  1134
def _set_pub(conf, subcommand, props, pubs, repo):
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1135
        """Set publisher properties."""
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1136
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1137
        for sname, sprops in props.iteritems():
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1138
                if sname not in ("publisher", "repository"):
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1139
                        usage(_("unknown property section "
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1140
                            "'%s'") % sname, cmd=subcommand)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1141
                for pname in sprops:
2073
9fcacc9e5eaa 16998 transport should support publisher-specific write and read caches
Shawn Walker <shawn.walker@oracle.com>
parents: 2028
diff changeset
  1142
                        if sname == "publisher" and pname == "prefix":
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1143
                                usage(_("'%s' may not be set using "
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1144
                                    "this command" % pname))
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1145
                        attrname = pname.replace("-", "_")
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1146
                        if not hasattr(publisher.Publisher, attrname) and \
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1147
                            not hasattr(publisher.Repository, attrname):
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1148
                                usage(_("unknown property '%s'") %
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1149
                                    pname, cmd=subcommand)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1150
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1151
        if "all" in pubs:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1152
                # Default to list of all publishers.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1153
                pubs = repo.publishers
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1154
                if not pubs:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1155
                        # If there are still no known publishers, this
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1156
                        # operation cannot succeed, so fail now.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1157
                        usage(_("One or more publishers must be specified to "
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1158
                            "create and set properties for as none exist yet."),
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1159
                            cmd=subcommand)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1160
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1161
        # Get publishers and update properties.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1162
        failed = []
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1163
        new_pub = False
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1164
        for pfx in pubs:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1165
                try:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1166
                        # Get a copy of the existing publisher.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1167
                        pub = copy.copy(repo.get_publisher(pfx))
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1168
                except sr.RepositoryUnknownPublisher, e:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1169
                        pub = publisher.Publisher(pfx)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1170
                        new_pub = True
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1171
                except sr.RepositoryError, e:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1172
                        failed.append((pfx, e))
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1173
                        continue
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1174
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1175
                try:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1176
                        # Set/update the publisher's properties.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1177
                        for sname, sprops in props.iteritems():
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1178
                                if sname == "publisher":
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1179
                                        target = pub
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1180
                                elif sname == "repository":
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2301
diff changeset
  1181
                                        target = pub.repository
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1182
                                        if not target:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1183
                                                target = publisher.Repository()
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2301
diff changeset
  1184
                                                pub.repository = target
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1185
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1186
                                for pname, val in sprops.iteritems():
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1187
                                        attrname = pname.replace("-", "_")
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1188
                                        pval = getattr(target, attrname)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1189
                                        if isinstance(pval, list) and \
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1190
                                            not isinstance(val, list):
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1191
                                                # If the target property expects
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1192
                                                # a list, transform the provided
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1193
                                                # value into one if it isn't
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1194
                                                # already.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1195
                                                if val == "":
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1196
                                                        val = []
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1197
                                                else:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1198
                                                        val = [val]
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1199
                                        setattr(target, attrname, val)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1200
                except apx.ApiException, e:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1201
                        failed.append((pfx, e))
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1202
                        continue
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1203
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1204
                if new_pub:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1205
                        repo.add_publisher(pub)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1206
                else:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1207
                        repo.update_publisher(pub)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1208
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1209
        if failed:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1210
                for pfx, details in failed:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1211
                        error(_("Unable to set properties for publisher "
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1212
                            "'%(pfx)s':\n%(details)s") % locals())
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1213
                if len(failed) < len(pubs):
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1214
                        return EXIT_PARTIAL
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1215
                return EXIT_OOPS
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1216
        return EXIT_OK
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1217
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1218
2142
46de09e114f2 16809 pkgrepo(1) should specify which properties are valid
Shawn Walker <shawn.walker@oracle.com>
parents: 2132
diff changeset
  1219
def _set_repo(conf, subcommand, props, repo):
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1220
        """Set repository properties."""
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1221
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1222
        # Set properties.
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1223
        for sname, props in props.iteritems():
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1224
                for pname, val in props.iteritems():
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1225
                        repo.cfg.set_property(sname, pname, val)
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1226
        repo.write_config()
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1227
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1228
        return EXIT_OK
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1229
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1230
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1231
def subcmd_version(conf, args):
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1232
        """Display the version of the pkg(5) API."""
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1233
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1234
        subcommand = "version"
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1235
        if args:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1236
                usage(_("command does not take operands"), cmd=subcommand)
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1237
        msg(pkg.VERSION)
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1238
        return EXIT_OK
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1239
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1240
2843
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1241
verify_error_header = None
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1242
verify_warning_header = None
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1243
verify_reason_headers = None
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1244
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1245
def __load_verify_msgs():
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1246
        """Since our gettext isn't loaded we need to ensure our globals have
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1247
        correct content by calling this method.  These values are used by both
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1248
        fix when in verbose mode, and verify"""
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1249
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1250
        global verify_error_header
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1251
        global verify_warning_header
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1252
        global verify_reason_headers
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1253
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1254
        # A map of error detail types to the human-readable description of each
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1255
        # type.  These correspond to keys in the dictionary returned by
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1256
        # sr.Repository.verify(..)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1257
        verify_reason_headers = {
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1258
            "path": _("Repository path"),
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1259
            "actual": _("Computed hash"),
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1260
            "fpath": _("Path"),
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1261
            "permissionspath": _("Path"),
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1262
            "pkg": _("Package"),
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1263
            "err": _("Detail")
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1264
        }
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1265
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1266
        verify_error_header = _("ERROR")
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1267
        verify_warning_header = _("WARNING")
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1268
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1269
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1270
def __fmt_verify(verify_tuple):
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1271
        """Format a verify_tuple, of the form (error, path, message, reason)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1272
        returning a formatted error message, and an FMRI indicating what
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1273
        packages within the repository are affected. Note that the returned FMRI
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1274
        may not be valid, in which case a path to the broken manifest in the
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1275
        repository is returned instead."""
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1276
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1277
        error, path, message, reason = verify_tuple
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1278
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1279
        formatted_message = "%(error_type)16s: %(message)s\n" % \
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1280
            {"error_type": verify_error_header, "message": message}
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1281
        reason["path"] = path
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1282
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1283
        if error == sr.REPO_VERIFY_BADMANIFEST:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1284
                reason_keys = ["path", "err"]
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1285
        elif error in [sr.REPO_VERIFY_PERM, sr.REPO_VERIFY_MFPERM]:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1286
                reason_keys = ["pkg", "path"]
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1287
        elif error == sr.REPO_VERIFY_BADHASH:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1288
                reason_keys = ["pkg", "path", "actual", "fpath"]
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1289
        elif error == sr.REPO_VERIFY_UNKNOWN:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1290
                reason_keys = ["path", "err"]
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1291
        elif error == sr.REPO_VERIFY_BADSIG:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1292
                reason_keys = ["pkg", "path", "err"]
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1293
        elif error == sr.REPO_VERIFY_WARN_OPENPERMS:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1294
                formatted_message = \
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1295
                    "%(error_type)16s: %(message)s\n" % \
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1296
                    {"error_type": verify_warning_header, "message": message}
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1297
                reason_keys = ["permissionspath", "err"]
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1298
        else:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1299
                # A list of the details we provide.  Some error codes
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1300
                # have different details associated with them.
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1301
                reason_keys = ["pkg", "path", "fpath"]
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1302
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1303
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1304
        # the detailed error message can be long, so we'll wrap it.  If what we
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1305
        # have fits on a single line, use it, otherwise begin displaying the
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1306
        # message on the next line.
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1307
        if "err" in reason_keys:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1308
                err_str = ""
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1309
                lines = textwrap.wrap(reason["err"])
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1310
                if len(lines) != 1:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1311
                        for line in lines:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1312
                                err_str += "%18s\n" % line
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1313
                        reason["err"] = "\n" + err_str.rstrip()
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1314
                else:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1315
                        reason["err"] = lines[0]
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1316
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1317
        for key in reason_keys:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1318
                # sometimes we don't have the key we want, for example we may
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1319
                # not have a file path from the package if the error is a
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1320
                # missing repository file for a 'license' action (which don't
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1321
                # have 'path' attributes, hence no 'fpath' dictionary entry)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1322
                if key not in reason:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1323
                        continue
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1324
                formatted_message += "%(key)16s: %(value)s\n" % \
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1325
                    {"key": verify_reason_headers[key], "value": reason[key]}
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1326
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1327
        formatted_message += "\n"
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1328
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1329
        if error == sr.REPO_VERIFY_WARN_OPENPERMS:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1330
                return formatted_message, None
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1331
        elif "pkg" in reason:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1332
                return formatted_message, reason["pkg"]
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1333
        return formatted_message, reason["path"]
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1334
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1335
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1336
def subcmd_verify(conf, args):
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1337
        """Verify the repository content (file and manifest content only)."""
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1338
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1339
        subcommand = "verify"
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1340
        __load_verify_msgs()
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1341
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1342
        opts, pargs = getopt.getopt(args, "p:s:")
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1343
        pubs = set()
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1344
        for opt, arg in opts:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1345
                if opt == "-s":
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1346
                        conf["repo_uri"] = parse_uri(arg)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1347
                if opt == "-p":
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1348
                        if not misc.valid_pub_prefix(arg):
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1349
                                error(_("Invalid publisher prefix '%s'") % arg,
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1350
                                    cmd=subcommand)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1351
                        pubs.add(arg)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1352
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1353
        if pargs:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1354
                usage(_("command does not take operands"), cmd=subcommand)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1355
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1356
        repo_uri = conf.get("repo_uri", None)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1357
        if not repo_uri:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1358
                usage(_("A package repository location must be provided "
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1359
                    "using -s."), cmd=subcommand)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1360
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1361
        if repo_uri.scheme != "file":
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1362
                usage(_("Network repositories are not currently supported "
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1363
                    "for this operation."), cmd=subcommand)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1364
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1365
        xport, xpub, tmp_dir = setup_transport(conf, subcommand=subcommand)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1366
        rval, found, pub_data = _get_matching_pubs(subcommand, pubs, xport,
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1367
            xpub)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1368
        if rval == EXIT_OOPS:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1369
                return rval
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1370
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1371
        logger.info("Initiating repository verification.")
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1372
        bad_fmris = set()
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1373
        for pfx in found:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1374
                progtrack = get_tracker()
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1375
                repo = sr.Repository(root=repo_uri.get_pathname())
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1376
                xpub.prefix = pfx
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1377
                xpub.transport = xport
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1378
                for verify_tuple in repo.verify(pub=xpub, progtrack=progtrack):
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1379
                        message, bad_fmri = __fmt_verify(verify_tuple)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1380
                        if bad_fmri:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1381
                                bad_fmris.add(bad_fmri)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1382
                        progtrack.repo_verify_yield_error(bad_fmri, message)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1383
        if bad_fmris:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1384
                return EXIT_OOPS
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1385
        return EXIT_OK
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1386
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1387
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1388
def subcmd_fix(conf, args):
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1389
        """Fix the repository content (file and manifest content only)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1390
        For index and catalog content corruption, a rebuild should be
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1391
        performed."""
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1392
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1393
        subcommand = "fix"
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1394
        __load_verify_msgs()
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1395
        verbose = False
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1396
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1397
        opts, pargs = getopt.getopt(args, "vp:s:")
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1398
        pubs = set()
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1399
        for opt, arg in opts:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1400
                if opt == "-s":
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1401
                        conf["repo_uri"] = parse_uri(arg)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1402
                if opt == "-v":
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1403
                        verbose = True
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1404
                if opt == "-p":
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1405
                        if not misc.valid_pub_prefix(arg):
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1406
                                error(_("Invalid publisher prefix '%s'") % arg,
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1407
                                    cmd=subcommand)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1408
                        pubs.add(arg)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1409
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1410
        if pargs:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1411
                usage(_("command does not take operands"), cmd=subcommand)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1412
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1413
        repo_uri = conf.get("repo_uri", None)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1414
        if not repo_uri:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1415
                usage(_("A package repository location must be provided "
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1416
                    "using -s."), cmd=subcommand)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1417
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1418
        if repo_uri.scheme != "file":
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1419
                usage(_("Network repositories are not currently supported "
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1420
                    "for this operation."), cmd=subcommand)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1421
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1422
        xport, xpub, tmp_dir = setup_transport(conf, subcommand=subcommand)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1423
        rval, found, pub_data = _get_matching_pubs(subcommand, pubs, xport,
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1424
            xpub)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1425
        if rval == EXIT_OOPS:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1426
                return rval
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1427
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1428
        logger.info("Initiating repository fix.")
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1429
        progtrack = get_tracker()
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1430
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1431
        def verify_cb(tracker, verify_tuple):
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1432
                """A method passed to sr.Repository.fix(..) to emit verify
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1433
                messages if verbose mode is enabled."""
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1434
                if not verbose:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1435
                        return
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1436
                formatted_message, bad_fmri = __fmt_verify(verify_tuple)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1437
                tracker.repo_verify_yield_error(bad_fmri, formatted_message)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1438
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1439
        repo = sr.Repository(root=repo_uri.get_pathname())
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1440
        broken_fmris = set()
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1441
        failed_fix_paths = set()
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1442
        for pfx in found:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1443
                xpub.prefix = pfx
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1444
                xpub.transport = xport
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1445
                progtrack = get_tracker()
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1446
                for status_code, path, message, reason in \
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1447
                    repo.fix(pub=xpub, progtrack=progtrack,
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1448
                        verify_callback=verify_cb):
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1449
                        if status_code == sr.REPO_FIX_ITEM:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1450
                                # When we can't get the FMRI, eg. in the case
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1451
                                # of a corrupt manifest, use the path instead.
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1452
                                fmri = reason["pkg"]
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1453
                                if not fmri:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1454
                                        fmri = path
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1455
                                broken_fmris.add(fmri)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1456
                                if verbose:
2844
3f428f7cb353 15722190 pkgrepo verify subcommand needed (fix pylint)
Tim Foster <tim.s.foster@oracle.com>
parents: 2843
diff changeset
  1457
                                        progtrack.repo_fix_yield_info(fmri,
3f428f7cb353 15722190 pkgrepo verify subcommand needed (fix pylint)
Tim Foster <tim.s.foster@oracle.com>
parents: 2843
diff changeset
  1458
                                            message)
2843
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1459
                        else:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1460
                                failed_fix_paths.add(path)
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1461
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1462
        progtrack.flush()
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1463
        logger.info("")
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1464
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1465
        if broken_fmris:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1466
                logger.info(_("Use pkgsend(1) or pkgrecv(1) to republish the\n"
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1467
                    "following packages or paths which were quarantined:\n\n\t"
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1468
                    "%s") % \
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1469
                    "\n\t".join([str(f) for f in broken_fmris]))
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1470
        if failed_fix_paths:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1471
                logger.info(_("\npkgrepo could not repair the following paths "
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1472
                    "in the repository:\n\n\t%s") %
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1473
                    "\n\t".join([p for p in failed_fix_paths]))
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1474
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1475
        if not (broken_fmris or failed_fix_paths):
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1476
                logger.info(_("No repository fixes required."))
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1477
        else:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1478
                logger.info(_("Repository repairs completed."))
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1479
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1480
        if failed_fix_paths:
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1481
                return EXIT_OOPS
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1482
        return EXIT_OK
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1483
4e1d09017f2c 15722190 pkgrepo verify subcommand needed
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
  1484
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1485
def main_func():
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1486
        global_settings.client_name = PKG_CLIENT_NAME
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1487
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1488
        try:
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
  1489
                opts, pargs = getopt.getopt(sys.argv[1:], "s:D:?",
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
  1490
                    ["help", "debug="])
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1491
        except getopt.GetoptError, e:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1492
                usage(_("illegal global option -- %s") % e.opt)
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1493
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1494
        conf = {}
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1495
        show_usage = False
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1496
        for opt, arg in opts:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1497
                if opt == "-s":
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1498
                        conf["repo_uri"] = parse_uri(arg)
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1499
                elif opt in ("--help", "-?"):
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1500
                        show_usage = True
2864
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
  1501
                elif opt == "-D" or opt == "--debug":
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
  1502
                        try:
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
  1503
                                key, value = arg.split("=", 1)
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
  1504
                        except (AttributeError, ValueError):
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
  1505
                                usage(_("%(opt)s takes argument of form "
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
  1506
                                   "name=value, not %(arg)s") % {
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
  1507
                                   "opt":  opt, "arg": arg })
96d3957712da 16193298 pkgrepo, pkgrecv and pkgsend need SSL support for publishing and info retrieval
Erik Trauschke <Erik.Trauschke@oracle.com>
parents: 2844
diff changeset
  1508
                        DebugValues.set_value(key, value)
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1509
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1510
        subcommand = None
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1511
        if pargs:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1512
                subcommand = pargs.pop(0)
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1513
                if subcommand == "help":
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1514
                        show_usage = True
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1515
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1516
        if show_usage:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1517
                usage(retcode=0, full=True)
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1518
        elif not subcommand:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1519
                usage(_("no subcommand specified"))
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1520
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1521
        subcommand = subcommand.replace("-", "_")
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1522
        func = globals().get("subcmd_%s" % subcommand, None)
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1523
        if not func:
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1524
                subcommand = subcommand.replace("_", "-")
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1525
                usage(_("unknown subcommand '%s'") % subcommand)
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1526
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1527
        try:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1528
                return func(conf, pargs)
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1529
        except getopt.GetoptError, e:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1530
                if e.opt in ("help", "?"):
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1531
                        usage(full=True)
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1532
                usage(_("illegal option -- %s") % e.opt, cmd=subcommand)
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1533
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1534
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1535
#
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1536
# Establish a specific exit status which means: "python barfed an exception"
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1537
# so that we can more easily detect these in testing of the CLI commands.
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1538
#
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1539
def handle_errors(func, *args, **kwargs):
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1540
        """Catch exceptions raised by the main program function and then print
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1541
        a message and/or exit with an appropriate return code.
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1542
        """
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1543
2569
1f9f50d0cde3 18977 pkg stack traces should tell customers to report issues to service
Shawn Walker <shawn.walker@oracle.com>
parents: 2510
diff changeset
  1544
        traceback_str = misc.get_traceback_message()
2126
7f6719cd083b 14316 please suggest the proper classification and product in the pkg error message
Shawn Walker <shawn.walker@oracle.com>
parents: 2073
diff changeset
  1545
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1546
        try:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1547
                # Out of memory errors can be raised as EnvironmentErrors with
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1548
                # an errno of ENOMEM, so in order to handle those exceptions
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1549
                # with other errnos, we nest this try block and have the outer
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1550
                # one handle the other instances.
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1551
                try:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1552
                        __ret = func(*args, **kwargs)
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1553
                except (MemoryError, EnvironmentError), __e:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1554
                        if isinstance(__e, EnvironmentError) and \
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1555
                            __e.errno != errno.ENOMEM:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1556
                                raise
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1557
                        error("\n" + misc.out_of_memory())
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1558
                        __ret = EXIT_OOPS
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1559
        except SystemExit, __e:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1560
                raise __e
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
  1561
        except (IOError, PipeError, KeyboardInterrupt), __e:
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1562
                # Don't display any messages here to prevent possible further
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1563
                # broken pipe (EPIPE) errors.
2510
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
  1564
                if isinstance(__e, IOError) and __e.errno != errno.EPIPE:
f48530fd135d 18440 pkgrepo should be able to list packages
Shawn Walker <shawn.walker@oracle.com>
parents: 2453
diff changeset
  1565
                        error(str(__e))
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1566
                __ret = EXIT_OOPS
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1567
        except apx.VersionException, __e:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1568
                error(_("The pkgrepo command appears out of sync with the "
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1569
                    "libraries provided\nby pkg:/package/pkg. The client "
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1570
                    "version is %(client)s while the library\nAPI version is "
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1571
                    "%(api)s.") % {'client': __e.received_version,
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1572
                     'api': __e.expected_version
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1573
                    })
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1574
                __ret = EXIT_OOPS
2028
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1575
        except apx.BadRepositoryURI, __e:
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1576
                error(str(__e))
b2c674e6ee28 16744 repository multi-publisher on-disk format should be formalized and implemented
Shawn Walker <shawn.walker@oracle.com>
parents: 2026
diff changeset
  1577
                __ret = EXIT_BADOPT
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1578
        except (apx.ApiException, sr.RepositoryError), __e:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1579
                error(str(__e))
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1580
                __ret = EXIT_OOPS
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1581
        except:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1582
                traceback.print_exc()
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1583
                error(traceback_str)
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1584
                __ret = 99
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1585
        return __ret
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1586
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1587
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1588
if __name__ == "__main__":
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1589
        misc.setlocale(locale.LC_ALL, "", error)
2728
69903f3b722b 7166082 pkg command does not handle Japanese character encoding on Solaris 11
Abhinandan Ekande <abhinandan.ekande@oracle.com>
parents: 2693
diff changeset
  1590
        gettext.install("pkg", "/usr/share/locale",
69903f3b722b 7166082 pkg command does not handle Japanese character encoding on Solaris 11
Abhinandan Ekande <abhinandan.ekande@oracle.com>
parents: 2693
diff changeset
  1591
            codeset=locale.getpreferredencoding())
1968
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1592
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1593
        # Make all warnings be errors.
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1594
        warnings.simplefilter('error')
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1595
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1596
        __retval = handle_errors(main_func)
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1597
        try:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1598
                logging.shutdown()
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1599
        except IOError:
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1600
                # Ignore python's spurious pipe problems.
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1601
                pass
c0540b1e4f7e 8722 advanced repository metadata store needed
Shawn Walker <shawn.walker@oracle.com>
parents:
diff changeset
  1602
        sys.exit(__retval)