src/sysrepo.py
author Shawn Walker <shawn.walker@oracle.com>
Fri, 09 Sep 2011 15:21:40 -0700
changeset 2550 71fe32689f17
parent 2547 032eaff05522
child 2569 1f9f50d0cde3
permissions -rwxr-xr-x
18914 pkg warns about image modification even if image is not liveroot
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
     1
#!/usr/bin/python2.6
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
     2
#
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
     3
# CDDL HEADER START
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
     4
#
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
     5
# The contents of this file are subject to the terms of the
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
     6
# Common Development and Distribution License (the "License").
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
     7
# You may not use this file except in compliance with the License.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
     8
#
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
     9
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    10
# or http://www.opensolaris.org/os/licensing.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    11
# See the License for the specific language governing permissions
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    12
# and limitations under the License.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    13
#
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    14
# When distributing Covered Code, include this CDDL HEADER in each
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    15
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    16
# If applicable, add the following below this CDDL HEADER, with the
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    17
# fields enclosed by brackets "[]" replaced with your own identifying
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    18
# information: Portions Copyright [yyyy] [name of copyright owner]
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    19
#
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    20
# CDDL HEADER END
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    21
#
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    22
# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    23
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    24
import atexit
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    25
import errno
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    26
import getopt
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    27
import gettext
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    28
import hashlib
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    29
import locale
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    30
import logging
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    31
import os
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    32
import shutil
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    33
import socket
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    34
import sys
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    35
import traceback
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    36
import urllib2
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    37
import warnings
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    38
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    39
from mako.template import Template
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    40
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    41
from pkg.client import global_settings
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    42
from pkg.misc import msg, PipeError
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    43
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    44
import pkg
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    45
import pkg.catalog
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    46
import pkg.client.api
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    47
import pkg.client.progress as progress
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    48
import pkg.client.api_errors as apx
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    49
import pkg.misc as misc
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    50
import pkg.portable as portable
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    51
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    52
logger = global_settings.logger
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    53
orig_cwd = None
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    54
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    55
PKG_CLIENT_NAME = "pkg.sysrepo"
2550
71fe32689f17 18914 pkg warns about image modification even if image is not liveroot
Shawn Walker <shawn.walker@oracle.com>
parents: 2547
diff changeset
    56
CLIENT_API_VERSION = 70
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    57
pkg.client.global_settings.client_name = PKG_CLIENT_NAME
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    58
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    59
# exit codes
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    60
EXIT_OK      = 0
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    61
EXIT_OOPS    = 1
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    62
EXIT_BADOPT  = 2
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    63
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    64
#
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    65
# This is a simple python script, run from the method script that starts
2335
33734ca16f74 18254 system repository package should be renamed
Brock Pytlik <brock.pytlik@oracle.com>
parents: 2319
diff changeset
    66
# svc:/application/pkg/system-repository:default.
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    67
#
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    68
# It writes an Apache configuration that is used to serve responses to pkg
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    69
# clients querying the system repository, as well as providing http/https proxy
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    70
# services to those clients, accessing external repositories.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    71
# file:// repositories on the system running the system repository are also
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    72
# exposed to pkg clients, via Alias directives.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    73
#
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    74
# See src/util/apache2/sysrepo/*.mako for the templates used to create the
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    75
# Apache configuration.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    76
#
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    77
# The following filesystem locations are used:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    78
#
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    79
# variable      default install path          description
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    80
# ---------     ---------------------         ------------
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    81
# runtime_dir   system/volatile/pkg/sysrepo   runtime .conf, htdocs, pid files
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    82
# template_dir  etc/pkg/sysrepo               mako templates
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    83
# log_dir       var/log/pkg/sysrepo           log files
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    84
# cache_dir     var/cache/pkg/sysrepo         apache proxy cache
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    85
#
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    86
# all of the above can be modified with command line arguments.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    87
#
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    88
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    89
SYSREPO_CRYPTO_FILENAME = "crypto.txt"
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    90
SYSREPO_HTTP_TEMPLATE = "sysrepo_httpd.conf.mako"
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    91
SYSREPO_HTTP_FILENAME = "sysrepo_httpd.conf"
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    92
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    93
SYSREPO_PUB_TEMPLATE = "sysrepo_publisher_response.mako"
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    94
SYSREPO_PUB_FILENAME = "index.html"
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    95
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    96
SYSREPO_HTDOCS_DIRNAME = "htdocs"
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    97
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    98
SYSREPO_VERSIONS_DIRNAME = ["versions", "0"]
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    99
SYSREPO_SYSPUB_DIRNAME = ["syspub", "0"]
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   100
SYSREPO_PUB_DIRNAME = ["publisher", "0"]
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   101
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   102
# static string with our versions response
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   103
SYSREPO_VERSIONS_STR = """\
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   104
pkg-server %s
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   105
publisher 0
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   106
versions 0
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   107
catalog 1
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   108
file 1
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   109
syspub 0
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   110
manifest 0
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   111
""" % pkg.VERSION
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   112
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   113
SYSREPO_USER = "pkg5srv"
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   114
SYSREPO_GROUP = "pkg5srv"
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   115
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   116
class SysrepoException(Exception):
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   117
        def __unicode__(self):
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   118
        # To workaround python issues 6108 and 2517, this provides a
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   119
        # a standard wrapper for this class' exceptions so that they
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   120
        # have a chance of being stringified correctly.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   121
                return str(self)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   122
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   123
@atexit.register
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   124
def cleanup():
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   125
        """To be called at program finish."""
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   126
        pass
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   127
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   128
def error(text, cmd=None):
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   129
        """Emit an error message prefixed by the command name """
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   130
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   131
        if cmd:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   132
                text = "%s: %s" % (cmd, text)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   133
                pkg_cmd = "pkg.sysrepo "
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   134
        else:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   135
                pkg_cmd = "pkg.sysrepo: "
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   136
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   137
                # If we get passed something like an Exception, we can convert
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   138
                # it down to a string.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   139
                text = str(text)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   140
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   141
        # If the message starts with whitespace, assume that it should come
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   142
        # *before* the command-name prefix.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   143
        text_nows = text.lstrip()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   144
        ws = text[:len(text) - len(text_nows)]
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   145
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   146
        # This has to be a constant value as we can't reliably get our actual
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   147
        # program name on all platforms.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   148
        logger.error(ws + pkg_cmd + text_nows)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   149
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   150
def usage(usage_error=None, cmd=None, retcode=EXIT_BADOPT):
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   151
        """Emit a usage message and optionally prefix it with a more
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   152
        specific error message.  Causes program to exit.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   153
        """
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   154
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   155
        if usage_error:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   156
                error(usage_error, cmd=cmd)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   157
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   158
        msg(_("""\
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   159
Usage:
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   160
        pkg.sysrepo -p <port> [-R image_root] [ -c cache_dir] [-h hostname]
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   161
                [-l logs_dir] [-r runtime_dir] [-s cache_size] [-t template_dir]
2479
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   162
                [-T http_timeout] [-w http_proxy] [-W https_proxy]
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   163
     """))
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   164
        sys.exit(retcode)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   165
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   166
def _get_image(image_dir):
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   167
        """Return a pkg.client.api.ImageInterface for the provided
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   168
        image directory."""
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   169
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   170
        cdir = os.getcwd()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   171
        if not image_dir:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   172
                image_dir = "/"
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   173
        api_inst = None
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   174
        tracker = progress.QuietProgressTracker()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   175
        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   176
                api_inst = pkg.client.api.ImageInterface(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   177
                    image_dir, CLIENT_API_VERSION,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   178
                    tracker, None, PKG_CLIENT_NAME)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   179
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   180
                if api_inst.root != image_dir:
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   181
                        msg(_("Problem getting image at %s") % image_dir)
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   182
        except Exception, err:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   183
                raise SysrepoException(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   184
                    _("Unable to get image at %(dir)s: %(reason)s") %
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   185
                    {"dir": image_dir,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   186
                    "reason": str(err)})
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   187
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   188
        # restore the current directory, which ImageInterace had changed
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   189
        os.chdir(cdir)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   190
        return api_inst
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   191
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   192
def _follow_redirects(uri_list, http_timeout):
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   193
        """ Follow HTTP redirects from servers.  Needed so that we can create
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   194
        RewriteRules for all repository URLs that pkg clients may encounter."""
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   195
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   196
        ret_uris = set(uri_list)
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   197
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   198
        class SysrepoRedirectHandler(urllib2.HTTPRedirectHandler):
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   199
                """ A HTTPRedirectHandler that saves URIs we've been
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   200
                redirected to along the path to our eventual destination."""
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   201
                def __init__(self):
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   202
                        self.redirects = set()
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   203
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   204
                def redirect_request(self, req, fp, code, msg, hdrs, newurl):
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   205
                        self.redirects.add(newurl)
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   206
                        return urllib2.HTTPRedirectHandler.redirect_request(
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   207
                            self, req, fp, code, msg, hdrs, newurl)
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   208
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   209
        for uri in uri_list:
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   210
                handler = SysrepoRedirectHandler()
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   211
                opener = urllib2.build_opener(handler)
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   212
                if not uri.startswith("http:"):
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   213
                        ret_uris.update([uri])
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   214
                        continue
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   215
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   216
                # otherwise, open a known url to check for redirects
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   217
                try:
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   218
                        opener.open("%s/versions/0" % uri, None, http_timeout)
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   219
                        ret_uris.update(set(
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   220
                            [item.replace("/versions/0", "").rstrip("/")
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   221
                            for item in handler.redirects]))
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   222
                except urllib2.URLError, err:
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   223
                        # We need to log this, and carry on - the url
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   224
                        # could become available at a later date.
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   225
                        msg(_("WARNING: unable to access %(uri)s when checking "
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   226
                            "for redirects: %(err)s") % locals())
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   227
        return sorted(list(ret_uris))
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   228
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   229
def _get_publisher_info(api_inst, http_timeout):
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   230
        """Returns information about the publishers configured for the given
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   231
        ImageInterface.
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   232
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   233
        The first item returned is a map of uris to tuples, (prefix, cert, key,
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   234
        hash of the uri)
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   235
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   236
        The second item returned is a list of publisher prefixes which specify
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   237
        no uris."""
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   238
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   239
        # build a map of URI to (pub.prefix, cert, key, hash) tuples
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   240
        uri_pub_map = {}
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   241
        no_uri_pubs = []
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   242
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   243
        for pub in api_inst.get_publishers():
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   244
                if pub.disabled:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   245
                        continue
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   246
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   247
                prefix = pub.prefix
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   248
                repo = pub.repository
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   249
                uri_list = _follow_redirects(
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   250
                    [repo_uri.uri.rstrip("/")
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   251
                    for repo_uri in repo.mirrors + repo.origins],
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   252
                    http_timeout)
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   253
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   254
                for uri in uri_list:
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   255
                        # we don't support p5p archives, only directory-based
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   256
                        # repositories.  We also don't support file repositories
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   257
                        # of < version 4.
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   258
                        if uri.startswith("file:"):
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   259
                                urlresult = urllib2.urlparse.urlparse(uri)
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   260
                                if not os.path.exists(urlresult.path):
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   261
                                        raise SysrepoException(
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   262
                                            _("file repository %s does not "
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   263
                                            "exist or is not accessible") % uri)
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   264
                                if not os.path.isdir(urlresult.path):
2367
49e71b6682c7 18297 system-repository needs to be enabled more
Tim Foster <tim.s.foster@oracle.com>
parents: 2339
diff changeset
   265
                                        raise SysrepoException(
49e71b6682c7 18297 system-repository needs to be enabled more
Tim Foster <tim.s.foster@oracle.com>
parents: 2339
diff changeset
   266
                                            _("p5p-based file repository %s "
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   267
                                            "cannot be proxied.") % uri)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   268
                                if not os.path.exists(os.path.join(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   269
                                    urlresult.path, "pkg5.repository")):
2367
49e71b6682c7 18297 system-repository needs to be enabled more
Tim Foster <tim.s.foster@oracle.com>
parents: 2339
diff changeset
   270
                                        raise SysrepoException(
49e71b6682c7 18297 system-repository needs to be enabled more
Tim Foster <tim.s.foster@oracle.com>
parents: 2339
diff changeset
   271
                                            _("file repository %s cannot be "
49e71b6682c7 18297 system-repository needs to be enabled more
Tim Foster <tim.s.foster@oracle.com>
parents: 2339
diff changeset
   272
                                            "proxied. Only file "
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   273
                                            "repositories of version 4 or "
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   274
                                            "later are supported.") % uri)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   275
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   276
                        hash = _uri_hash(uri)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   277
                        cert = repo_uri.ssl_cert
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   278
                        key = repo_uri.ssl_key
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   279
                        if uri in uri_pub_map:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   280
                                uri_pub_map[uri].append((prefix, cert, key,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   281
                                    hash))
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   282
                        else:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   283
                                uri_pub_map[uri] = [(prefix, cert, key, hash)]
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   284
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   285
                if not repo.mirrors + repo.origins:
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   286
                        no_uri_pubs.append(prefix)
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   287
        return uri_pub_map, no_uri_pubs
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   288
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   289
def _write_httpd_conf(runtime_dir, log_dir, template_dir, host, port, cache_dir,
2479
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   290
    cache_size, uri_pub_map, http_proxy, https_proxy):
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   291
        """Writes the apache configuration for the system repository."""
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   292
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   293
        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   294
                # check our hostname
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   295
                socket.gethostbyname(host)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   296
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   297
                # check our directories
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   298
                dirs = [runtime_dir, log_dir]
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   299
                if cache_dir not in ["None", "memory"]:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   300
                        dirs.append(cache_dir)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   301
                for dir in dirs + [template_dir]:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   302
                        if os.path.exists(dir) and not os.path.isdir(dir):
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   303
                                raise SysrepoException(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   304
                                    _("%s is not a directory") % dir)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   305
                for dir in dirs:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   306
                        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   307
                                os.makedirs(dir, 0700)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   308
                        except OSError, err:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   309
                                if err.errno != errno.EEXIST:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   310
                                        raise
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   311
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   312
                # check our port
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   313
                try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   314
                        num = int(port)
2338
63a4d56416c6 18240 zone proxy needed
johansen <johansen@opensolaris.org>
parents: 2335
diff changeset
   315
                        if num <= 0 or num >= 65535:
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   316
                                raise SysrepoException(_("invalid port: %s") %
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   317
                                    port)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   318
                except ValueError:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   319
                        raise SysrepoException(_("invalid port: %s") % port)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   320
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   321
                # check our cache size
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   322
                try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   323
                        num = int(cache_size)
2338
63a4d56416c6 18240 zone proxy needed
johansen <johansen@opensolaris.org>
parents: 2335
diff changeset
   324
                        if num <= 0:
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   325
                                raise SysrepoException(_("invalid cache size: "
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   326
                                   "%s") % num)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   327
                except ValueError:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   328
                        raise SysrepoException(_("invalid cache size: %s") %
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   329
                            cache_size)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   330
2479
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   331
                # check our proxy arguments - we can use a proxy to handle
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   332
                # incoming http or https requests, but that proxy must use http.
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   333
                for key, val in [("http_proxy", http_proxy),
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   334
                    ("https_proxy", https_proxy)]:
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   335
                        if not val:
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   336
                                continue
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   337
                        try:
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   338
                                result = urllib2.urlparse.urlparse(val)
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   339
                                if result.scheme != "http":
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   340
                                        raise Exception(
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   341
                                            _("scheme must be http"))
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   342
                                if not result.netloc:
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   343
                                        raise Exception("missing netloc")
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   344
                        except Exception, e:
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   345
                                raise SysrepoException(
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   346
                                    _("invalid %(key)s: %(val)s: %(err)s") %
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   347
                                    {"key": key, "val": val, "err": str(e)})
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   348
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   349
                httpd_conf_template_path = os.path.join(template_dir,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   350
                    SYSREPO_HTTP_TEMPLATE)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   351
                httpd_conf_template = Template(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   352
                    filename=httpd_conf_template_path)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   353
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   354
                # our template expects cache size expressed in Kb
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   355
                httpd_conf_text = httpd_conf_template.render(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   356
                    sysrepo_log_dir=log_dir,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   357
                    sysrepo_runtime_dir=runtime_dir,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   358
                    uri_pub_map=uri_pub_map,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   359
                    ipv6_addr="::1",
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   360
                    host=host,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   361
                    port=port,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   362
                    cache_dir=cache_dir,
2479
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   363
                    cache_size=int(cache_size) * 1024,
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   364
                    http_proxy=http_proxy,
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   365
                    https_proxy=https_proxy)
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   366
                httpd_conf_path = os.path.join(runtime_dir,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   367
                    SYSREPO_HTTP_FILENAME)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   368
                httpd_conf_file = file(httpd_conf_path, "w")
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   369
                httpd_conf_file.write(httpd_conf_text)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   370
                httpd_conf_file.close()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   371
        except socket.gaierror, err:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   372
                raise SysrepoException(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   373
                    _("Unable to write sysrepo_httpd.conf: %(host)s: "
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   374
                    "%(err)s") % locals())
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   375
        except (OSError, IOError), err:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   376
                raise SysrepoException(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   377
                    _("Unable to write sysrepo_httpd.conf: %s") % err)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   378
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   379
def _write_crypto_conf(runtime_dir, uri_pub_map):
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   380
        """Writes the crypto.txt file, containing keys and certificates
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   381
        in order for the system repository to proxy to https repositories."""
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   382
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   383
        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   384
                crypto_path = os.path.join(runtime_dir, SYSREPO_CRYPTO_FILENAME)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   385
                file(crypto_path, "w").close()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   386
                os.chmod(crypto_path, 0600)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   387
                written_crypto_content = False
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   388
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   389
                for repo_list in uri_pub_map.values():
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   390
                        for (pub, cert_path, key_path, hash) in repo_list:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   391
                                if cert_path and key_path:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   392
                                       crypto_file = file(crypto_path, "a")
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   393
                                       crypto_file.writelines(file(cert_path))
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   394
                                       crypto_file.writelines(file(key_path))
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   395
                                       crypto_file.close()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   396
                                       written_crypto_content = True
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   397
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   398
                # Apache needs us to have some content in this file
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   399
                if not written_crypto_content:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   400
                        crypto_file = file(crypto_path, "w")
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   401
                        crypto_file.write(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   402
                            "# this space intentionally left blank\n")
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   403
                        crypto_file.close()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   404
                os.chmod(crypto_path, 0400)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   405
        except OSError, err:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   406
                raise SysrepoException(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   407
                    _("unable to write crypto.txt file: %s") % err)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   408
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   409
def _write_publisher_response(uri_pub_map, htdocs_path, template_dir):
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   410
        """Writes static html for all file-repository-based publishers that
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   411
        is served as their publisher/0 responses.  Responses for
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   412
        non-file-based publishers are handled by rewrite rules in our
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   413
        Apache configuration."""
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   414
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   415
        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   416
                # build a version of our uri_pub_map, keyed by publisher
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   417
                pub_uri_map = {}
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   418
                for uri in uri_pub_map:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   419
                        for (pub, key, cert, hash) in uri_pub_map[uri]:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   420
                                if pub not in pub_uri_map:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   421
                                        pub_uri_map[pub] = []
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   422
                                pub_uri_map[pub].append((uri, key, cert, hash))
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   423
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   424
                publisher_template_path = os.path.join(template_dir,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   425
                    SYSREPO_PUB_TEMPLATE)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   426
                publisher_template = Template(filename=publisher_template_path)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   427
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   428
                for pub in pub_uri_map:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   429
                        for (uri, cert_path, key_path, hash) in \
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   430
                            pub_uri_map[pub]:
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   431
                                if uri.startswith("file:"):
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   432
                                        publisher_text = \
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   433
                                            publisher_template.render(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   434
                                            uri=uri, pub=pub)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   435
                                        publisher_path = os.path.sep.join(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   436
                                            [htdocs_path, pub, hash] +
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   437
                                            SYSREPO_PUB_DIRNAME)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   438
                                        os.makedirs(publisher_path)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   439
                                        publisher_file = file(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   440
                                            os.path.sep.join([publisher_path,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   441
                                            SYSREPO_PUB_FILENAME]), "w")
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   442
                                        publisher_file.write(publisher_text)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   443
                                        publisher_file.close()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   444
        except OSError, err:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   445
                raise SysrepoException(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   446
                    _("unable to write publisher response: %s") % err)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   447
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   448
def _write_versions_response(htdocs_path):
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   449
        """Writes a static versions/0 response for the system repository."""
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   450
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   451
        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   452
                versions_path = os.path.join(htdocs_path,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   453
                    os.path.sep.join(SYSREPO_VERSIONS_DIRNAME))
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   454
                os.makedirs(versions_path)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   455
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   456
                versions_file = file(os.path.join(versions_path, "index.html"),
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   457
                    "w")
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   458
                versions_file.write(SYSREPO_VERSIONS_STR)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   459
                versions_file.close()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   460
        except OSError, err:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   461
                raise SysrepoException(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   462
                    _("Unable to write versions response: %s") % err)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   463
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   464
def _write_sysrepo_response(api_inst, htdocs_path, uri_pub_map, no_uri_pubs):
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   465
        """Writes a static syspub/0 response for the system repository."""
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   466
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   467
        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   468
                sysrepo_path = os.path.join(htdocs_path,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   469
                    os.path.sep.join(SYSREPO_SYSPUB_DIRNAME))
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   470
                os.makedirs(sysrepo_path)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   471
                pub_prefixes = [
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   472
                    info[0]
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   473
                    for uri in uri_pub_map.keys()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   474
                    for info in uri_pub_map[uri]
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   475
                ]
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   476
                pub_prefixes.extend(no_uri_pubs)
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   477
                api_inst.write_syspub(os.path.join(sysrepo_path, "index.html"),
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   478
                    pub_prefixes, 0)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   479
        except (OSError, apx.ApiException), err:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   480
                raise SysrepoException(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   481
                    _("Unable to write syspub response: %s") % err)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   482
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   483
def _uri_hash(uri):
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   484
        """Returns a string hash of the given URI"""
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   485
        return hashlib.sha1(uri).hexdigest()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   486
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   487
def _chown_runtime_dir(runtime_dir):
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   488
        """Change the ownership of all files under runtime_dir to our sysrepo
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   489
        user/group"""
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   490
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   491
        uid = portable.get_user_by_name(SYSREPO_USER, None, False)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   492
        gid = portable.get_group_by_name(SYSREPO_GROUP, None, False)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   493
        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   494
                misc.recursive_chown_dir(runtime_dir, uid, gid)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   495
        except OSError, err:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   496
                if not os.environ.get("PKG5_TEST_ENV", None):
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   497
                        raise SysrepoException(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   498
                            _("Unable to chown to %(user)s:%(group)s: "
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   499
                            "%(err)s") %
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   500
                            {"user": SYSREPO_USER, "group": SYSREPO_GROUP,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   501
                            "err": err})
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   502
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   503
def cleanup_conf(runtime_dir=None):
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   504
        """Destroys an old configuration."""
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   505
        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   506
                shutil.rmtree(runtime_dir, ignore_errors=True)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   507
        except OSError, err:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   508
                raise SysrepoException(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   509
                    _("Unable to cleanup old configuration: %s") % err)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   510
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   511
def refresh_conf(image_root="/", port=None, runtime_dir=None,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   512
    log_dir=None, template_dir=None, host="127.0.0.1", cache_dir=None,
2479
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   513
    cache_size=1024, http_timeout=3, http_proxy=None, https_proxy=None):
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   514
        """Creates a new configuration for the system repository.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   515
        That is, it copies /var/pkg/pkg5.image file the htdocs
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   516
        directory and creates an apache .conf file.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   517
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   518
        TODO: a way to map only given zones to given publishers
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   519
        """
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   520
        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   521
                ret = EXIT_OK
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   522
                cleanup_conf(runtime_dir=runtime_dir)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   523
                try:
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   524
                        http_timeout = int(http_timeout)
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   525
                except ValueError, err:
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   526
                        raise SysrepoException(
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   527
                            _("invalid value for http_timeout: %s") % err)
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   528
                if http_timeout < 1:
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   529
                        raise SysrepoException(
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   530
                            _("http_timeout must a positive integer"))
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   531
                try:
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   532
                        api_inst = _get_image(image_root)
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   533
                        uri_pub_map, no_uri_pubs = _get_publisher_info(api_inst,
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   534
                            http_timeout)
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   535
                except SysrepoException, err:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   536
                        raise SysrepoException(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   537
                            _("unable to get publisher information: %s") %
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   538
                            err)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   539
                try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   540
                        htdocs_path = os.path.join(runtime_dir,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   541
                            SYSREPO_HTDOCS_DIRNAME)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   542
                        os.makedirs(htdocs_path)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   543
                except OSError, err:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   544
                        raise SysrepoException(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   545
                            _("unable to create htdocs dir: %s") % err)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   546
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   547
                _write_httpd_conf(runtime_dir, log_dir, template_dir, host,
2479
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   548
                    port, cache_dir, cache_size, uri_pub_map, http_proxy,
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   549
                    https_proxy)
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   550
                _write_crypto_conf(runtime_dir, uri_pub_map)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   551
                _write_publisher_response(uri_pub_map, htdocs_path,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   552
                    template_dir)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   553
                _write_versions_response(htdocs_path)
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   554
                _write_sysrepo_response(api_inst, htdocs_path, uri_pub_map,
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   555
                    no_uri_pubs)
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   556
                _chown_runtime_dir(runtime_dir)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   557
        except SysrepoException, err:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   558
                error(err)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   559
                ret = EXIT_OOPS
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   560
        return ret
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   561
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   562
def main_func():
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   563
        global_settings.client_name = PKG_CLIENT_NAME
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   564
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   565
        global orig_cwd
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   566
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   567
        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   568
                orig_cwd = os.getcwd()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   569
        except OSError, e:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   570
                try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   571
                        orig_cwd = os.environ["PWD"]
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   572
                        if not orig_cwd or orig_cwd[0] != "/":
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   573
                                orig_cwd = None
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   574
                except KeyError:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   575
                        orig_cwd = None
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   576
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   577
        # some sensible defaults
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   578
        host = "127.0.0.1"
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   579
        port = None
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   580
        # an empty image_root means we don't get '//' in the below
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   581
        # _get_image() deals with "" in a sane manner.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   582
        image_root = ""
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   583
        cache_dir = "%s/var/cache/pkg/sysrepo" % image_root
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   584
        cache_size = "1024"
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   585
        template_dir = "%s/etc/pkg/sysrepo" % image_root
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   586
        runtime_dir = "%s/var/run/pkg/sysrepo" % image_root
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   587
        log_dir = "%s/var/log/pkg/sysrepo" % image_root
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   588
        http_timeout = 4
2479
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   589
        http_proxy = None
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   590
        https_proxy = None
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   591
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   592
        try:
2479
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   593
                opts, pargs = getopt.getopt(sys.argv[1:],
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   594
                    "c:h:l:p:r:R:s:t:T:w:W:?", ["help"])
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   595
                for opt, arg in opts:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   596
                        if opt == "-c":
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   597
                                cache_dir = arg
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   598
                        elif opt == "-h":
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   599
                                host = arg
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   600
                        elif opt == "-l":
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   601
                                log_dir = arg
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   602
                        elif opt == "-p":
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   603
                                port = arg
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   604
                        elif opt == "-r":
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   605
                                runtime_dir = arg
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   606
                        elif opt == "-R":
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   607
                                image_root = arg
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   608
                        elif opt == "-s":
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   609
                                cache_size = arg
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   610
                        elif opt == "-t":
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   611
                                template_dir = arg
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   612
                        elif opt == "-T":
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   613
                                http_timeout = arg
2479
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   614
                        elif opt == "-w":
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   615
                                http_proxy = arg
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   616
                        elif opt == "-W":
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   617
                                https_proxy = arg
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   618
                        else:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   619
                                usage()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   620
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   621
        except getopt.GetoptError, e:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   622
                usage(_("illegal global option -- %s") % e.opt)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   623
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   624
        if not port:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   625
                usage(_("required port option missing."))
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   626
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   627
        ret = refresh_conf(image_root=image_root, log_dir=log_dir,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   628
            host=host, port=port, runtime_dir=runtime_dir,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   629
            template_dir=template_dir, cache_dir=cache_dir,
2479
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   630
            cache_size=cache_size, http_timeout=http_timeout,
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   631
            http_proxy=http_proxy, https_proxy=https_proxy)
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   632
        return ret
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   633
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   634
#
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   635
# Establish a specific exit status which means: "python barfed an exception"
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   636
# so that we can more easily detect these in testing of the CLI commands.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   637
#
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   638
def handle_errors(func, *args, **kwargs):
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   639
        """Catch exceptions raised by the main program function and then print
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   640
        a message and/or exit with an appropriate return code.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   641
        """
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   642
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   643
        traceback_str = _("""\n
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   644
This is an internal error in pkg(5) version %(version)s.  Please let the
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   645
developers know about this problem by including the information above (and
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   646
this message) when filing a bug at:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   647
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   648
%(bug_uri)s""") % { "version": pkg.VERSION, "bug_uri": misc.BUG_URI_CLI }
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   649
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   650
        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   651
                # Out of memory errors can be raised as EnvironmentErrors with
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   652
                # an errno of ENOMEM, so in order to handle those exceptions
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   653
                # with other errnos, we nest this try block and have the outer
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   654
                # one handle the other instances.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   655
                try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   656
                        __ret = func(*args, **kwargs)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   657
                except (MemoryError, EnvironmentError), __e:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   658
                        if isinstance(__e, EnvironmentError) and \
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   659
                            __e.errno != errno.ENOMEM:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   660
                                raise
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   661
                        error("\n" + misc.out_of_memory())
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   662
                        __ret = EXIT_OOPS
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   663
        except SystemExit, __e:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   664
                raise __e
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   665
        except (PipeError, KeyboardInterrupt):
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   666
                # Don't display any messages here to prevent possible further
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   667
                # broken pipe (EPIPE) errors.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   668
                __ret = EXIT_OOPS
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   669
        except apx.VersionException, __e:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   670
                error(_("The sysrepo command appears out of sync with the "
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   671
                    "libraries provided\nby pkg:/package/pkg. The client "
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   672
                    "version is %(client)s while the library\nAPI version is "
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   673
                    "%(api)s.") % {'client': __e.received_version,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   674
                     'api': __e.expected_version
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   675
                    })
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   676
                __ret = EXIT_OOPS
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   677
        except:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   678
                traceback.print_exc()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   679
                error(traceback_str)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   680
                __ret = 99
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   681
        return __ret
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   682
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   683
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   684
if __name__ == "__main__":
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   685
        misc.setlocale(locale.LC_ALL, "", error)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   686
        gettext.install("pkg", "/usr/share/locale")
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   687
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   688
        # Make all warnings be errors.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   689
        warnings.simplefilter('error')
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   690
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   691
        __retval = handle_errors(main_func)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   692
        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   693
                logging.shutdown()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   694
        except IOError:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   695
                # Ignore python's spurious pipe problems.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   696
                pass
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   697
        sys.exit(__retval)