src/depot-config.py
author Yiteng Zhang <yiteng.zhang@oracle.com>
Mon, 09 Sep 2013 10:52:27 -0700
changeset 2942 17aad7c202b0
parent 2852 5650587d9468
child 2954 4b449f059c78
permissions -rwxr-xr-x
17336089 modules/server/repository.py is missing a module import
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2852
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
     1
#!/usr/bin/python2.6
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
     2
#
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
     3
# CDDL HEADER START
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
     4
#
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
     5
# The contents of this file are subject to the terms of the
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
     6
# Common Development and Distribution License (the "License").
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
     7
# You may not use this file except in compliance with the License.
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
     8
#
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
     9
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    10
# or http://www.opensolaris.org/os/licensing.
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    11
# See the License for the specific language governing permissions
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    12
# and limitations under the License.
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    13
#
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    14
# When distributing Covered Code, include this CDDL HEADER in each
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    15
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    16
# If applicable, add the following below this CDDL HEADER, with the
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    17
# fields enclosed by brackets "[]" replaced with your own identifying
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    18
# information: Portions Copyright [yyyy] [name of copyright owner]
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    19
#
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    20
# CDDL HEADER END
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    21
#
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    22
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    23
#
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    24
# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    25
#
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    26
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    27
import errno
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    28
import getopt
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    29
import gettext
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    30
import locale
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    31
import logging
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    32
import os
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    33
import re
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    34
import shutil
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    35
import socket
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    36
import sys
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    37
import traceback
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    38
import warnings
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    39
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    40
from mako.template import Template
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    41
from mako.lookup import TemplateLookup
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    42
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    43
import pkg
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    44
import pkg.client.api_errors as apx
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    45
import pkg.catalog
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    46
import pkg.config as cfg
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    47
import pkg.misc as misc
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    48
import pkg.portable as portable
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    49
import pkg.p5i as p5i
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    50
import pkg.server.repository as sr
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    51
import pkg.smf as smf
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    52
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    53
from pkg.client import global_settings
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    54
from pkg.client.debugvalues import DebugValues
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    55
from pkg.misc import msg, PipeError
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    56
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    57
logger = global_settings.logger
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    58
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    59
# exit codes
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    60
EXIT_OK      = 0
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    61
EXIT_OOPS    = 1
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    62
EXIT_BADOPT  = 2
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    63
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    64
DEPOT_HTTP_TEMPLATE = "depot_httpd.conf.mako"
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    65
DEPOT_FRAGMENT_TEMPLATE = "depot.conf.mako"
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    66
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    67
DEPOT_HTTP_FILENAME = "depot_httpd.conf"
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    68
DEPOT_FRAGMENT_FILENAME= "depot.conf"
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    69
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    70
DEPOT_PUB_FILENAME = "index.html"
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    71
DEPOT_HTDOCS_DIRNAME = "htdocs"
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    72
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    73
DEPOT_VERSIONS_DIRNAME = ["versions", "0"]
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    74
DEPOT_PUB_DIRNAME = ["publisher", "1"]
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    75
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    76
DEPOT_CACHE_FILENAME = "depot.cache"
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    77
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    78
KNOWN_SERVER_TYPES = ["apache2"]
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    79
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    80
PKG_SERVER_SVC = "svc:/application/pkg/server"
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    81
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    82
# static string with our versions response
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    83
DEPOT_FRAGMENT_VERSIONS_STR = """\
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    84
pkg-server %s
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    85
publisher 0 1
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    86
versions 0
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    87
catalog 1
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    88
file 1
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    89
manifest 0
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    90
""" % pkg.VERSION
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    91
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    92
# versions response used when we provide search capability
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    93
DEPOT_VERSIONS_STR = """%sadmin 0
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    94
search 0 1
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    95
""" % DEPOT_FRAGMENT_VERSIONS_STR
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    96
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    97
DEPOT_USER = "pkg5srv"
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    98
DEPOT_GROUP = "pkg5srv"
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
    99
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   100
class DepotException(Exception):
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   101
        def __unicode__(self):
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   102
        # To workaround python issues 6108 and 2517, this provides a
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   103
        # a standard wrapper for this class' exceptions so that they
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   104
        # have a chance of being stringified correctly.
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   105
                return str(self)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   106
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   107
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   108
def error(text, cmd=None):
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   109
        """Emit an error message prefixed by the command name """
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   110
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   111
        if cmd:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   112
                text = "%s: %s" % (cmd, text)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   113
                pkg_cmd = "pkg.depot-config "
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   114
        else:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   115
                pkg_cmd = "pkg.depot-config: "
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   116
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   117
                # If we get passed something like an Exception, we can convert
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   118
                # it down to a string.
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   119
                text = str(text)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   120
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   121
        # If the message starts with whitespace, assume that it should come
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   122
        # *before* the command-name prefix.
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   123
        text_nows = text.lstrip()
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   124
        ws = text[:len(text) - len(text_nows)]
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   125
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   126
        # This has to be a constant value as we can't reliably get our actual
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   127
        # program name on all platforms.
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   128
        logger.error(ws + pkg_cmd + text_nows)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   129
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   130
def usage(usage_error=None, cmd=None, retcode=EXIT_BADOPT):
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   131
        """Emit a usage message and optionally prefix it with a more
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   132
        specific error message.  Causes program to exit.
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   133
        """
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   134
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   135
        if usage_error:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   136
                error(usage_error, cmd=cmd)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   137
        msg(_("""\
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   138
Usage:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   139
        pkg.depot-config ( -d repository_dir | -S ) -r runtime_dir
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   140
                [-c cache_dir] [-s cache_size] [-p port] [-h hostname]
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   141
                [-l logs_dir] [-T template_dir] [-A]
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   142
                [-t server_type] ( [-F] [-P server_prefix] )
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   143
"""))
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   144
        sys.exit(retcode)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   145
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   146
def _chown_dir(dir):
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   147
        """Sets ownership for the given directory to pkg5srv:pkg5srv"""
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   148
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   149
        uid = portable.get_user_by_name(DEPOT_USER, None, False)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   150
        gid = portable.get_group_by_name(DEPOT_GROUP, None, False)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   151
        try:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   152
                os.chown(dir, uid, gid)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   153
        except OSError, err:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   154
                if not os.environ.get("PKG5_TEST_ENV", None):
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   155
                        raise DepotException(_("Unable to chown %(dir)s to "
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   156
                            "%(user)s:%(group)s: %(err)s") %
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   157
                            {"dir": dir, "user": DEPOT_USER,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   158
                            "group": DEPOT_GROUP, "err": err})
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   159
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   160
def _get_publishers(root):
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   161
        """Given a repository root, return the list of available publishers,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   162
        along with the default publisher/prefix."""
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   163
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   164
        try:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   165
                # we don't set writable_root, as we don't want to take the hit
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   166
                # on potentially building an index here.
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   167
                repository = sr.Repository(root=root, read_only=True)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   168
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   169
                if repository.version != 4:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   170
                        raise DepotException(
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   171
                            _("pkg.depot-config only supports v4 repositories"))
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   172
        except Exception, e:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   173
                raise DepotException(e)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   174
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   175
        all_pubs = [pub.prefix for pub in repository.get_publishers()]
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   176
        try:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   177
                default_pub = repository.cfg.get_property("publisher", "prefix")
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   178
        except cfg.UnknownPropertyError:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   179
                default_pub = None
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   180
        return all_pubs, default_pub
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   181
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   182
def _write_httpd_conf(pubs, default_pubs, runtime_dir, log_dir, template_dir,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   183
        cache_dir, cache_size, host, port, sroot,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   184
        fragment=False, allow_refresh=False):
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   185
        """Writes the webserver configuration for the depot.
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   186
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   187
        pubs            repository and publisher information, a list in the form
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   188
                        [(publisher_prefix, repo_dir, repo_prefix), ... ]
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   189
        default_pubs    default publishers, per repository, a list in the form
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   190
                        [(default_publisher_prefix, repo_dir, repo_prefix) ... ]
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   191
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   192
        runtime_dir     where we write httpd.conf files
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   193
        log_dir         where Apache should write its log files
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   194
        template_dir    where we find our Mako templates
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   195
        cache_dir       where Apache should write its cache and wsgi search idx
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   196
        cache_size      how large our cache can grow
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   197
        host            our hostname, needed to set ServerName properly
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   198
        port            the port on which Apache should listen
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   199
        sroot           the prefix into the server namespace,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   200
                        ignored if fragment==False
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   201
        fragment        True if we should only write a file to drop into conf.d/
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   202
                        (i.e. a partial server configuration)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   203
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   204
        allow_refresh   True if we allow the 'refresh' or 'refresh-indexes'
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   205
                        admin/0 operations
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   206
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   207
        The URI namespace we create on the web server looks like this:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   208
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   209
        <sroot>/<repo_prefix>/<publisher>/<file, catalog etc.>/<version>/
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   210
        <sroot>/<repo_prefix>/<file, catalog etc.>/<version>/
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   211
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   212
        'sroot' is only used when the Apache server is serving other content
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   213
        and we want to separate pkg(5) resources from the other resources
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   214
        provided.
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   215
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   216
        'repo_prefix' exists so that we can disambiguate between multiple
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   217
        repositories that provide the same publisher.
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   218
        """
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   219
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   220
        try:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   221
                # check our hostname
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   222
                socket.getaddrinfo(host, None)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   223
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   224
                # Apache needs IPv6 addresses wrapped in square brackets
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   225
                if ":" in host:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   226
                        host = "[%s]" % host
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   227
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   228
                # check our directories
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   229
                dirs = [runtime_dir]
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   230
                if not fragment:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   231
                        dirs.append(log_dir)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   232
                if cache_dir:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   233
                        dirs.append(cache_dir)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   234
                for dir in dirs + [template_dir]:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   235
                        if os.path.exists(dir) and not os.path.isdir(dir):
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   236
                                raise DepotException(
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   237
                                    _("%s is not a directory") % dir)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   238
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   239
                for dir in dirs:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   240
                        misc.makedirs(dir)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   241
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   242
                # check our port
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   243
                if not fragment:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   244
                        try:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   245
                                num = int(port)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   246
                                if num <= 0 or num >= 65535:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   247
                                        raise DepotException(
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   248
                                            _("invalid port: %s") % port)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   249
                        except ValueError:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   250
                                raise DepotException(_("invalid port: %s") %
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   251
                                    port)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   252
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   253
                # check our cache size
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   254
                try:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   255
                        num = int(cache_size)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   256
                        if num < 0:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   257
                                raise DepotException(_("invalid cache size: "
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   258
                                   "%s") % num)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   259
                except ValueError:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   260
                        raise DepotException(_("invalid cache size: %s") %
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   261
                            cache_size)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   262
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   263
                httpd_conf_template_path = os.path.join(template_dir,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   264
                    DEPOT_HTTP_TEMPLATE)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   265
                fragment_conf_template_path = os.path.join(template_dir,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   266
                    DEPOT_FRAGMENT_TEMPLATE)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   267
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   268
                # we're disabling unicode here because we want Mako to
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   269
                # passthrough any filesystem path names, whatever the
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   270
                # original encoding.
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   271
                conf_lookup = TemplateLookup(directories=[template_dir])
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   272
                if fragment:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   273
                        conf_template = Template(
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   274
                            filename=fragment_conf_template_path,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   275
                            disable_unicode=True, lookup=conf_lookup)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   276
                        conf_path = os.path.join(runtime_dir,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   277
                            DEPOT_FRAGMENT_FILENAME)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   278
                else:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   279
                        conf_template = Template(
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   280
                            filename=httpd_conf_template_path,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   281
                            disable_unicode=True, lookup=conf_lookup)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   282
                        conf_path = os.path.join(runtime_dir,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   283
                            DEPOT_HTTP_FILENAME)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   284
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   285
                conf_text = conf_template.render(
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   286
                    pubs=pubs,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   287
                    default_pubs=default_pubs,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   288
                    log_dir=log_dir,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   289
                    cache_dir=cache_dir,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   290
                    cache_size=cache_size,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   291
                    runtime_dir=runtime_dir,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   292
                    template_dir=template_dir,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   293
                    ipv6_addr="::1",
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   294
                    host=host,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   295
                    port=port,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   296
                    sroot=sroot,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   297
                    allow_refresh=allow_refresh
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   298
                )
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   299
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   300
                with file(conf_path, "wb") as conf_file:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   301
                        conf_file.write(conf_text)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   302
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   303
        except socket.gaierror, err:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   304
                raise DepotException(
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   305
                    _("Unable to write Apache configuration: %(host)s: "
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   306
                    "%(err)s") % locals())
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   307
        except (OSError, IOError, EnvironmentError, apx.ApiException), err:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   308
                traceback.print_exc(err)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   309
                raise DepotException(
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   310
                    _("Unable to write depot_httpd.conf: %s") % err)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   311
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   312
def _write_versions_response(htdocs_path, fragment=False):
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   313
        """Writes a static versions/0 response for the Apache depot."""
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   314
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   315
        try:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   316
                versions_path = os.path.join(htdocs_path,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   317
                    *DEPOT_VERSIONS_DIRNAME)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   318
                misc.makedirs(versions_path)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   319
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   320
                with file(os.path.join(versions_path, "index.html"), "w") as \
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   321
                    versions_file:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   322
                        versions_file.write(
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   323
                            fragment and DEPOT_FRAGMENT_VERSIONS_STR or
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   324
                            DEPOT_VERSIONS_STR)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   325
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   326
                versions_file.close()
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   327
        except (OSError, apx.ApiException), err:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   328
                raise DepotException(
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   329
                    _("Unable to write versions response: %s") % err)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   330
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   331
def _write_publisher_response(pubs, htdocs_path, repo_prefix):
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   332
        """Writes a static publisher/0 response for the depot."""
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   333
        try:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   334
                # convert our list of strings to a list of Publishers
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   335
                pub_objs = [pkg.client.publisher.Publisher(pub) for pub in pubs]
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   336
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   337
                # write individual reponses for the publishers
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   338
                for pub in pub_objs:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   339
                        pub_path = os.path.join(htdocs_path,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   340
                            os.path.sep.join(
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   341
                               [repo_prefix, pub.prefix] + DEPOT_PUB_DIRNAME))
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   342
                        misc.makedirs(pub_path)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   343
                        with file(os.path.join(pub_path, "index.html"), "w") as\
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   344
                            pub_file:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   345
                                p5i.write(pub_file, [pub])
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   346
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   347
                # write a response that contains all publishers
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   348
                pub_path = os.path.join(htdocs_path,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   349
                    os.path.sep.join([repo_prefix] + DEPOT_PUB_DIRNAME))
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   350
                os.makedirs(pub_path)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   351
                with file(os.path.join(pub_path, "index.html"), "w") as \
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   352
                    pub_file:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   353
                        p5i.write(pub_file, pub_objs)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   354
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   355
        except (OSError, apx.ApiException), err:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   356
                raise DepotException(
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   357
                    _("Unable to write publisher response: %s") % err)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   358
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   359
def cleanup_conf(runtime_dir=None):
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   360
        """Destroys an old configuration."""
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   361
        try:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   362
                shutil.rmtree(runtime_dir, ignore_errors=True)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   363
        except OSError, err:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   364
                raise DepotException(
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   365
                    _("Unable to cleanup old configuration: %s") % err)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   366
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   367
def refresh_conf(repo_info, log_dir, host, port, runtime_dir,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   368
            template_dir, cache_dir, cache_size, sroot, fragment=False,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   369
            allow_refresh=False):
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   370
        """Creates a new configuration for the depot."""
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   371
        try:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   372
                ret = EXIT_OK
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   373
                cleanup_conf(runtime_dir=runtime_dir)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   374
                if not repo_info:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   375
                        raise DepotException(_("no repositories found"))
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   376
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   377
                htdocs_path = os.path.join(runtime_dir, DEPOT_HTDOCS_DIRNAME,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   378
                    sroot)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   379
                misc.makedirs(htdocs_path)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   380
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   381
                # pubs and default_pubs are lists of tuples of the form:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   382
                # (publisher prefix, repository root dir, repository prefix)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   383
                pubs = []
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   384
                default_pubs = []
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   385
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   386
                repo_prefixes = [prefix for root, prefix in repo_info]
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   387
                errors = []
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   388
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   389
                # Query each repository for its publisher information.
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   390
                for (repo_root, repo_prefix) in repo_info:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   391
                        try:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   392
                                publishers, default_pub = \
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   393
                                    _get_publishers(repo_root)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   394
                                for pub in publishers:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   395
                                        pubs.append(
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   396
                                            (pub, repo_root,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   397
                                            repo_prefix))
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   398
                                default_pubs.append((default_pub,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   399
                                    repo_root, repo_prefix))
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   400
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   401
                        except DepotException, err:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   402
                                errors.append(str(err))
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   403
                if errors:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   404
                        raise DepotException(_("Unable to get publisher "
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   405
                            "information: %s") % "\n".join(errors))
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   406
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   407
                # Write the publisher/0 response for each repository
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   408
                pubs_by_repo = {}
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   409
                for pub_prefix, repo_root, repo_prefix in pubs:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   410
                        pubs_by_repo.setdefault(repo_prefix, []).append(
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   411
                            pub_prefix)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   412
                for repo_prefix in pubs_by_repo:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   413
                        _write_publisher_response(
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   414
                            pubs_by_repo[repo_prefix], htdocs_path, repo_prefix)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   415
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   416
                _write_httpd_conf(pubs, default_pubs, runtime_dir, log_dir,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   417
                    template_dir, cache_dir, cache_size, host, port, sroot,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   418
                    fragment=fragment, allow_refresh=allow_refresh)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   419
                _write_versions_response(htdocs_path, fragment=fragment)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   420
                # If we're writing a configuration fragment, then the web server
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   421
                # is probably not running as DEPOT_USER:DEPOT_GROUP
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   422
                if not fragment:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   423
                        _chown_dir(runtime_dir)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   424
                        _chown_dir(cache_dir)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   425
                else:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   426
                        msg(_("Created %s/depot.conf") % runtime_dir)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   427
        except (DepotException, OSError, apx.ApiException), err:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   428
                error(err)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   429
                ret = EXIT_OOPS
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   430
        return ret
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   431
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   432
def get_smf_repo_info():
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   433
        """Return a list of repo_info from the online instances of pkg/server
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   434
        which are marked as pkg/standalone = False and pkg/readonly = True."""
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   435
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   436
        smf_instances = smf.check_fmris(None, "%s:*" % PKG_SERVER_SVC)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   437
        repo_info = []
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   438
        for fmri in smf_instances:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   439
                repo_prefix = fmri.split(":")[-1]
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   440
                repo_root = smf.get_prop(fmri, "pkg/inst_root")
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   441
                state = smf.get_prop(fmri, "restarter/state")
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   442
                readonly = smf.get_prop(fmri, "pkg/readonly")
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   443
                standalone = smf.get_prop(fmri, "pkg/standalone")
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   444
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   445
                if (state == "online" and
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   446
                    readonly == "true" and
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   447
                    standalone == "false"):
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   448
                        repo_info.append((repo_root,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   449
                            _affix_slash(repo_prefix)))
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   450
        if not repo_info:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   451
                raise DepotException(_(
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   452
                    "No online, readonly, non-standalone instances of "
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   453
                    "%s found.") % PKG_SERVER_SVC)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   454
        return repo_info
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   455
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   456
def _check_unique_repo_properties(repo_info):
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   457
        """Determine whether the repository root, and supplied prefixes are
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   458
        unique.  The prefixes allow two or more repositories that both contain
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   459
        the same publisher to be differentiated in the Apache configuration, so
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   460
        that requests are routed to the correct repository."""
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   461
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   462
        prefixes = set()
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   463
        roots = set()
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   464
        errors = []
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   465
        for root, prefix in repo_info:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   466
                if prefix in prefixes:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   467
                        errors.append(_("instance %s already exists") % prefix)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   468
                prefixes.add(prefix)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   469
                if root in roots:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   470
                        errors.append(_("repo_root %s already exists") % root)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   471
                roots.add(root)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   472
        if errors:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   473
                raise DepotException("\n".join(errors))
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   474
        return True
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   475
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   476
def _affix_slash(str):
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   477
        val = str.lstrip("/").rstrip("/")
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   478
        if "/" in str:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   479
                raise DepotException(_("cannot use '/' chars in prefixes"))
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   480
        # An RE that matches valid SMF instance names works for prefixes
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   481
        if not re.match(r"^([A-Za-z][_A-Za-z0-9.-]*,)?[A-Za-z][_A-Za-z0-9-]*$",
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   482
            str):
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   483
                raise DepotException(_("%s is not a valid prefix"))
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   484
        return "%s/" % val
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   485
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   486
def main_func():
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   487
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   488
        # some sensible defaults
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   489
        host = "0.0.0.0"
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   490
        # the port we listen on
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   491
        port = None
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   492
        # a list of (repo_dir, repo_prefix) tuples
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   493
        repo_info = []
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   494
        # the path where we store indexes and disk caches
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   495
        cache_dir = None
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   496
        # our maximum cache size, in megabytes
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   497
        cache_size = 0
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   498
        # whether we're writing a full httpd.conf, or just a fragment
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   499
        fragment = False
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   500
        # an optional url-prefix, used to separate pkg5 services from the rest
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   501
        # of the webserver url namespace, only used when running in fragment
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   502
        # mode, otherwise we assume we're the only service running on this
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   503
        # web server instance, and control the entire server URL namespace.
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   504
        sroot = ""
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   505
        # the path where our Mako templates and wsgi scripts are stored
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   506
        template_dir = "/etc/pkg/depot"
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   507
        # a volatile directory used at runtime for storing state
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   508
        runtime_dir = None
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   509
        # where logs are written
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   510
        log_dir = "/var/log/pkg/depot"
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   511
        # whether we should pull configuration from
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   512
        # svc:/application/pkg/server instances
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   513
        use_smf_instances = False
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   514
        # whether we allow admin/0 operations to rebuild the index
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   515
        allow_refresh = False
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   516
        # the current server_type
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   517
        server_type = "apache2"
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   518
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   519
        try:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   520
                opts, pargs = getopt.getopt(sys.argv[1:],
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   521
                    "Ac:d:Fh:l:P:p:r:Ss:t:T:?", ["help", "debug="])
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   522
                for opt, arg in opts:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   523
                        if opt == "--help":
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   524
                                usage()
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   525
                        elif opt == "-h":
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   526
                                host = arg
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   527
                        elif opt == "-c":
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   528
                                cache_dir = arg
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   529
                        elif opt == "-s":
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   530
                                cache_size = arg
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   531
                        elif opt == "-l":
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   532
                                log_dir = arg
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   533
                        elif opt == "-p":
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   534
                                port = arg
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   535
                        elif opt == "-r":
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   536
                                runtime_dir = arg
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   537
                        elif opt == "-T":
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   538
                                template_dir = arg
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   539
                        elif opt == "-t":
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   540
                                server_type = arg
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   541
                        elif opt == "-d":
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   542
                                if "=" not in arg:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   543
                                        usage(_("-d arguments must be in the "
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   544
                                            "form <prefix>=<repo path>"))
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   545
                                prefix, root = arg.split("=", 1)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   546
                                repo_info.append((root, _affix_slash(prefix)))
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   547
                        elif opt == "-P":
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   548
                                sroot = _affix_slash(arg)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   549
                        elif opt == "-F":
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   550
                                fragment = True
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   551
                        elif opt == "-S":
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   552
                                use_smf_instances = True
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   553
                        elif opt == "-A":
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   554
                                allow_refresh = True
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   555
                        elif opt == "--debug":
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   556
                                try:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   557
                                        key, value = arg.split("=", 1)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   558
                                except (AttributeError, ValueError):
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   559
                                        usage(
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   560
                                            _("%(opt)s takes argument of form "
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   561
                                            "name=value, not %(arg)s") % {
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   562
                                            "opt": opt, "arg": arg })
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   563
                                DebugValues.set_value(key, value)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   564
                        else:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   565
                                usage("unknown option %s" % opt)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   566
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   567
        except getopt.GetoptError, e:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   568
                usage(_("illegal global option -- %s") % e.opt)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   569
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   570
        if not runtime_dir:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   571
                usage(_("required runtime dir option -r missing."))
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   572
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   573
        # we need a cache_dir to store the search indexes
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   574
        if not cache_dir and not fragment:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   575
                usage(_("cache_dir option -c is required if -F is not used."))
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   576
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   577
        if not fragment and not port:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   578
                usage(_("required port option -p missing."))
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   579
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   580
        if not use_smf_instances and not repo_info:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   581
                usage(_("at least one -d option is required if -S is "
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   582
                    "not used."))
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   583
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   584
        if repo_info and use_smf_instances:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   585
                usage(_("cannot use -d and -S together."))
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   586
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   587
        if fragment and port:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   588
                usage(_("cannot use -F and -p together."))
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   589
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   590
        if fragment and allow_refresh:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   591
                usage(_("cannot use -F and -A together."))
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   592
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   593
        if sroot and not fragment:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   594
                usage(_("cannot use -P without -F."))
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   595
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   596
        if use_smf_instances:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   597
                try:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   598
                        repo_info = get_smf_repo_info()
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   599
                except DepotException, e:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   600
                        error(e)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   601
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   602
        # In the future we may produce configuration for different
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   603
        # HTTP servers. For now, we only support "apache2"
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   604
        if server_type not in KNOWN_SERVER_TYPES:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   605
                usage(_("unknown server type %(type)s. "
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   606
                    "Known types are: %(known)s") %
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   607
                    {"type": server_type,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   608
                    "known": ", ".join(KNOWN_SERVER_TYPES)})
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   609
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   610
        _check_unique_repo_properties(repo_info)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   611
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   612
        ret = refresh_conf(repo_info, log_dir, host, port, runtime_dir,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   613
            template_dir, cache_dir, cache_size, sroot, fragment=fragment,
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   614
            allow_refresh=allow_refresh)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   615
        return ret
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   616
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   617
#
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   618
# Establish a specific exit status which means: "python barfed an exception"
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   619
# so that we can more easily detect these in testing of the CLI commands.
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   620
#
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   621
def handle_errors(func, *args, **kwargs):
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   622
        """Catch exceptions raised by the main program function and then print
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   623
        a message and/or exit with an appropriate return code.
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   624
        """
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   625
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   626
        traceback_str = misc.get_traceback_message()
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   627
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   628
        try:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   629
                # Out of memory errors can be raised as EnvironmentErrors with
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   630
                # an errno of ENOMEM, so in order to handle those exceptions
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   631
                # with other errnos, we nest this try block and have the outer
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   632
                # one handle the other instances.
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   633
                try:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   634
                        __ret = func(*args, **kwargs)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   635
                except (MemoryError, EnvironmentError), __e:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   636
                        if isinstance(__e, EnvironmentError) and \
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   637
                            __e.errno != errno.ENOMEM:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   638
                                raise
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   639
                        error("\n" + misc.out_of_memory())
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   640
                        __ret = EXIT_OOPS
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   641
        except SystemExit, __e:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   642
                raise __e
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   643
        except (PipeError, KeyboardInterrupt):
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   644
                # Don't display any messages here to prevent possible further
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   645
                # broken pipe (EPIPE) errors.
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   646
                __ret = EXIT_OOPS
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   647
        except:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   648
                traceback.print_exc()
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   649
                error(traceback_str)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   650
                __ret = 99
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   651
        return __ret
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   652
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   653
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   654
if __name__ == "__main__":
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   655
        misc.setlocale(locale.LC_ALL, "", error)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   656
        gettext.install("pkg", "/usr/share/locale",
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   657
            codeset=locale.getpreferredencoding())
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   658
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   659
        # Make all warnings be errors.
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   660
        warnings.simplefilter('error')
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   661
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   662
        __retval = handle_errors(main_func)
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   663
        try:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   664
                logging.shutdown()
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   665
        except IOError:
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   666
                # Ignore python's spurious pipe problems.
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   667
                pass
5650587d9468 15807357 need an Apache-based pkg.depotd
Tim Foster <tim.s.foster@oracle.com>
parents:
diff changeset
   668
        sys.exit(__retval)