__init__.py revision 2678
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#!/usr/bin/python
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# CDDL HEADER START
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# The contents of this file are subject to the terms of the
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# Common Development and Distribution License (the "License").
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# You may not use this file except in compliance with the License.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# or http://www.opensolaris.org/os/licensing.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# See the License for the specific language governing permissions
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# and limitations under the License.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# When distributing Covered Code, include this CDDL HEADER in each
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# If applicable, add the following below this CDDL HEADER, with the
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# fields enclosed by brackets "[]" replaced with your own identifying
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# information: Portions Copyright [yyyy] [name of copyright owner]
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# CDDL HEADER END
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenimport copy
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenimport logging
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenimport os
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenimport sys
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen__all__ = ["global_settings"]
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenclass _LogFilter(logging.Filter):
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen def __init__(self, max_level=logging.CRITICAL):
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen logging.Filter.__init__(self)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.max_level = max_level
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen def filter(self, record):
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return record.levelno <= self.max_level
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenclass _StreamHandler(logging.StreamHandler):
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen """Simple subclass to ignore exceptions raised during logging output."""
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen def handleError(self, record):
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen # Ignore exceptions raised during output to stdout/stderr.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenclass GlobalSettings(object):
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen """ This class defines settings which are global
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen to the client instance """
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen def __init__(self):
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen object.__init__(self)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.__info_log_handler = None
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.__error_log_handler = None
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.__verbose = False
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.client_name = None
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.client_args = sys.argv[:]
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen # Default maximum number of redirects received before
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen # aborting a connection.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.pkg_client_max_redirect_default = 5
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen # Default number of retries per-host
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen self.pkg_client_max_timeout_default = 4
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen # Default number of seconds to give up if not connected
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.pkg_client_connect_timeout_default = 60
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen # Default number of seconds beneath low-speed limit before
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen # giving up.
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen self.pkg_client_lowspeed_timeout_default = 30
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen # Minimum bytes/sec before client thinks about giving up
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen # on connection.
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen self.pkg_client_lowspeed_limit = 1024
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen # Maximum number of transient errors before we abort an
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen # endpoint.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.pkg_client_max_consecutive_error_default = 4
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen # The location within the image of the cache for pkg.sysrepo(1M)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.sysrepo_pub_cache_path = \
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "var/cache/pkg/sysrepo_pub_cache.dat"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen try:
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen # Maximum number of timeouts before client gives up.
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen self.PKG_CLIENT_MAX_TIMEOUT = int(os.environ.get(
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen "PKG_CLIENT_MAX_TIMEOUT",
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen self.pkg_client_max_timeout_default))
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen except ValueError:
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.PKG_CLIENT_MAX_TIMEOUT = \
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.pkg_client_max_timeout_default
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen try:
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen # Number of seconds trying to connect before client
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen # aborts.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.PKG_CLIENT_CONNECT_TIMEOUT = int(os.environ.get(
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "PKG_CLIENT_CONNECT_TIMEOUT",
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.pkg_client_connect_timeout_default))
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen except ValueError:
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.PKG_CLIENT_CONNECT_TIMEOUT = \
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.pkg_client_connect_timeout_default
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen try:
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen # Number of seconds below lowspeed limit before
b2105c78f0fd58281317e6d777ded860f33153a3Timo Sirainen # transaction is aborted.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.PKG_CLIENT_LOWSPEED_TIMEOUT = int(os.environ.get(
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen "PKG_CLIENT_LOWSPEED_TIMEOUT",
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen self.pkg_client_lowspeed_timeout_default))
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen except ValueError:
b2105c78f0fd58281317e6d777ded860f33153a3Timo Sirainen self.PKG_CLIENT_LOWSPEED_TIMEOUT = \
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen self.pkg_client_lowspeed_timeout_default
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen try:
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen # Number of transient errors before transaction
b2105c78f0fd58281317e6d777ded860f33153a3Timo Sirainen # is aborted.
b2105c78f0fd58281317e6d777ded860f33153a3Timo Sirainen self.PKG_CLIENT_MAX_CONSECUTIVE_ERROR = int(
b2105c78f0fd58281317e6d777ded860f33153a3Timo Sirainen os.environ.get("PKG_CLIENT_MAX_CONSECUTIVE_ERROR",
b2105c78f0fd58281317e6d777ded860f33153a3Timo Sirainen self.pkg_client_max_consecutive_error_default))
b2105c78f0fd58281317e6d777ded860f33153a3Timo Sirainen except ValueError:
690af4a90eaf8611c2573d34126bb7a852c50a44Timo Sirainen self.PKG_CLIENT_MAX_CONSECUTIVE_ERROR = \
690af4a90eaf8611c2573d34126bb7a852c50a44Timo Sirainen self.pkg_client_max_consecutive_error_default
690af4a90eaf8611c2573d34126bb7a852c50a44Timo Sirainen try:
690af4a90eaf8611c2573d34126bb7a852c50a44Timo Sirainen # Number of redirects before a connection is
690af4a90eaf8611c2573d34126bb7a852c50a44Timo Sirainen # aborted.
690af4a90eaf8611c2573d34126bb7a852c50a44Timo Sirainen self.PKG_CLIENT_MAX_REDIRECT = int(
b2105c78f0fd58281317e6d777ded860f33153a3Timo Sirainen os.environ.get("PKG_CLIENT_MAX_REDIRECT",
b2105c78f0fd58281317e6d777ded860f33153a3Timo Sirainen self.pkg_client_max_redirect_default))
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen except ValueError:
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.PKG_CLIENT_MAX_REDIRECT = \
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.pkg_client_max_redirect_default
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen self.reset_logging()
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen def __get_error_log_handler(self):
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return self.__error_log_handler
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
b2105c78f0fd58281317e6d777ded860f33153a3Timo Sirainen def __get_info_log_handler(self):
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen return self.__info_log_handler
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen def __get_verbose(self):
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return self.__verbose
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen def __set_error_log_handler(self, val):
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen logger = logging.getLogger("pkg")
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if self.__error_log_handler:
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen logger.removeHandler(self.__error_log_handler)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.__error_log_handler = val
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if val:
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen logger.addHandler(val)
b2105c78f0fd58281317e6d777ded860f33153a3Timo Sirainen
b2105c78f0fd58281317e6d777ded860f33153a3Timo Sirainen def __set_info_log_handler(self, val):
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen logger = logging.getLogger("pkg")
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if self.__info_log_handler:
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen logger.removeHandler(self.__info_log_handler)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.__info_log_handler = val
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if val:
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen logger.addHandler(val)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen def __set_verbose(self, val):
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if self.__info_log_handler:
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if val:
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen level = logging.DEBUG
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen else:
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen level = logging.INFO
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.__info_log_handler.setLevel(level)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.__verbose = val
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen @property
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen def logger(self):
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return logging.getLogger("pkg")
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen def reset_logging(self):
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen """Resets client logging to its default state. This will cause
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen all logging.INFO entries to go to sys.stdout, and all entries of
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen logging.WARNING or higher to go to sys.stderr."""
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen logger = logging.getLogger("pkg")
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen logger.setLevel(logging.DEBUG)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen # Don't pass messages that are rejected to the root logger.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen logger.propagate = 0
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen # By default, log all informational messages, but not warnings
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen # and above to stdout.
5c1a8aee989af87bddefd71e2aa83aa2bd695155Timo Sirainen info_h = _StreamHandler(sys.stdout)
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen # Minimum logging level for informational messages.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if self.verbose:
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen info_h.setLevel(logging.DEBUG)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen else:
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen info_h.setLevel(logging.INFO)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen log_fmt = logging.Formatter()
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen # Enforce maximum logging level for informational messages.
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen info_f = _LogFilter(logging.INFO)
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen info_h.addFilter(info_f)
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen info_h.setFormatter(log_fmt)
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen logger.addHandler(info_h)
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen # By default, log all warnings and above to stderr.
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen error_h = _StreamHandler(sys.stderr)
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen error_h.setFormatter(log_fmt)
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen error_h.setLevel(logging.WARNING)
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen logger.addHandler(error_h)
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen # Stash the handles so they can be removed later.
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen self.info_log_handler = info_h
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen self.error_log_handler = error_h
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen error_log_handler = property(__get_error_log_handler,
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen __set_error_log_handler)
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen info_log_handler = property(__get_info_log_handler,
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen __set_info_log_handler)
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen verbose = property(__get_verbose, __set_verbose)
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainenglobal_settings = GlobalSettings()
5c1a8aee989af87bddefd71e2aa83aa2bd695155Timo Sirainen