src/depot.py
author Shawn Walker <Shawn.Walker@Sun.COM>
Mon, 13 Oct 2008 15:46:42 -0500
changeset 589 2480ab0274d1
parent 468 20250d58c2ab
child 612 353fef98c569
permissions -rwxr-xr-x
242 desire ability to set content root 3815 depot manpage doesn't explain --mirror option
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
409
713e20963dc2 2314 shebang lines should use minimum python version
Shawn Walker <swalker@opensolaris.org>
parents: 404
diff changeset
     1
#!/usr/bin/python2.4
20
e5e53bc1c4d1 Cleaned up the build and install process. Turn the pkg directory into a
Danek Duvall <danek.duvall@sun.com>
parents: 14
diff changeset
     2
#
e5e53bc1c4d1 Cleaned up the build and install process. Turn the pkg directory into a
Danek Duvall <danek.duvall@sun.com>
parents: 14
diff changeset
     3
# CDDL HEADER START
e5e53bc1c4d1 Cleaned up the build and install process. Turn the pkg directory into a
Danek Duvall <danek.duvall@sun.com>
parents: 14
diff changeset
     4
#
e5e53bc1c4d1 Cleaned up the build and install process. Turn the pkg directory into a
Danek Duvall <danek.duvall@sun.com>
parents: 14
diff changeset
     5
# The contents of this file are subject to the terms of the
e5e53bc1c4d1 Cleaned up the build and install process. Turn the pkg directory into a
Danek Duvall <danek.duvall@sun.com>
parents: 14
diff changeset
     6
# Common Development and Distribution License (the "License").
e5e53bc1c4d1 Cleaned up the build and install process. Turn the pkg directory into a
Danek Duvall <danek.duvall@sun.com>
parents: 14
diff changeset
     7
# You may not use this file except in compliance with the License.
e5e53bc1c4d1 Cleaned up the build and install process. Turn the pkg directory into a
Danek Duvall <danek.duvall@sun.com>
parents: 14
diff changeset
     8
#
e5e53bc1c4d1 Cleaned up the build and install process. Turn the pkg directory into a
Danek Duvall <danek.duvall@sun.com>
parents: 14
diff changeset
     9
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
e5e53bc1c4d1 Cleaned up the build and install process. Turn the pkg directory into a
Danek Duvall <danek.duvall@sun.com>
parents: 14
diff changeset
    10
# or http://www.opensolaris.org/os/licensing.
e5e53bc1c4d1 Cleaned up the build and install process. Turn the pkg directory into a
Danek Duvall <danek.duvall@sun.com>
parents: 14
diff changeset
    11
# See the License for the specific language governing permissions
e5e53bc1c4d1 Cleaned up the build and install process. Turn the pkg directory into a
Danek Duvall <danek.duvall@sun.com>
parents: 14
diff changeset
    12
# and limitations under the License.
e5e53bc1c4d1 Cleaned up the build and install process. Turn the pkg directory into a
Danek Duvall <danek.duvall@sun.com>
parents: 14
diff changeset
    13
#
e5e53bc1c4d1 Cleaned up the build and install process. Turn the pkg directory into a
Danek Duvall <danek.duvall@sun.com>
parents: 14
diff changeset
    14
# When distributing Covered Code, include this CDDL HEADER in each
e5e53bc1c4d1 Cleaned up the build and install process. Turn the pkg directory into a
Danek Duvall <danek.duvall@sun.com>
parents: 14
diff changeset
    15
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
e5e53bc1c4d1 Cleaned up the build and install process. Turn the pkg directory into a
Danek Duvall <danek.duvall@sun.com>
parents: 14
diff changeset
    16
# If applicable, add the following below this CDDL HEADER, with the
e5e53bc1c4d1 Cleaned up the build and install process. Turn the pkg directory into a
Danek Duvall <danek.duvall@sun.com>
parents: 14
diff changeset
    17
# fields enclosed by brackets "[]" replaced with your own identifying
e5e53bc1c4d1 Cleaned up the build and install process. Turn the pkg directory into a
Danek Duvall <danek.duvall@sun.com>
parents: 14
diff changeset
    18
# information: Portions Copyright [yyyy] [name of copyright owner]
e5e53bc1c4d1 Cleaned up the build and install process. Turn the pkg directory into a
Danek Duvall <danek.duvall@sun.com>
parents: 14
diff changeset
    19
#
e5e53bc1c4d1 Cleaned up the build and install process. Turn the pkg directory into a
Danek Duvall <danek.duvall@sun.com>
parents: 14
diff changeset
    20
# CDDL HEADER END
e5e53bc1c4d1 Cleaned up the build and install process. Turn the pkg directory into a
Danek Duvall <danek.duvall@sun.com>
parents: 14
diff changeset
    21
#
260
a1b77322abb2 255 Symbolic HTTP response codes should be used
Shawn Walker <swalker@opensolaris.org>
parents: 258
diff changeset
    22
# Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
20
e5e53bc1c4d1 Cleaned up the build and install process. Turn the pkg directory into a
Danek Duvall <danek.duvall@sun.com>
parents: 14
diff changeset
    23
# Use is subject to license terms.
e5e53bc1c4d1 Cleaned up the build and install process. Turn the pkg directory into a
Danek Duvall <danek.duvall@sun.com>
parents: 14
diff changeset
    24
#
e5e53bc1c4d1 Cleaned up the build and install process. Turn the pkg directory into a
Danek Duvall <danek.duvall@sun.com>
parents: 14
diff changeset
    25
22
379f0f6809ff pkgsend open, pkgsend add file, pkgsend close; Transaction object
"Stephen Hahn <sch@sun.com>"
parents: 21
diff changeset
    26
# pkg.depotd - package repository daemon
0
f08899079fb4 implemented open, add (file case), close for transactions
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    27
50
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents: 46
diff changeset
    28
# XXX The prototype pkg.depotd combines both the version management server that
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents: 46
diff changeset
    29
# answers to pkgsend(1) sessions and the HTTP file server that answers to the
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents: 46
diff changeset
    30
# various GET operations that a pkg(1) client makes.  This split is expected to
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents: 46
diff changeset
    31
# be made more explicit, by constraining the pkg(1) operations such that they
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents: 46
diff changeset
    32
# can be served as a typical HTTP/HTTPS session.  Thus, pkg.depotd will reduce
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents: 46
diff changeset
    33
# to a special purpose HTTP/HTTPS server explicitly for the version management
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents: 46
diff changeset
    34
# operations, and must manipulate the various state files--catalogs, in
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents: 46
diff changeset
    35
# particular--such that the pkg(1) pull client can operately accurately with
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents: 46
diff changeset
    36
# only a basic HTTP/HTTPS server in place.
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents: 46
diff changeset
    37
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents: 46
diff changeset
    38
# XXX We should support simple "last-modified" operations via HEAD queries.
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents: 46
diff changeset
    39
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents: 46
diff changeset
    40
# XXX Although we pushed the evaluation of next-version, etc. to the pull
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents: 46
diff changeset
    41
# client, we should probably provide a query API to do same on the server, for
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents: 46
diff changeset
    42
# dumb clients (like a notification service).
bfcb1661f019 basic image and package plans
Stephen Hahn <sch@sun.com>
parents: 46
diff changeset
    43
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    44
# The default authority for the depot.
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    45
AUTH_DEFAULT = "opensolaris.org"
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    46
# The default repository path.
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    47
REPO_PATH_DEFAULT = "/var/pkg/repo"
589
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
    48
# The default path for static and other web content.
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
    49
CONTENT_PATH_DEFAULT = "/usr/share/lib/pkg"
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    50
# The default port to serve data from.
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    51
PORT_DEFAULT = 80
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    52
# The minimum number of threads allowed.
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    53
THREADS_MIN = 1
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    54
# The default number of threads to start.
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    55
THREADS_DEFAULT = 10
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    56
# The maximum number of threads that can be started.
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    57
THREADS_MAX = 100
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    58
# The default server socket timeout in seconds. We want this to be longer than
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    59
# the normal default of 10 seconds to accommodate clients with poor quality
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    60
# connections.
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    61
SOCKET_TIMEOUT_DEFAULT = 60
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    62
# Whether modify operations should be allowed.
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    63
READONLY_DEFAULT = False
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    64
# Whether the repository catalog should be rebuilt on startup.
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    65
REBUILD_DEFAULT = False
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 428
diff changeset
    66
# Whether the indexes should be rebuilt
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 428
diff changeset
    67
REINDEX_DEFAULT = False
461
37cf3ac75e37 1018 actions with payloads should include all sizes and hashes
johansen <johansen@sun.com>
parents: 452
diff changeset
    68
# Not in mirror mode by default
37cf3ac75e37 1018 actions with payloads should include all sizes and hashes
johansen <johansen@sun.com>
parents: 452
diff changeset
    69
MIRROR_DEFAULT = False
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    70
26
ab188d4682d5 catalog processing begins
"Stephen Hahn <sch@sun.com>"
parents: 25
diff changeset
    71
import getopt
466
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
    72
import logging
0
f08899079fb4 implemented open, add (file case), close for transactions
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    73
import os
468
20250d58c2ab 2309 pkg.depotd fails when -d argument is a relative pathname
Tom Mueller <Tom.Mueller@sun.com>
parents: 466
diff changeset
    74
import os.path
52
d7c452ef7ae1 Sanitize getopt exception handling
Danek Duvall <danek.duvall@sun.com>
parents: 50
diff changeset
    75
import sys
451
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
    76
import urlparse
0
f08899079fb4 implemented open, add (file case), close for transactions
"Stephen Hahn <sch@sun.com>"
parents:
diff changeset
    77
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    78
try:
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    79
        import cherrypy
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    80
        version = cherrypy.__version__.split('.')
452
01f53c6381af 2714 image-update failure during update phase
Shawn Walker <shawn.walker@sun.com>
parents: 451
diff changeset
    81
        if map(int, version) < [3, 1, 0]:
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    82
                raise ImportError
452
01f53c6381af 2714 image-update failure during update phase
Shawn Walker <shawn.walker@sun.com>
parents: 451
diff changeset
    83
        elif map(int, version) >= [3, 2, 0]:
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    84
                raise ImportError
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    85
except ImportError:
452
01f53c6381af 2714 image-update failure during update phase
Shawn Walker <shawn.walker@sun.com>
parents: 451
diff changeset
    86
        print """cherrypy 3.1.0 or greater (but less than 3.2.0) is """ \
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    87
            """required to use this program."""
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    88
        sys.exit(2)
22
379f0f6809ff pkgsend open, pkgsend add file, pkgsend close; Transaction object
"Stephen Hahn <sch@sun.com>"
parents: 21
diff changeset
    89
114
e21e9aa690ad draft manual pages, index page cleanup
Stephen Hahn <sch@sun.com>
parents: 106
diff changeset
    90
import pkg.server.face as face
26
ab188d4682d5 catalog processing begins
"Stephen Hahn <sch@sun.com>"
parents: 25
diff changeset
    91
import pkg.server.config as config
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    92
import pkg.server.depot as depot
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
    93
import pkg.server.repository as repo
428
e011e45fe2cd 2239 repository attribute system needed
Shawn Walker <shawn.walker@sun.com>
parents: 409
diff changeset
    94
import pkg.server.repositoryconfig as rc
466
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
    95
from pkg.misc import port_available, msg, emsg
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
    96
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
    97
class LogSink(object):
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
    98
        """This is a dummy object that we can use to discard log entries
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
    99
        without relying on non-portable interfaces such as /dev/null."""
23
51b8b48fea32 begin server source reorganization
"Stephen Hahn <sch@sun.com>"
parents: 22
diff changeset
   100
466
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   101
        def write(self, *args, **kwargs):
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   102
                """Discard the bits."""
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   103
                pass
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   104
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   105
        def flush(self, *args, **kwargs):
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   106
                """Discard the bits."""
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   107
                pass
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   108
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   109
def usage(text):
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   110
        if text:
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   111
                emsg(text)
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   112
26
ab188d4682d5 catalog processing begins
"Stephen Hahn <sch@sun.com>"
parents: 25
diff changeset
   113
        print """\
589
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   114
Usage: /usr/lib/pkg.depotd [-d repo_dir] [-p port] [-s threads]
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   115
           [-t socket_timeout] [--content-root] [--log-access dest]
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   116
           [--log-errors dest] [--mirror] [--proxy-base url] [--readonly]
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   117
           [--rebuild]
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   118
589
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   119
        --content-root  The file system path to the directory containing the
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   120
                        the static and other web content used by the depot's
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   121
                        browser user interface.  The default value is
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   122
                        '/usr/share/lib/pkg'.
466
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   123
        --log-access    The destination for any access related information
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   124
                        logged by the depot process.  Possible values are:
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   125
                        stderr, stdout, none, or an absolute pathname.  The
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   126
                        default value is stdout if stdout is a tty; otherwise
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   127
                        the default value is none.
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   128
        --log-errors    The destination for any errors or other information
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   129
                        logged by the depot process.  Possible values are:
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   130
                        stderr, stdout, none, or an absolute pathname.  The
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   131
                        default value is stderr.
589
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   132
        --mirror        Package mirror mode; publishing and metadata operations
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   133
                        disallowed.  Cannot be used with --readonly or
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   134
                        --rebuild.
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   135
        --proxy-base    The url to use as the base for generating internal
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   136
                        redirects and content.
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   137
        --readonly      Read-only operation; modifying operations disallowed.
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   138
                        Cannot be used with --mirror or --rebuild.
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   139
        --rebuild       Re-build the catalog from pkgs in depot.  Cannot be
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   140
                        used with --mirror or --readonly.
26
ab188d4682d5 catalog processing begins
"Stephen Hahn <sch@sun.com>"
parents: 25
diff changeset
   141
"""
135
a1e20e9a9845 add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents: 119
diff changeset
   142
        sys.exit(2)
14
969c85e852af start pkg graph management, annotate pkgsend with server states
"Stephen Hahn <sch@sun.com>"
parents: 3
diff changeset
   143
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   144
class OptionError(Exception):
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 428
diff changeset
   145
        """Option exception. """
14
969c85e852af start pkg graph management, annotate pkgsend with server states
"Stephen Hahn <sch@sun.com>"
parents: 3
diff changeset
   146
404
e5329e84b9a8 2331 depot command-line parsing errors cause traceback
Shawn Walker <swalker@opensolaris.org>
parents: 386
diff changeset
   147
        def __init__(self, *args):
e5329e84b9a8 2331 depot command-line parsing errors cause traceback
Shawn Walker <swalker@opensolaris.org>
parents: 386
diff changeset
   148
                Exception.__init__(self, *args)
30
f06ad6cb4b3f stop using flavour terminology
Stephen Hahn <sch@sun.com>
parents: 29
diff changeset
   149
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   150
if __name__ == "__main__":
30
f06ad6cb4b3f stop using flavour terminology
Stephen Hahn <sch@sun.com>
parents: 29
diff changeset
   151
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   152
        port = PORT_DEFAULT
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   153
        threads = THREADS_DEFAULT
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   154
        socket_timeout = SOCKET_TIMEOUT_DEFAULT
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   155
        readonly = READONLY_DEFAULT
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   156
        rebuild = REBUILD_DEFAULT
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 428
diff changeset
   157
        reindex = REINDEX_DEFAULT
451
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
   158
        proxy_base = None
461
37cf3ac75e37 1018 actions with payloads should include all sizes and hashes
johansen <johansen@sun.com>
parents: 452
diff changeset
   159
        mirror = MIRROR_DEFAULT
258
b3b7592412ec 270 Need ability to rename packages
johansen <johansen@sun.com>
parents: 239
diff changeset
   160
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   161
        if "PKG_REPO" in os.environ:
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   162
                repo_path = os.environ["PKG_REPO"]
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   163
        else:
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   164
                repo_path = REPO_PATH_DEFAULT
30
f06ad6cb4b3f stop using flavour terminology
Stephen Hahn <sch@sun.com>
parents: 29
diff changeset
   165
589
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   166
        try:
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   167
                content_root = os.environ["PKG_DEPOT_CONTENT"]
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   168
        except KeyError:
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   169
                try:
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   170
                        content_root = os.path.join(os.environ['PKG_HOME'],
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   171
                            'share/lib/pkg')
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   172
                except KeyError:
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   173
                        content_root = CONTENT_PATH_DEFAULT
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   174
466
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   175
        # By default, if the destination for a particular log type is not
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   176
        # specified, this is where we will send the output.
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   177
        log_routes = {
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   178
            "access": "none",
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   179
            "errors": "stderr"
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   180
        }
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   181
        log_opts = ["--log-%s" % log_type for log_type in log_routes]
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   182
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   183
        # If stdout is a tty, then send access output there by default instead
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   184
        # of discarding it.
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   185
        if os.isatty(sys.stdout.fileno()):
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   186
                log_routes["access"] = "stdout"
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   187
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   188
        opt = None
54
a0c517c20618 Don't throw an exception if the depot can't find a file
Danek Duvall <danek.duvall@sun.com>
parents: 52
diff changeset
   189
        try:
589
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   190
                long_opts = ["content-root=", "mirror", "proxy-base=",
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   191
                    "readonly", "rebuild", "refresh-index"]
466
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   192
                for opt in log_opts:
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   193
                        long_opts.append("%s=" % opt.lstrip('--'))
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   194
                opts, pargs = getopt.getopt(sys.argv[1:], "d:np:s:t:",
466
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   195
                    long_opts)
135
a1e20e9a9845 add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents: 119
diff changeset
   196
                for opt, arg in opts:
a1e20e9a9845 add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents: 119
diff changeset
   197
                        if opt == "-n":
a1e20e9a9845 add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents: 119
diff changeset
   198
                                sys.exit(0)
a1e20e9a9845 add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents: 119
diff changeset
   199
                        elif opt == "-d":
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   200
                                repo_path = arg
135
a1e20e9a9845 add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents: 119
diff changeset
   201
                        elif opt == "-p":
a1e20e9a9845 add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents: 119
diff changeset
   202
                                port = int(arg)
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   203
                        elif opt == "-s":
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   204
                                threads = int(arg)
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   205
                                if threads < THREADS_MIN:
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   206
                                        raise OptionError, \
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   207
                                            "minimum value is %d" % THREADS_MIN
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   208
                                if threads > THREADS_MAX:
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   209
                                        raise OptionError, \
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   210
                                            "maximum value is %d" % THREADS_MAX
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   211
                        elif opt == "-t":
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   212
                                socket_timeout = int(arg)
589
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   213
                        elif opt == "--content-root":
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   214
                                if arg == "":
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   215
                                        raise OptionError, "You must specify " \
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   216
                                            "a directory path."
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   217
                                content_root = arg
466
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   218
                        elif opt in log_opts:
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   219
                                if arg is None or arg == "":
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   220
                                        raise OptionError, \
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   221
                                            "You must specify a log " \
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   222
                                            "destination."
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   223
                                log_routes[opt.lstrip("--log-")] = arg
589
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   224
                        elif opt == "--mirror":
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   225
                                mirror = True
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   226
                        elif opt == "--proxy-base":
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   227
                                # Attempt to decompose the url provided into
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   228
                                # its base parts.  This is done so we can
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   229
                                # remove any scheme information since we
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   230
                                # don't need it.
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   231
                                scheme, netloc, path, params, query, \
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   232
                                    fragment = urlparse.urlparse(arg,
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   233
                                    allow_fragments=0)
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   234
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   235
                                # Rebuild the url without the scheme and
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   236
                                # remove the leading // urlunparse adds.
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   237
                                proxy_base = urlparse.urlunparse(("", netloc,
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   238
                                    path, params, query, fragment)
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   239
                                    ).lstrip("//")
135
a1e20e9a9845 add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents: 119
diff changeset
   240
                        elif opt == "--readonly":
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   241
                                readonly = True
157
504b9e6d213c Catalog should be on-disk instead of in memory
johansen <johansen@sun.com>
parents: 146
diff changeset
   242
                        elif opt == "--rebuild":
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   243
                                rebuild = True
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 428
diff changeset
   244
                        elif opt == "--refresh-index":
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 428
diff changeset
   245
                                # Note: This argument is for internal use
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 428
diff changeset
   246
                                # only. It's used when pkg.depotd is reexecing
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 428
diff changeset
   247
                                # itself and needs to know that's the case.
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 428
diff changeset
   248
                                # This flag is purposefully omitted in usage.
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 428
diff changeset
   249
                                # The supported way to forcefully reindex is to
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 428
diff changeset
   250
                                # kill any pkg.depot using that directory,
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 428
diff changeset
   251
                                # remove the index directory, and restart the
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 428
diff changeset
   252
                                # pkg.depot process. The index will be rebuilt
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 428
diff changeset
   253
                                # automatically on startup.
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 428
diff changeset
   254
                                reindex = True
135
a1e20e9a9845 add CLI test suite, correct bugs found by test suite, ration out CLI options
Stephen Hahn <sch@Sun.COM>
parents: 119
diff changeset
   255
        except getopt.GetoptError, e:
466
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   256
                usage("pkg.depotd: %s" % e.msg)
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   257
        except OptionError, e:
466
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   258
                usage("pkg.depotd: option: %s -- %s" % (opt, e))
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   259
        except (ArithmeticError, ValueError):
466
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   260
                usage("pkg.depotd: illegal option value: %s specified " \
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   261
                    "for option: %s" % (arg, opt))
451
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
   262
445
76b03dd5a4ac 2693 Indexing code and catalog code should respect --read-only
Brock Pytlik <bpytlik@sun.com>
parents: 429
diff changeset
   263
        if rebuild and reindex:
466
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   264
                usage("--refresh-index cannot be used with --rebuild")
461
37cf3ac75e37 1018 actions with payloads should include all sizes and hashes
johansen <johansen@sun.com>
parents: 452
diff changeset
   265
        if rebuild and (readonly or mirror):
466
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   266
                usage("--readonly and --mirror cannot be used with --rebuild")
461
37cf3ac75e37 1018 actions with payloads should include all sizes and hashes
johansen <johansen@sun.com>
parents: 452
diff changeset
   267
        if reindex and (readonly or mirror):
466
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   268
                usage("--readonly and --mirror cannot be used with " \
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   269
                    "--refresh-index")
451
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
   270
429
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 428
diff changeset
   271
        # If the program is going to reindex, the port is irrelevant since
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 428
diff changeset
   272
        # the program will not bind to a port.
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 428
diff changeset
   273
        if not reindex:
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 428
diff changeset
   274
                available, msg = port_available(None, port)
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 428
diff changeset
   275
                if not available:
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 428
diff changeset
   276
                        print "pkg.depotd: unable to bind to the specified " \
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 428
diff changeset
   277
                            "port: %d. Reason: %s" % (port, msg)
6c9cbb6e6600 983 pkg search returns just one action per package/token-type combo
Brock Pytlik <bpytlik@sun.com>
parents: 428
diff changeset
   278
                        sys.exit(1)
386
5cd680466abe 2147 depot should check port instead of showing traceback if port binding fails
Shawn Walker <swalker@opensolaris.org>
parents: 382
diff changeset
   279
589
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   280
        scfg = config.SvrConfig(repo_path, content_root, AUTH_DEFAULT)
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   281
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   282
        if rebuild:
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   283
                scfg.destroy_catalog()
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   284
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   285
        if readonly:
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   286
                scfg.set_read_only()
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   287
461
37cf3ac75e37 1018 actions with payloads should include all sizes and hashes
johansen <johansen@sun.com>
parents: 452
diff changeset
   288
        if mirror:
37cf3ac75e37 1018 actions with payloads should include all sizes and hashes
johansen <johansen@sun.com>
parents: 452
diff changeset
   289
                scfg.set_mirror()
37cf3ac75e37 1018 actions with payloads should include all sizes and hashes
johansen <johansen@sun.com>
parents: 452
diff changeset
   290
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   291
        try:
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   292
                scfg.init_dirs()
589
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   293
        except (RuntimeError, EnvironmentError), e:
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   294
                print "pkg.depotd: an error occurred while trying to " \
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   295
                    "initialize the depot repository directory " \
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   296
                    "structures:\n%s" % e
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   297
                sys.exit(1)
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   298
452
01f53c6381af 2714 image-update failure during update phase
Shawn Walker <shawn.walker@sun.com>
parents: 451
diff changeset
   299
        # Setup our global configuration.
466
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   300
        # Global cherrypy configuration
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   301
        gconf = {
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   302
            "environment": "production",
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   303
            "checker.on": True,
466
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   304
            "log.screen": False,
452
01f53c6381af 2714 image-update failure during update phase
Shawn Walker <shawn.walker@sun.com>
parents: 451
diff changeset
   305
            "server.socket_host": "0.0.0.0",
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   306
            "server.socket_port": port,
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   307
            "server.thread_pool": threads,
466
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   308
            "server.socket_timeout": socket_timeout,
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   309
            "tools.log_headers.on": True
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   310
        }
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   311
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   312
        log_type_map = {
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   313
            "errors": {
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   314
                "param": "log.error_file",
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   315
                "attr": "error_log"
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   316
            },
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   317
            "access": {
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   318
                "param": "log.access_file",
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   319
                "attr": "access_log"
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   320
            }
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   321
        }
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   322
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   323
        for log_type in log_type_map:
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   324
                dest = log_routes[log_type]
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   325
                if dest in ("stdout", "stderr", "none"):
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   326
                        if dest == "none":
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   327
                                h = logging.StreamHandler(LogSink())
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   328
                        else:
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   329
                                h = logging.StreamHandler(eval("sys.%s" % \
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   330
                                    dest))
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   331
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   332
                        h.setLevel(logging.DEBUG)
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   333
                        h.setFormatter(cherrypy._cplogging.logfmt)
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   334
                        log_obj = eval("cherrypy.log.%s" % \
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   335
                            log_type_map[log_type]["attr"])
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   336
                        log_obj.addHandler(h)
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   337
                        # Since we've replaced cherrypy's log handler with our
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   338
                        # own, we don't want the output directed to a file.
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   339
                        dest = ""
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   340
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   341
                gconf[log_type_map[log_type]["param"]] = dest
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   342
451
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
   343
        # Now build our site configuration.
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   344
        conf = {
452
01f53c6381af 2714 image-update failure during update phase
Shawn Walker <shawn.walker@sun.com>
parents: 451
diff changeset
   345
            "/": {
01f53c6381af 2714 image-update failure during update phase
Shawn Walker <shawn.walker@sun.com>
parents: 451
diff changeset
   346
                # We have to override cherrypy's default response_class so that
01f53c6381af 2714 image-update failure during update phase
Shawn Walker <shawn.walker@sun.com>
parents: 451
diff changeset
   347
                # we have access to the write() callable to stream data
01f53c6381af 2714 image-update failure during update phase
Shawn Walker <shawn.walker@sun.com>
parents: 451
diff changeset
   348
                # directly to the client.
01f53c6381af 2714 image-update failure during update phase
Shawn Walker <shawn.walker@sun.com>
parents: 451
diff changeset
   349
                "wsgi.response_class": depot.DepotResponse,
01f53c6381af 2714 image-update failure during update phase
Shawn Walker <shawn.walker@sun.com>
parents: 451
diff changeset
   350
            },
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   351
            "/robots.txt": {
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   352
                "tools.staticfile.on": True,
589
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   353
                "tools.staticfile.filename": os.path.join(scfg.web_static_root,
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   354
                    "robots.txt")
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   355
            },
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   356
            "/static": {
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   357
                "tools.staticdir.on": True,
589
2480ab0274d1 242 desire ability to set content root
Shawn Walker <Shawn.Walker@Sun.COM>
parents: 468
diff changeset
   358
                "tools.staticdir.root": scfg.web_static_root,
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   359
                "tools.staticdir.dir": ""
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   360
            }
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   361
        }
145
08bee7fd13f6 Add versioning to the protocols
Danek Duvall <danek.duvall@sun.com>
parents: 135
diff changeset
   362
451
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
   363
        if proxy_base:
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
   364
                # This changes the base URL for our server, and is primarily
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
   365
                # intended to allow our depot process to operate behind Apache
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
   366
                # or some other webserver process.
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
   367
                #
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
   368
                # Visit the following URL for more information:
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
   369
                #    http://cherrypy.org/wiki/BuiltinTools#tools.proxy
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
   370
                proxy_conf = {
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
   371
                        "tools.proxy.on": True,
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
   372
                        "tools.proxy.local": "",
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
   373
                        "tools.proxy.base": proxy_base
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
   374
                }
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
   375
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
   376
                if "/" not in conf:
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
   377
                        conf["/"] = {}
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
   378
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
   379
                # Now merge or add our proxy configuration information into the
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
   380
                # existing configuration.
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
   381
                for entry in proxy_conf:
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
   382
                        conf["/"][entry] = proxy_conf[entry]
74f1fe85fe2d 1324 RSS / Atom feeds of repository updates
Shawn Walker <shawn.walker@sun.com>
parents: 445
diff changeset
   383
466
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   384
        cherrypy.config.update(gconf)
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   385
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   386
        # Now that our logging, etc. has been setup, it's safe to perform any
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   387
        # remaining preparation.
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   388
        if reindex:
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   389
                scfg.acquire_catalog(rebuild=False)
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   390
                scfg.catalog.run_update_index()
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   391
                sys.exit(0)
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   392
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   393
        scfg.acquire_in_flight()
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   394
        scfg.acquire_catalog()
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   395
217
a53bcf30c049 279 catalog_update should cope with HTTPError
johansen <johansen@sun.com>
parents: 215
diff changeset
   396
        try:
466
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   397
                root = cherrypy.Application(repo.Repository(scfg))
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   398
        except rc.InvalidAttributeValueError, e:
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   399
                emsg("pkg.depotd: repository.conf error: %s" % e)
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   400
                sys.exit(1)
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   401
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   402
        try:
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   403
                cherrypy.quickstart(root, config=conf)
382
95304bd3b365 1854 rework depot to use higher-level framework
Shawn Walker <swalker@opensolaris.org>
parents: 374
diff changeset
   404
        except:
466
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   405
                usage("pkg.depotd: unknown error starting depot, illegal " \
7cfb6502ff1b 2333 control over access / error log destination desired
Shawn Walker <shawn.walker@sun.com>
parents: 461
diff changeset
   406
                    "option value specified?")
217
a53bcf30c049 279 catalog_update should cope with HTTPError
johansen <johansen@sun.com>
parents: 215
diff changeset
   407