src/sysrepo.py
author Yiteng Zhang <yiteng.zhang@oracle.com>
Mon, 09 Sep 2013 10:52:27 -0700
changeset 2942 17aad7c202b0
parent 2910 2bb9f6ffdff9
child 2962 ce8cd4c07986
permissions -rwxr-xr-x
17336089 modules/server/repository.py is missing a module import
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
#
2701
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
    22
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
    23
#
2880
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
    24
# Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
2701
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
    25
#
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    26
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    27
import atexit
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    28
import errno
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    29
import getopt
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    30
import gettext
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    31
import hashlib
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    32
import locale
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    33
import logging
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    34
import os
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    35
import shutil
2678
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
    36
import simplejson
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    37
import socket
2678
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
    38
import stat
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    39
import sys
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    40
import traceback
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    41
import urllib2
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    42
import warnings
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
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
    45
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    46
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
    47
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
    48
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    49
import pkg
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    50
import pkg.catalog
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    51
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
    52
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
    53
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
    54
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
    55
import pkg.portable as portable
2677
7f1c7dd5254f 7140764 pkg.sysrepo should support p5p files
Tim Foster <tim.s.foster@oracle.com>
parents: 2644
diff changeset
    56
import pkg.p5p as p5p
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    57
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    58
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
    59
orig_cwd = None
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    60
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    61
PKG_CLIENT_NAME = "pkg.sysrepo"
2910
2bb9f6ffdff9 15654935 pkg facet/variant should also display those implicitly set
Shawn Walker <shawn.walker@oracle.com>
parents: 2880
diff changeset
    62
CLIENT_API_VERSION = 75
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    63
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
    64
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    65
# exit codes
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    66
EXIT_OK      = 0
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    67
EXIT_OOPS    = 1
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    68
EXIT_BADOPT  = 2
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    69
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    70
#
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    71
# 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
    72
# 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
    73
#
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    74
# 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
    75
# 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
    76
# 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
    77
# 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
    78
# 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
    79
#
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    80
# 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
    81
# Apache configuration.
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    82
#
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    83
# 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
    84
#
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    85
# 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
    86
# ---------     ---------------------         ------------
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    87
# 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
    88
# 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
    89
# 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
    90
# 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
    91
#
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    92
# 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
    93
#
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    94
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    95
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
    96
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
    97
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
    98
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
    99
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
   100
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
   101
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   102
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
   103
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   104
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
   105
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
   106
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
   107
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   108
# 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
   109
SYSREPO_VERSIONS_STR = """\
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   110
pkg-server %s
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   111
publisher 0
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   112
versions 0
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   113
catalog 1
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   114
file 1
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   115
syspub 0
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   116
manifest 0
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   117
""" % pkg.VERSION
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   118
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   119
SYSREPO_USER = "pkg5srv"
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   120
SYSREPO_GROUP = "pkg5srv"
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   121
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   122
class SysrepoException(Exception):
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   123
        def __unicode__(self):
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   124
        # 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
   125
        # 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
   126
        # 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
   127
                return str(self)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   128
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   129
@atexit.register
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   130
def cleanup():
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   131
        """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
   132
        pass
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   133
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   134
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
   135
        """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
   136
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   137
        if cmd:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   138
                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
   139
                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
   140
        else:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   141
                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
   142
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   143
                # 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
   144
                # 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
   145
                text = str(text)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   146
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   147
        # 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
   148
        # *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
   149
        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
   150
        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
   151
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   152
        # 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
   153
        # 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
   154
        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
   155
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   156
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
   157
        """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
   158
        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
   159
        """
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   160
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   161
        if usage_error:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   162
                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
   163
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   164
        msg(_("""\
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   165
Usage:
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   166
        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
   167
                [-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
   168
                [-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
   169
     """))
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   170
        sys.exit(retcode)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   171
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   172
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
   173
        """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
   174
        image directory."""
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   175
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   176
        cdir = os.getcwd()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   177
        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
   178
                image_dir = "/"
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   179
        api_inst = None
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   180
        tracker = progress.QuietProgressTracker()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   181
        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   182
                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
   183
                    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
   184
                    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
   185
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   186
                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
   187
                        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
   188
        except Exception, err:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   189
                raise SysrepoException(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   190
                    _("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
   191
                    {"dir": image_dir,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   192
                    "reason": str(err)})
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   193
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   194
        # 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
   195
        os.chdir(cdir)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   196
        return api_inst
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   197
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   198
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
   199
        """ Follow HTTP redirects from servers.  Needed so that we can create
2678
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   200
        RewriteRules for all repository URLs that pkg clients may encounter.
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   201
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   202
        We return a sorted list of URIs that were found having followed all
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   203
        redirects in 'uri_list'.  We also return a boolean, True if we timed out
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   204
        when following any of the URIs.
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   205
        """
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   206
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   207
        ret_uris = set(uri_list)
2678
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   208
        timed_out = False
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   209
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   210
        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
   211
                """ 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
   212
                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
   213
                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
   214
                        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
   215
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   216
                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
   217
                        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
   218
                        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
   219
                            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
   220
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   221
        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
   222
                handler = SysrepoRedirectHandler()
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   223
                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
   224
                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
   225
                        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
   226
                        continue
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   227
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   228
                # 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
   229
                try:
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   230
                        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
   231
                        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
   232
                            [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
   233
                            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
   234
                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
   235
                        # 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
   236
                        # 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
   237
                        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
   238
                            "for redirects: %(err)s") % locals())
2678
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   239
                        timed_out = True
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   240
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   241
        return sorted(list(ret_uris)), timed_out
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   242
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   243
def __validate_pub_info(pub_info, no_uri_pubs, api_inst):
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   244
        """Determine if pub_info and no_uri_pubs objects, which may have been
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   245
        decoded from a json representation are valid, raising a SysrepoException
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   246
        if they are not.
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   247
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   248
        We use the api_inst to sanity-check that all publishers configured in
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   249
        the image are represented in pub_info or no_uri_pubs, and that their
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   250
        URIs are present.
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   251
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   252
        SysrepoExceptions are raised with developer-oriented debug messages
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   253
        which are not to be translated or shown to users.
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   254
        """
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   255
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   256
        # validate the structure of the pub_info object
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   257
        if not isinstance(pub_info, dict):
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   258
                raise SysrepoException("%s is not a dict" % pub_info)
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   259
        for uri in pub_info:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   260
                if not isinstance(uri, basestring):
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   261
                        raise SysrepoException("%s is not a basestring" % uri)
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   262
                uri_info = pub_info[uri]
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   263
                if not isinstance(uri_info, list):
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   264
                        raise SysrepoException("%s is not a list" % uri_info)
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   265
                for props in uri_info:
2880
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   266
                        if len(props) != 6:
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   267
                                raise SysrepoException("%s does not have 6 "
2678
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   268
                                    "items" % props)
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   269
                        # props [0] and [3] must be strings
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   270
                        if not isinstance(props[0], basestring) or \
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   271
                            not isinstance(props[3], basestring):
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   272
                                raise SysrepoException("indices 0 and 3 of %s "
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   273
                                    "are not basestrings" % props)
2880
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   274
                        # prop[5] must be a string, either "file" or "dir"
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   275
                        # and prop[0] must start with file://
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   276
                        if not isinstance(props[5], basestring) or \
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   277
                            (props[5] not in ["file", "dir"] and
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   278
                            props[0].startswith("file://")):
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   279
                                raise SysrepoException("index 5 of %s is not a "
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   280
                                    "basestring or is not 'file' or 'dir'" %
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   281
                                    props)
2678
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   282
        # validate the structure of the no_uri_pubs object
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   283
        if not isinstance(no_uri_pubs, list):
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   284
                raise SysrepoException("%s is not a list" % no_uri_pubs)
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   285
        for item in no_uri_pubs:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   286
                if not isinstance(item, basestring):
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   287
                        raise SysrepoException("%s is not a basestring" % item)
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   288
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   289
        # check that we have entries for each URI for each publisher.
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   290
        # (we may have more URIs than these, due to server-side http redirects
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   291
        # that are not reflected as origins or mirrors in the image itself)
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   292
        for pub in api_inst.get_publishers():
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   293
                if pub.disabled:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   294
                        continue
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   295
                repo = pub.repository
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   296
                for uri in repo.mirrors + repo.origins:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   297
                        uri_key = uri.uri.rstrip("/")
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   298
                        if uri_key not in pub_info:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   299
                                raise SysrepoException("%s is not in %s" %
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   300
                                    (uri_key, pub_info))
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   301
                if repo.mirrors + repo.origins == []:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   302
                        if pub.prefix not in no_uri_pubs:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   303
                                raise SysrepoException("%s is not in %s" %
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   304
                                    (pub.prefix, no_uri_pubs))
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   305
        return
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   306
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   307
def _load_publisher_info(api_inst, image_dir):
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   308
        """Loads information about the publishers configured for the
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   309
        given ImageInterface from image_dir in a format identical to that
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   310
        returned by _get_publisher_info(..)  that is, a dictionary mapping
2701
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   311
        URIs to a list of lists. An example entry might be:
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   312
            pub_info[uri] = [[prefix, cert, key, hash of the uri, proxy], ... ]
2678
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   313
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   314
        and a list of publishers which have no origin or mirror URIs.
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   315
2678
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   316
        If the cache doesn't exist, or is in a format we don't recognise, or
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   317
        we've managed to determine that it's stale, we return None, None
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   318
        indicating that the publisher_info must be rebuilt.
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   319
        """
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   320
        pub_info = None
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   321
        no_uri_pubs = None
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   322
        cache_path = os.path.join(image_dir,
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   323
            pkg.client.global_settings.sysrepo_pub_cache_path)
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   324
        try:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   325
                try:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   326
                        st_cache = os.lstat(cache_path)
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   327
                except OSError, e:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   328
                        if e.errno == errno.ENOENT:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   329
                                return None, None
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   330
                        else:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   331
                                raise
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   332
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   333
                # the cache must be a regular file
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   334
                if not stat.S_ISREG(st_cache.st_mode):
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   335
                        raise IOError("not a regular file")
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   336
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   337
                with open(cache_path, "r") as cache_file:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   338
                        try:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   339
                                pub_info_tuple = simplejson.load(cache_file)
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   340
                        except simplejson.JSONDecodeError:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   341
                                error(_("Invalid config cache file at %s "
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   342
                                    "generating fresh configuration.") %
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   343
                                    cache_path)
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   344
                                return None, None
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   345
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   346
                        if len(pub_info_tuple) != 2:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   347
                                error(_("Invalid config cache at %s "
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   348
                                    "generating fresh configuration.") %
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   349
                                    cache_path)
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   350
                                return None, None
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   351
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   352
                        pub_info, no_uri_pubs = pub_info_tuple
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   353
                        # sanity-check the cached configuration
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   354
                        try:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   355
                                __validate_pub_info(pub_info, no_uri_pubs,
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   356
                                    api_inst)
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   357
                        except SysrepoException, e:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   358
                                error(_("Invalid config cache at %s "
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   359
                                    "generating fresh configuration.") %
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   360
                                    cache_path)
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   361
                                return None, None
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   362
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   363
        # If we have any problems loading the publisher info, we explain why.
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   364
        except IOError, e:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   365
                error(_("Unable to load config from %(cache_path)s: %(e)s") %
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   366
                    locals())
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   367
                return None, None
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   368
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   369
        return pub_info, no_uri_pubs
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   370
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   371
def _store_publisher_info(uri_pub_map, no_uri_pubs, image_dir):
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   372
        """Stores a given pair of (uri_pub_map, no_uri_pubs) objects to a
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   373
        configuration cache file beneath image_dir."""
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   374
        cache_path = os.path.join(image_dir,
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   375
            pkg.client.global_settings.sysrepo_pub_cache_path)
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   376
        cache_dir = os.path.dirname(cache_path)
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   377
        try:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   378
                if not os.path.exists(cache_dir):
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   379
                        os.makedirs(cache_dir, 0700)
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   380
                try:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   381
                        # if the cache exists, it must be a file
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   382
                        st_cache = os.lstat(cache_path)
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   383
                        if not stat.S_ISREG(st_cache.st_mode):
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   384
                                raise IOError("not a regular file")
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   385
                except OSError:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   386
                        pass
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   387
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   388
                with open(cache_path, "wb") as cache_file:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   389
                        simplejson.dump((uri_pub_map, no_uri_pubs), cache_file,
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   390
                            indent=True)
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   391
                        os.chmod(cache_path, 0600)
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   392
        except IOError, e:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   393
                error(_("Unable to store config to %(cache_path)s: %(e)s") %
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   394
                    locals())
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   395
2701
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   396
def _valid_proxy(proxy):
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   397
        """Checks the given proxy string to make sure that it does not contain
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   398
        any authentication details since these are not supported by ProxyRemote.
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   399
        """
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   400
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   401
        u = urllib2.urlparse.urlparse(proxy)
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   402
        netloc_parts = u.netloc.split("@")
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   403
        # If we don't have any authentication details, return.
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   404
        if len(netloc_parts) == 1:
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   405
                return True
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   406
        return False
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   407
2678
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   408
def _get_publisher_info(api_inst, http_timeout, image_dir):
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   409
        """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
   410
        ImageInterface.
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   411
2678
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   412
        The first item returned is a map of uris to a list of lists of the form
2880
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   413
        [[prefix, cert, key, hash of the uri, proxy, uri type], ... ]
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   414
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   415
        The second item returned is a list of publisher prefixes which specify
2678
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   416
        no uris.
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   417
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   418
        Where possible, we attempt to load cached publisher information, but if
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   419
        that cached information is stale or unavailable, we fall back to
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   420
        querying the image for the publisher information, verifying repository
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   421
        URIs and checking for redirects and write that information to the
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   422
        cache."""
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   423
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   424
        # the cache gets deleted by pkg.client.image.Image.save_config()
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   425
        # any time publisher configuration changes are made.
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   426
        uri_pub_map, no_uri_pubs = _load_publisher_info(api_inst, image_dir)
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   427
        if uri_pub_map:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   428
                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
   429
2880
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   430
        # map URIs to (pub.prefix, cert, key, hash, proxy, utype) tuples
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   431
        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
   432
        no_uri_pubs = []
2678
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   433
        timed_out = False
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   434
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   435
        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
   436
                if pub.disabled:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   437
                        continue
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   438
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   439
                prefix = pub.prefix
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   440
                repo = pub.repository
2701
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   441
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   442
                # Determine the proxies to use per URI
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   443
                proxy_map = {}
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   444
                for uri in repo.mirrors + repo.origins:
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   445
                        key = uri.uri.rstrip("/")
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   446
                        if uri.proxies:
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   447
                                # Apache can only use a single proxy, even
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   448
                                # if many are configured. Use the first we find.
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   449
                                proxy_map[key] = uri.proxies[0].uri
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   450
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   451
                # Apache's ProxyRemote directive does not allow proxies that
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   452
                # require authentication.
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   453
                for uri in proxy_map:
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   454
                        if not _valid_proxy(proxy_map[uri]):
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   455
                                raise SysrepoException("proxy value %(val)s "
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   456
                                    "for %(uri)s is not supported." %
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   457
                                    {"uri": uri, "val": proxy_map[uri]})
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   458
2678
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   459
                uri_list, timed_out = _follow_redirects(
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   460
                    [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
   461
                    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
   462
                    http_timeout)
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   463
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   464
                for uri in uri_list:
2880
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   465
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   466
                        # We keep a field to store information about the type
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   467
                        # of URI we're looking at, which saves us
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   468
                        # from needing to make os.path.isdir(..) or
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   469
                        # os.path.isfile(..) calls when processing the template.
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   470
                        # This is important when we're rebuilding the
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   471
                        # configuration from cached publisher info and an
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   472
                        # file:// repository is temporarily unreachable.
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   473
                        utype = ""
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   474
                        if uri.startswith("file:"):
2880
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   475
                                # we only support p5p files and directory-based
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   476
                                # repositories of >= version 4.
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   477
                                urlresult = urllib2.urlparse.urlparse(uri)
2880
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   478
                                utype = "dir"
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   479
                                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
   480
                                        raise SysrepoException(
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   481
                                            _("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
   482
                                            "exist or is not accessible") % uri)
2677
7f1c7dd5254f 7140764 pkg.sysrepo should support p5p files
Tim Foster <tim.s.foster@oracle.com>
parents: 2644
diff changeset
   483
                                if os.path.isdir(urlresult.path) and \
7f1c7dd5254f 7140764 pkg.sysrepo should support p5p files
Tim Foster <tim.s.foster@oracle.com>
parents: 2644
diff changeset
   484
                                    not os.path.exists(os.path.join(
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   485
                                    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
   486
                                        raise SysrepoException(
49e71b6682c7 18297 system-repository needs to be enabled more
Tim Foster <tim.s.foster@oracle.com>
parents: 2339
diff changeset
   487
                                            _("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
   488
                                            "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
   489
                                            "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
   490
                                            "later are supported.") % uri)
2677
7f1c7dd5254f 7140764 pkg.sysrepo should support p5p files
Tim Foster <tim.s.foster@oracle.com>
parents: 2644
diff changeset
   491
                                if not os.path.isdir(urlresult.path):
2880
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   492
                                        utype = "file"
2677
7f1c7dd5254f 7140764 pkg.sysrepo should support p5p files
Tim Foster <tim.s.foster@oracle.com>
parents: 2644
diff changeset
   493
                                        try:
7f1c7dd5254f 7140764 pkg.sysrepo should support p5p files
Tim Foster <tim.s.foster@oracle.com>
parents: 2644
diff changeset
   494
                                                p5p.Archive(urlresult.path)
7f1c7dd5254f 7140764 pkg.sysrepo should support p5p files
Tim Foster <tim.s.foster@oracle.com>
parents: 2644
diff changeset
   495
                                        except p5p.InvalidArchive:
7f1c7dd5254f 7140764 pkg.sysrepo should support p5p files
Tim Foster <tim.s.foster@oracle.com>
parents: 2644
diff changeset
   496
                                                raise SysrepoException(
7f1c7dd5254f 7140764 pkg.sysrepo should support p5p files
Tim Foster <tim.s.foster@oracle.com>
parents: 2644
diff changeset
   497
                                                    _("unable to read p5p "
7f1c7dd5254f 7140764 pkg.sysrepo should support p5p files
Tim Foster <tim.s.foster@oracle.com>
parents: 2644
diff changeset
   498
                                                    "archive file at %s") %
7f1c7dd5254f 7140764 pkg.sysrepo should support p5p files
Tim Foster <tim.s.foster@oracle.com>
parents: 2644
diff changeset
   499
                                                    urlresult.path)
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   500
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   501
                        hash = _uri_hash(uri)
2701
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   502
                        # we don't have per-uri ssl key/cert information yet,
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   503
                        # so we just pull it from one of the RepositoryURIs.
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   504
                        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
   505
                        key = repo_uri.ssl_key
2701
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   506
                        uri_pub_map.setdefault(uri, []).append(
2880
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   507
                            (prefix, cert, key, hash, proxy_map.get(uri), utype)
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   508
                            )
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   509
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   510
                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
   511
                        no_uri_pubs.append(prefix)
2678
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   512
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   513
        # if we weren't able to follow all redirects, then we don't write a new
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   514
        # cache, because it could be incomplete.
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   515
        if not timed_out:
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   516
                _store_publisher_info(uri_pub_map, no_uri_pubs, 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
   517
        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
   518
2644
434fe01f111b 7120902 var/cache/pkg/sysrepo recreated with broken perms
abhinandan.ekande@oracle.com
parents: 2612
diff changeset
   519
def _chown_cache_dir(dir):
434fe01f111b 7120902 var/cache/pkg/sysrepo recreated with broken perms
abhinandan.ekande@oracle.com
parents: 2612
diff changeset
   520
        """Sets ownership for cache directory as pkg5srv:bin"""
434fe01f111b 7120902 var/cache/pkg/sysrepo recreated with broken perms
abhinandan.ekande@oracle.com
parents: 2612
diff changeset
   521
434fe01f111b 7120902 var/cache/pkg/sysrepo recreated with broken perms
abhinandan.ekande@oracle.com
parents: 2612
diff changeset
   522
        uid = portable.get_user_by_name(SYSREPO_USER, None, False)
434fe01f111b 7120902 var/cache/pkg/sysrepo recreated with broken perms
abhinandan.ekande@oracle.com
parents: 2612
diff changeset
   523
        gid = portable.get_group_by_name("bin", None, False)
434fe01f111b 7120902 var/cache/pkg/sysrepo recreated with broken perms
abhinandan.ekande@oracle.com
parents: 2612
diff changeset
   524
        try:
434fe01f111b 7120902 var/cache/pkg/sysrepo recreated with broken perms
abhinandan.ekande@oracle.com
parents: 2612
diff changeset
   525
                os.chown(dir, uid, gid)
434fe01f111b 7120902 var/cache/pkg/sysrepo recreated with broken perms
abhinandan.ekande@oracle.com
parents: 2612
diff changeset
   526
        except OSError, err:
434fe01f111b 7120902 var/cache/pkg/sysrepo recreated with broken perms
abhinandan.ekande@oracle.com
parents: 2612
diff changeset
   527
                if not os.environ.get("PKG5_TEST_ENV", None):
434fe01f111b 7120902 var/cache/pkg/sysrepo recreated with broken perms
abhinandan.ekande@oracle.com
parents: 2612
diff changeset
   528
                        raise SysrepoException(
434fe01f111b 7120902 var/cache/pkg/sysrepo recreated with broken perms
abhinandan.ekande@oracle.com
parents: 2612
diff changeset
   529
                            _("Unable to chown to %(user)s:%(group)s: "
434fe01f111b 7120902 var/cache/pkg/sysrepo recreated with broken perms
abhinandan.ekande@oracle.com
parents: 2612
diff changeset
   530
                            "%(err)s") %
434fe01f111b 7120902 var/cache/pkg/sysrepo recreated with broken perms
abhinandan.ekande@oracle.com
parents: 2612
diff changeset
   531
                            {"user": SYSREPO_USER, "group": "bin",
434fe01f111b 7120902 var/cache/pkg/sysrepo recreated with broken perms
abhinandan.ekande@oracle.com
parents: 2612
diff changeset
   532
                            "err": err})
434fe01f111b 7120902 var/cache/pkg/sysrepo recreated with broken perms
abhinandan.ekande@oracle.com
parents: 2612
diff changeset
   533
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   534
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
   535
    cache_size, uri_pub_map, http_proxy, https_proxy):
2701
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   536
        """Writes the apache configuration for the system repository.
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   537
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   538
        If http_proxy or http_proxy is supplied, it will override any proxy
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   539
        values set in the image we're reading configuration from.
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   540
        """
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   541
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   542
        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   543
                # check our hostname
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   544
                socket.gethostbyname(host)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   545
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   546
                # check our directories
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   547
                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
   548
                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
   549
                        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
   550
                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
   551
                        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
   552
                                raise SysrepoException(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   553
                                    _("%s is not a directory") % dir)
2644
434fe01f111b 7120902 var/cache/pkg/sysrepo recreated with broken perms
abhinandan.ekande@oracle.com
parents: 2612
diff changeset
   554
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   555
                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
   556
                        try:
2644
434fe01f111b 7120902 var/cache/pkg/sysrepo recreated with broken perms
abhinandan.ekande@oracle.com
parents: 2612
diff changeset
   557
                                os.makedirs(dir, 0755)
434fe01f111b 7120902 var/cache/pkg/sysrepo recreated with broken perms
abhinandan.ekande@oracle.com
parents: 2612
diff changeset
   558
                                # set pkg5srv:bin as ownership for cache
434fe01f111b 7120902 var/cache/pkg/sysrepo recreated with broken perms
abhinandan.ekande@oracle.com
parents: 2612
diff changeset
   559
                                # directory.
434fe01f111b 7120902 var/cache/pkg/sysrepo recreated with broken perms
abhinandan.ekande@oracle.com
parents: 2612
diff changeset
   560
                                if dir == cache_dir:
434fe01f111b 7120902 var/cache/pkg/sysrepo recreated with broken perms
abhinandan.ekande@oracle.com
parents: 2612
diff changeset
   561
                                        _chown_cache_dir(dir)
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   562
                        except OSError, err:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   563
                                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
   564
                                        raise
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   565
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   566
                # check our port
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
                        num = int(port)
2338
63a4d56416c6 18240 zone proxy needed
johansen <johansen@opensolaris.org>
parents: 2335
diff changeset
   569
                        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
   570
                                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
   571
                                    port)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   572
                except ValueError:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   573
                        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
   574
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   575
                # 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
   576
                try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   577
                        num = int(cache_size)
2338
63a4d56416c6 18240 zone proxy needed
johansen <johansen@opensolaris.org>
parents: 2335
diff changeset
   578
                        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
   579
                                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
   580
                                   "%s") % num)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   581
                except ValueError:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   582
                        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
   583
                            cache_size)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   584
2479
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   585
                # 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
   586
                # 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
   587
                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
   588
                    ("https_proxy", https_proxy)]:
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   589
                        if not val:
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   590
                                continue
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   591
                        try:
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   592
                                result = urllib2.urlparse.urlparse(val)
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   593
                                if result.scheme != "http":
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   594
                                        raise Exception(
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   595
                                            _("scheme must be http"))
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   596
                                if not result.netloc:
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   597
                                        raise Exception("missing netloc")
2701
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   598
                                if not _valid_proxy(val):
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   599
                                        raise Exception("unsupported proxy")
2479
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   600
                        except Exception, e:
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   601
                                raise SysrepoException(
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   602
                                    _("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
   603
                                    {"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
   604
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   605
                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
   606
                    SYSREPO_HTTP_TEMPLATE)
2677
7f1c7dd5254f 7140764 pkg.sysrepo should support p5p files
Tim Foster <tim.s.foster@oracle.com>
parents: 2644
diff changeset
   607
7f1c7dd5254f 7140764 pkg.sysrepo should support p5p files
Tim Foster <tim.s.foster@oracle.com>
parents: 2644
diff changeset
   608
                # we're disabling unicode here because we want Mako to
7f1c7dd5254f 7140764 pkg.sysrepo should support p5p files
Tim Foster <tim.s.foster@oracle.com>
parents: 2644
diff changeset
   609
                # passthrough any filesystem path names, whatever the
7f1c7dd5254f 7140764 pkg.sysrepo should support p5p files
Tim Foster <tim.s.foster@oracle.com>
parents: 2644
diff changeset
   610
                # original encoding.
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   611
                httpd_conf_template = Template(
2677
7f1c7dd5254f 7140764 pkg.sysrepo should support p5p files
Tim Foster <tim.s.foster@oracle.com>
parents: 2644
diff changeset
   612
                    filename=httpd_conf_template_path,
7f1c7dd5254f 7140764 pkg.sysrepo should support p5p files
Tim Foster <tim.s.foster@oracle.com>
parents: 2644
diff changeset
   613
                    disable_unicode=True)
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   614
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   615
                # 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
   616
                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
   617
                    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
   618
                    sysrepo_runtime_dir=runtime_dir,
2677
7f1c7dd5254f 7140764 pkg.sysrepo should support p5p files
Tim Foster <tim.s.foster@oracle.com>
parents: 2644
diff changeset
   619
                    sysrepo_template_dir=template_dir,
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   620
                    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
   621
                    ipv6_addr="::1",
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   622
                    host=host,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   623
                    port=port,
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   624
                    cache_dir=cache_dir,
2479
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   625
                    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
   626
                    http_proxy=http_proxy,
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   627
                    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
   628
                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
   629
                    SYSREPO_HTTP_FILENAME)
2677
7f1c7dd5254f 7140764 pkg.sysrepo should support p5p files
Tim Foster <tim.s.foster@oracle.com>
parents: 2644
diff changeset
   630
                httpd_conf_file = file(httpd_conf_path, "wb")
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   631
                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
   632
                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
   633
        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
   634
                raise SysrepoException(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   635
                    _("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
   636
                    "%(err)s") % locals())
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   637
        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
   638
                raise SysrepoException(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   639
                    _("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
   640
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   641
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
   642
        """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
   643
        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
   644
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   645
        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   646
                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
   647
                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
   648
                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
   649
                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
   650
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   651
                for repo_list in uri_pub_map.values():
2880
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   652
                        for (pub, cert_path, key_path, hash, proxy, utype) in \
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   653
                            repo_list:
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   654
                                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
   655
                                       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
   656
                                       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
   657
                                       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
   658
                                       crypto_file.close()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   659
                                       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
   660
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   661
                # 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
   662
                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
   663
                        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
   664
                        crypto_file.write(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   665
                            "# 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
   666
                        crypto_file.close()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   667
                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
   668
        except OSError, err:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   669
                raise SysrepoException(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   670
                    _("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
   671
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   672
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
   673
        """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
   674
        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
   675
        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
   676
        Apache configuration."""
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   677
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   678
        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   679
                # 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
   680
                pub_uri_map = {}
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   681
                for uri in uri_pub_map:
2880
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   682
                        for (pub, cert, key, hash, proxy, utype) in \
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   683
                            uri_pub_map[uri]:
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   684
                                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
   685
                                        pub_uri_map[pub] = []
2701
55bf0cb749ae 7136244 granular configuration of http_proxy option
Tim Foster <tim.s.foster@oracle.com>
parents: 2690
diff changeset
   686
                                pub_uri_map[pub].append(
2880
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   687
                                    (uri, cert, key, hash, proxy, utype))
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   688
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   689
                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
   690
                    SYSREPO_PUB_TEMPLATE)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   691
                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
   692
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   693
                for pub in pub_uri_map:
2880
95c9f5243557 16368795 inaccessible file based repo leads to bad sysrepo http.conf file
Tim Foster <tim.s.foster@oracle.com>
parents: 2728
diff changeset
   694
                        for (uri, cert_path, key_path, hash, proxy, utype) in \
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   695
                            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
   696
                                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
   697
                                        publisher_text = \
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   698
                                            publisher_template.render(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   699
                                            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
   700
                                        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
   701
                                            [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
   702
                                            SYSREPO_PUB_DIRNAME)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   703
                                        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
   704
                                        publisher_file = file(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   705
                                            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
   706
                                            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
   707
                                        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
   708
                                        publisher_file.close()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   709
        except OSError, err:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   710
                raise SysrepoException(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   711
                    _("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
   712
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   713
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
   714
        """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
   715
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   716
        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   717
                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
   718
                    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
   719
                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
   720
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   721
                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
   722
                    "w")
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   723
                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
   724
                versions_file.close()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   725
        except OSError, err:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   726
                raise SysrepoException(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   727
                    _("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
   728
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   729
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
   730
        """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
   731
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   732
        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   733
                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
   734
                    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
   735
                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
   736
                pub_prefixes = [
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   737
                    info[0]
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   738
                    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
   739
                    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
   740
                ]
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   741
                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
   742
                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
   743
                    pub_prefixes, 0)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   744
        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
   745
                raise SysrepoException(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   746
                    _("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
   747
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   748
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
   749
        """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
   750
        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
   751
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   752
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
   753
        """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
   754
        user/group"""
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   755
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   756
        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
   757
        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
   758
        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   759
                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
   760
        except OSError, err:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   761
                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
   762
                        raise SysrepoException(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   763
                            _("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
   764
                            "%(err)s") %
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   765
                            {"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
   766
                            "err": err})
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   767
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   768
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
   769
        """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
   770
        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   771
                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
   772
        except OSError, err:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   773
                raise SysrepoException(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   774
                    _("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
   775
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   776
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
   777
    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
   778
    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
   779
        """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
   780
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   781
        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
   782
        """
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   783
        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   784
                ret = EXIT_OK
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   785
                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
   786
                try:
2448
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   787
                        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
   788
                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
   789
                        raise SysrepoException(
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   790
                            _("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
   791
                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
   792
                        raise SysrepoException(
2a649d8c190d 18272 pkg.sysrepo can't proxy publishers that are redirected
Tim Foster <tim.s.foster@oracle.com>
parents: 2446
diff changeset
   793
                            _("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
   794
                try:
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   795
                        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
   796
                        uri_pub_map, no_uri_pubs = _get_publisher_info(api_inst,
2678
5386f65ff099 7140543 sysrepo should cache publisher state required for startup
Tim Foster <tim.s.foster@oracle.com>
parents: 2677
diff changeset
   797
                            http_timeout, api_inst.root)
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   798
                except SysrepoException, err:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   799
                        raise SysrepoException(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   800
                            _("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
   801
                            err)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   802
                try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   803
                        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
   804
                            SYSREPO_HTDOCS_DIRNAME)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   805
                        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
   806
                except OSError, err:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   807
                        raise SysrepoException(
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   808
                            _("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
   809
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   810
                _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
   811
                    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
   812
                    https_proxy)
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   813
                _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
   814
                _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
   815
                    template_dir)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   816
                _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
   817
                _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
   818
                    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
   819
                _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
   820
        except SysrepoException, err:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   821
                error(err)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   822
                ret = EXIT_OOPS
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   823
        return ret
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   824
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   825
def main_func():
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   826
        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
   827
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   828
        global orig_cwd
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   829
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   830
        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   831
                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
   832
        except OSError, e:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   833
                try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   834
                        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
   835
                        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
   836
                                orig_cwd = None
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   837
                except KeyError:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   838
                        orig_cwd = None
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   839
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   840
        # some sensible defaults
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   841
        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
   842
        port = None
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   843
        # 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
   844
        # _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
   845
        image_root = ""
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   846
        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
   847
        cache_size = "1024"
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   848
        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
   849
        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
   850
        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
   851
        http_timeout = 4
2479
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   852
        http_proxy = None
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   853
        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
   854
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   855
        try:
2479
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   856
                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
   857
                    "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
   858
                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
   859
                        if opt == "-c":
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   860
                                cache_dir = arg
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   861
                        elif opt == "-h":
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   862
                                host = arg
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   863
                        elif opt == "-l":
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   864
                                log_dir = arg
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   865
                        elif opt == "-p":
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   866
                                port = arg
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   867
                        elif opt == "-r":
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   868
                                runtime_dir = arg
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   869
                        elif opt == "-R":
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   870
                                image_root = arg
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   871
                        elif opt == "-s":
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   872
                                cache_size = arg
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   873
                        elif opt == "-t":
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   874
                                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
   875
                        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
   876
                                http_timeout = arg
2479
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   877
                        elif opt == "-w":
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   878
                                http_proxy = arg
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   879
                        elif opt == "-W":
2d6f9d6cb05b 18701 sysrepo needs http/https proxy support
Tim Foster <tim.s.foster@oracle.com>
parents: 2453
diff changeset
   880
                                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
   881
                        else:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   882
                                usage()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   883
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   884
        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
   885
                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
   886
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   887
        if not port:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   888
                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
   889
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   890
        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
   891
            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
   892
            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
   893
            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
   894
            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
   895
        return ret
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   896
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   897
#
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   898
# 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
   899
# 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
   900
#
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   901
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
   902
        """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
   903
        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
   904
        """
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   905
2569
1f9f50d0cde3 18977 pkg stack traces should tell customers to report issues to service
Shawn Walker <shawn.walker@oracle.com>
parents: 2550
diff changeset
   906
        traceback_str = misc.get_traceback_message()
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   907
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   908
        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   909
                # 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
   910
                # 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
   911
                # 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
   912
                # 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
   913
                try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   914
                        __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
   915
                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
   916
                        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
   917
                            __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
   918
                                raise
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   919
                        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
   920
                        __ret = EXIT_OOPS
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   921
        except SystemExit, __e:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   922
                raise __e
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   923
        except (PipeError, KeyboardInterrupt):
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   924
                # 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
   925
                # 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
   926
                __ret = EXIT_OOPS
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   927
        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
   928
                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
   929
                    "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
   930
                    "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
   931
                    "%(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
   932
                     '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
   933
                    })
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   934
                __ret = EXIT_OOPS
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   935
        except:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   936
                traceback.print_exc()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   937
                error(traceback_str)
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   938
                __ret = 99
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   939
        return __ret
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   940
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   941
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   942
if __name__ == "__main__":
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   943
        misc.setlocale(locale.LC_ALL, "", error)
2728
69903f3b722b 7166082 pkg command does not handle Japanese character encoding on Solaris 11
Abhinandan Ekande <abhinandan.ekande@oracle.com>
parents: 2701
diff changeset
   944
        gettext.install("pkg", "/usr/share/locale",
69903f3b722b 7166082 pkg command does not handle Japanese character encoding on Solaris 11
Abhinandan Ekande <abhinandan.ekande@oracle.com>
parents: 2701
diff changeset
   945
            codeset=locale.getpreferredencoding())
2310
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   946
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   947
        # 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
   948
        warnings.simplefilter('error')
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   949
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   950
        __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
   951
        try:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   952
                logging.shutdown()
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   953
        except IOError:
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   954
                # 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
   955
                pass
ce10607d5332 11684 desire option to not propagate certs to non-global zones
Brock Pytlik <brock.pytlik@oracle.com>
parents:
diff changeset
   956
        sys.exit(__retval)