__init__.py revision 2092
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#
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen# When distributing Covered Code, include this CDDL HEADER in each
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen# If applicable, add the following below this CDDL HEADER, with the
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen# fields enclosed by brackets "[]" replaced with your own identifying
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen# information: Portions Copyright [yyyy] [name of copyright owner]
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen#
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen# CDDL HEADER END
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen#
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen# Use is subject to license terms.
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainenimport copy
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainenimport logging
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainenimport os
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainenimport sys
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen__all__ = ["global_settings"]
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenclass _LogFilter(logging.Filter):
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen def __init__(self, max_level=logging.CRITICAL):
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo 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 Sirainenclass GlobalSettings(object):
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen """ This class defines settings which are global
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen to the client instance """
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen def __init__(self):
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen object.__init__(self)
e06c0b65c16ccce69bbee009ead14d7d3d17a256Timo Sirainen self.__info_log_handler = None
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen self.__error_log_handler = None
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen self.__verbose = False
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen self.client_name = None
abe8230dd1dd37d7ccf0163100e934bb5e658c20Timo Sirainen self.client_args = sys.argv[:]
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen # Default maximum number of redirects received before
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen # aborting a connection.
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen self.pkg_client_max_redirect_default = 5
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen # Default number of retries per-host
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen self.pkg_client_max_timeout_default = 4
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen # Default number of seconds to give up if not connected
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen self.pkg_client_connect_timeout_default = 60
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen # Default number of seconds beneath low-speed limit before
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen # giving up.
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen self.pkg_client_lowspeed_timeout_default = 30
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen # Minimum bytes/sec before client thinks about giving up
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen # on connection.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.pkg_client_lowspeed_limit = 1024
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen # Maximum number of transient errors before we abort an
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen # endpoint.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.pkg_client_max_consecutive_error_default = 4
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen try:
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen # Maximum number of timeouts before client gives up.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.PKG_CLIENT_MAX_TIMEOUT = int(os.environ.get(
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "PKG_CLIENT_MAX_TIMEOUT",
f16c114c20bbd7d292d93415d1e56c8dd6abd3e7Timo Sirainen self.pkg_client_max_timeout_default))
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen except ValueError:
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen self.PKG_CLIENT_MAX_TIMEOUT = \
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen self.pkg_client_max_timeout_default
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen try:
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen # Number of seconds trying to connect before client
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen # aborts.
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen self.PKG_CLIENT_CONNECT_TIMEOUT = int(os.environ.get(
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen "PKG_CLIENT_CONNECT_TIMEOUT",
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen self.pkg_client_connect_timeout_default))
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen except ValueError:
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen self.PKG_CLIENT_CONNECT_TIMEOUT = \
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.pkg_client_connect_timeout_default
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen try:
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen # Number of seconds below lowspeed limit before
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen # transaction is aborted.
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen self.PKG_CLIENT_LOWSPEED_TIMEOUT = int(os.environ.get(
659fe5d24825b160cae512538088020d97a60239Timo Sirainen "PKG_CLIENT_LOWSPEED_TIMEOUT",
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen self.pkg_client_lowspeed_timeout_default))
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen except ValueError:
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen self.PKG_CLIENT_LOWSPEED_TIMEOUT = \
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen self.pkg_client_lowspeed_timeout_default
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen try:
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen # Number of transient errors before transaction
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen # is aborted.
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen self.PKG_CLIENT_MAX_CONSECUTIVE_ERROR = int(
659fe5d24825b160cae512538088020d97a60239Timo Sirainen os.environ.get("PKG_CLIENT_MAX_CONSECUTIVE_ERROR",
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen self.pkg_client_max_consecutive_error_default))
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen except ValueError:
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen self.PKG_CLIENT_MAX_CONSECUTIVE_ERROR = \
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen self.pkg_client_max_consecutive_error_default
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen try:
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen # Number of redirects before a connection is
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen # aborted.
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen self.PKG_CLIENT_MAX_REDIRECT = int(
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen os.environ.get("PKG_CLIENT_MAX_REDIRECT",
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen self.pkg_client_max_redirect_default))
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen except ValueError:
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen self.PKG_CLIENT_MAX_REDIRECT = \
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen self.pkg_client_max_redirect_default
9e59a1f3f095b3099478562cf3f3970a24736970Timo Sirainen self.reset_logging()
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen
178511b57faa7c3f8203dd8b7e4059d00cbfc23aTimo Sirainen def __get_error_log_handler(self):
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen return self.__error_log_handler
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen def __get_info_log_handler(self):
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen return self.__info_log_handler
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen def __get_verbose(self):
33d63688ed8b26dc333e3c2edbfb2fe6e412604dTimo Sirainen return self.__verbose
33d63688ed8b26dc333e3c2edbfb2fe6e412604dTimo Sirainen
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen def __set_error_log_handler(self, val):
e68309fcfa2eaa88217fd51e7b4900fc9c20ef5dTimo Sirainen logger = logging.getLogger("pkg")
e68309fcfa2eaa88217fd51e7b4900fc9c20ef5dTimo Sirainen if self.__error_log_handler:
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen logger.removeHandler(self.__error_log_handler)
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen self.__error_log_handler = val
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen if val:
9e59a1f3f095b3099478562cf3f3970a24736970Timo Sirainen logger.addHandler(val)
9e59a1f3f095b3099478562cf3f3970a24736970Timo Sirainen
f0569d9fbb25c8437760be69f194595a841ad711Timo Sirainen def __set_info_log_handler(self, val):
96c253a039f102fa78a313ee05200ab3970112dcTimo Sirainen logger = logging.getLogger("pkg")
96c253a039f102fa78a313ee05200ab3970112dcTimo Sirainen if self.__info_log_handler:
96c253a039f102fa78a313ee05200ab3970112dcTimo Sirainen logger.removeHandler(self.__info_log_handler)
96c253a039f102fa78a313ee05200ab3970112dcTimo Sirainen self.__info_log_handler = val
96c253a039f102fa78a313ee05200ab3970112dcTimo Sirainen if val:
e5c08648676d1989f6e70b95e5990c26b3e8b96bTimo Sirainen logger.addHandler(val)
e68309fcfa2eaa88217fd51e7b4900fc9c20ef5dTimo Sirainen
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen def __set_verbose(self, val):
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen if self.__info_log_handler:
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen if val:
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen level = logging.DEBUG
02b79f9c2636da1829eee5b92753602bba8b67edTimo Sirainen else:
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen level = logging.INFO
313fe89df4d91cd0cd7f3558dc6d7fd21ad39eeeTimo Sirainen self.__info_log_handler.setLevel(level)
01cbf4ac5d44137ab434791be7f838d98d0fcf3bTimo Sirainen self.__verbose = val
b9ac6179d3aee0d1641a4ee1d78da28628929c61Timo Sirainen
9a06cabdfdf4d5e2f19a07e506c3c7d08a7e7038Timo Sirainen @property
9a06cabdfdf4d5e2f19a07e506c3c7d08a7e7038Timo Sirainen def logger(self):
9a06cabdfdf4d5e2f19a07e506c3c7d08a7e7038Timo Sirainen return logging.getLogger("pkg")
88553367d677170a4b703b9d52aac9eabf91c656Timo Sirainen
9a06cabdfdf4d5e2f19a07e506c3c7d08a7e7038Timo Sirainen def reset_logging(self):
b9ac6179d3aee0d1641a4ee1d78da28628929c61Timo Sirainen """Resets client logging to its default state. This will cause
b9ac6179d3aee0d1641a4ee1d78da28628929c61Timo Sirainen all logging.INFO entries to go to sys.stdout, and all entries of
9aa52288a4b53186d81b0ec9afa7d9e0a8ee8753Timo Sirainen logging.WARNING or higher to go to sys.stderr."""
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen logger = logging.getLogger("pkg")
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen logger.setLevel(logging.DEBUG)
b3febb0933fdce10394d25093e23ce0a5aadddd3Timo Sirainen
b3febb0933fdce10394d25093e23ce0a5aadddd3Timo Sirainen # Don't pass messages that are rejected to the root logger.
b3febb0933fdce10394d25093e23ce0a5aadddd3Timo Sirainen logger.propagate = 0
b3febb0933fdce10394d25093e23ce0a5aadddd3Timo Sirainen
b3febb0933fdce10394d25093e23ce0a5aadddd3Timo Sirainen # By default, log all informational messages, but not warnings
b3febb0933fdce10394d25093e23ce0a5aadddd3Timo Sirainen # and above to stdout.
b3febb0933fdce10394d25093e23ce0a5aadddd3Timo Sirainen info_h = logging.StreamHandler(sys.stdout)
b3febb0933fdce10394d25093e23ce0a5aadddd3Timo Sirainen
b3febb0933fdce10394d25093e23ce0a5aadddd3Timo Sirainen # Minimum logging level for informational messages.
b3febb0933fdce10394d25093e23ce0a5aadddd3Timo Sirainen if self.verbose:
b3febb0933fdce10394d25093e23ce0a5aadddd3Timo Sirainen info_h.setLevel(logging.DEBUG)
b3febb0933fdce10394d25093e23ce0a5aadddd3Timo Sirainen else:
b3febb0933fdce10394d25093e23ce0a5aadddd3Timo Sirainen info_h.setLevel(logging.INFO)
b3febb0933fdce10394d25093e23ce0a5aadddd3Timo Sirainen
b3febb0933fdce10394d25093e23ce0a5aadddd3Timo Sirainen log_fmt = logging.Formatter()
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen # Enforce maximum logging level for informational messages.
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen info_f = _LogFilter(logging.INFO)
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen info_h.addFilter(info_f)
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen info_h.setFormatter(log_fmt)
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen logger.addHandler(info_h)
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen # By default, log all warnings and above to stderr.
3f190f4cbb9233a3a6830956cb5c7ae56a577b79Timo Sirainen error_h = logging.StreamHandler(sys.stderr)
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen error_h.setFormatter(log_fmt)
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen error_h.setLevel(logging.WARNING)
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen logger.addHandler(error_h)
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen # Stash the handles so they can be removed later.
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen self.info_log_handler = info_h
6843896c40bee4f9b6680ca7ced598c446e9f999Timo Sirainen self.error_log_handler = error_h
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen error_log_handler = property(__get_error_log_handler,
755fe6da51ab7f54aa1d86913cb344bffef60e79Timo Sirainen __set_error_log_handler)
345212e8f61ebf14ff4f80df26df9e655eb5121eTimo Sirainen
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen info_log_handler = property(__get_info_log_handler,
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen __set_info_log_handler)
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen verbose = property(__get_verbose, __set_verbose)
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainenglobal_settings = GlobalSettings()
dda2c506c8fc8ac2f88272de4523ded42baa0aa0Timo Sirainen