add a 'settings' attribute on loggers to store user values like 'save_responses', 'responses_dirname', 'ssl_insecure', etc.

This commit is contained in:
Romain Bignon 2014-03-25 22:58:35 +01:00
commit 42028c390f
5 changed files with 34 additions and 39 deletions

View file

@ -31,7 +31,7 @@ from weboob.tools.browser.browser import FormFieldConversionWarning
from weboob.core import Weboob, CallErrors from weboob.core import Weboob, CallErrors
from weboob.core.backendscfg import BackendsConfig from weboob.core.backendscfg import BackendsConfig
from weboob.tools.config.iconfig import ConfigError from weboob.tools.config.iconfig import ConfigError
from weboob.tools.log import createColoredFormatter, getLogger from weboob.tools.log import createColoredFormatter, getLogger, settings as log_settings
from weboob.tools.misc import to_unicode from weboob.tools.misc import to_unicode
from .results import ResultsConditionError from .results import ResultsConditionError
@ -140,6 +140,7 @@ class BaseApplication(object):
self.config = None self.config = None
self.options = None self.options = None
self.condition = None self.condition = None
self.storage = None
if option_parser is None: if option_parser is None:
self._parser = OptionParser(self.SYNOPSIS, version=self._get_optparse_version()) self._parser = OptionParser(self.SYNOPSIS, version=self._get_optparse_version())
else: else:
@ -327,12 +328,6 @@ class BaseApplication(object):
if self.options.debug or self.options.save_responses: if self.options.debug or self.options.save_responses:
level = logging.DEBUG level = logging.DEBUG
from weboob.tools.browser import StandardBrowser
from weboob.tools.browser2 import BaseBrowser as Browser2
StandardBrowser.DEBUG_MECHANIZE = True
# required to actually display or save the stuff
logger = logging.getLogger("mechanize")
logger.setLevel(logging.INFO)
elif self.options.verbose: elif self.options.verbose:
level = logging.INFO level = logging.INFO
elif self.options.quiet: elif self.options.quiet:
@ -340,10 +335,7 @@ class BaseApplication(object):
else: else:
level = logging.WARNING level = logging.WARNING
if self.options.insecure: if self.options.insecure:
from weboob.tools.browser import StandardBrowser log_settings['ssl_insecure'] = True
from weboob.tools.browser2 import BaseBrowser as Browser2 # NOQA
StandardBrowser.INSECURE = True
Browser2.VERIFY = False
# this only matters to developers # this only matters to developers
if not self.options.debug and not self.options.save_responses: if not self.options.debug and not self.options.save_responses:
@ -355,10 +347,8 @@ class BaseApplication(object):
if self.options.save_responses: if self.options.save_responses:
responses_dirname = tempfile.mkdtemp(prefix='weboob_session_') responses_dirname = tempfile.mkdtemp(prefix='weboob_session_')
print >>sys.stderr, 'Debug data will be saved in this directory: %s' % responses_dirname print >>sys.stderr, 'Debug data will be saved in this directory: %s' % responses_dirname
StandardBrowser.SAVE_RESPONSES = True log_settings['save_responses'] = True
Browser2.SAVE_RESPONSES = True log_settings['responses_dirname'] = responses_dirname
StandardBrowser.responses_dirname = responses_dirname
Browser2.responses_dirname = responses_dirname
handlers.append(self.create_logging_file_handler(os.path.join(responses_dirname, 'debug.log'))) handlers.append(self.create_logging_file_handler(os.path.join(responses_dirname, 'debug.log')))
# file logger # file logger
@ -375,16 +365,16 @@ class BaseApplication(object):
return args return args
@classmethod @classmethod
def create_default_logger(klass): def create_default_logger(cls):
# stdout logger # stdout logger
format = '%(asctime)s:%(levelname)s:%(name)s:' + klass.VERSION +\ format = '%(asctime)s:%(levelname)s:%(name)s:' + cls.VERSION +\
':%(filename)s:%(lineno)d:%(funcName)s %(message)s' ':%(filename)s:%(lineno)d:%(funcName)s %(message)s'
handler = logging.StreamHandler(sys.stdout) handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(createColoredFormatter(sys.stdout, format)) handler.setFormatter(createColoredFormatter(sys.stdout, format))
return handler return handler
@classmethod @classmethod
def setup_logging(klass, level, handlers): def setup_logging(cls, level, handlers):
logging.root.handlers = [] logging.root.handlers = []
logging.root.setLevel(level) logging.root.setLevel(level)
@ -405,7 +395,7 @@ class BaseApplication(object):
return handler return handler
@classmethod @classmethod
def run(klass, args=None): def run(cls, args=None):
""" """
This static method can be called to run the application. This static method can be called to run the application.
@ -421,13 +411,13 @@ class BaseApplication(object):
>>> MyApplication.run() >>> MyApplication.run()
""" """
klass.setup_logging(logging.INFO, [klass.create_default_logger()]) cls.setup_logging(logging.INFO, [cls.create_default_logger()])
if args is None: if args is None:
args = [(sys.stdin.encoding and arg.decode(sys.stdin.encoding) or to_unicode(arg)) for arg in sys.argv] args = [(sys.stdin.encoding and arg.decode(sys.stdin.encoding) or to_unicode(arg)) for arg in sys.argv]
try: try:
app = klass() app = cls()
except BackendsConfig.WrongPermissions as e: except BackendsConfig.WrongPermissions as e:
print >>sys.stderr, e print >>sys.stderr, e
sys.exit(1) sys.exit(1)

View file

@ -339,8 +339,8 @@ class BaseBackend(object):
kwargs['logger'] = self.logger kwargs['logger'] = self.logger
if hasattr(self.BROWSER, 'SAVE_RESPONSES') and self.BROWSER.SAVE_RESPONSES and self.BROWSER.responses_dirname: if self.logger.settings['responses_dirname']:
kwargs.setdefault('responses_dirname', os.path.join(self.BROWSER.responses_dirname, kwargs.setdefault('responses_dirname', os.path.join(self.logger.settings['responses_dirname'],
self._private_config.get('_debug_dir', self.name))) self._private_config.get('_debug_dir', self.name)))
return self.BROWSER(*args, **kwargs) return self.BROWSER(*args, **kwargs)

View file

@ -21,7 +21,6 @@
from copy import copy from copy import copy
from httplib import BadStatusLine from httplib import BadStatusLine
from logging import warning
try: try:
import mechanize import mechanize
@ -41,6 +40,7 @@ import time
import urllib import urllib
import urllib2 import urllib2
import mimetypes import mimetypes
import logging
from contextlib import closing from contextlib import closing
from gzip import GzipFile from gzip import GzipFile
import warnings import warnings
@ -55,7 +55,7 @@ from weboob.tools.parsers import get_parser
try: try:
from .firefox_cookies import FirefoxCookieJar from .firefox_cookies import FirefoxCookieJar
except ImportError as e: except ImportError as e:
warning("Unable to store cookies: %s" % e) logging.warning("Unable to store cookies: %s", e)
HAVE_COOKIES = False HAVE_COOKIES = False
else: else:
HAVE_COOKIES = True HAVE_COOKIES = True
@ -194,15 +194,11 @@ class StandardBrowser(mechanize.Browser):
'wget': 'Wget/1.11.4', 'wget': 'Wget/1.11.4',
} }
USER_AGENT = USER_AGENTS['desktop_firefox'] USER_AGENT = USER_AGENTS['desktop_firefox']
SAVE_RESPONSES = False
DEBUG_HTTP = False DEBUG_HTTP = False
DEBUG_MECHANIZE = False DEBUG_MECHANIZE = False
DEFAULT_TIMEOUT = 15 DEFAULT_TIMEOUT = 15
INSECURE = False # if True, do not validate SSL INSECURE = False # if True, do not validate SSL
responses_dirname = None
responses_count = 0
logger = None logger = None
# ------ Browser methods --------------------------------------- # ------ Browser methods ---------------------------------------
@ -244,11 +240,14 @@ class StandardBrowser(mechanize.Browser):
# display messages from httplib # display messages from httplib
self.set_debug_http(True) self.set_debug_http(True)
if self.DEBUG_MECHANIZE: if logging.root.level == logging.DEBUG:
# Enable log messages from mechanize.Browser # Enable log messages from mechanize.Browser
self.set_debug_redirects(True) self.set_debug_redirects(True)
mech_logger = logging.getLogger("mechanize")
mech_logger.setLevel(logging.INFO)
self.responses_dirname = responses_dirname self.responses_dirname = responses_dirname
self.responses_count = 0
def __enter__(self): def __enter__(self):
self.lock.acquire() self.lock.acquire()
@ -304,7 +303,7 @@ class StandardBrowser(mechanize.Browser):
result = self.openurl(url, *args, **kwargs) result = self.openurl(url, *args, **kwargs)
if result: if result:
if self.SAVE_RESPONSES: if self.logger.settings['save_responses']:
self.save_response(result) self.save_response(result)
return result.read() return result.read()
else: else:
@ -431,7 +430,7 @@ class StandardBrowser(mechanize.Browser):
return return
def lowsslcheck(self, domain, hsh): def lowsslcheck(self, domain, hsh):
if self.INSECURE: if self.INSECURE or self.logger.settings['ssl_insecure']:
return return
certhash = self._certhash(domain) certhash = self._certhash(domain)
if self.logger: if self.logger:
@ -698,7 +697,7 @@ class BaseBrowser(StandardBrowser):
self.logger.debug('[user_id=%s] Went on %s' % (self.username, result.geturl())) self.logger.debug('[user_id=%s] Went on %s' % (self.username, result.geturl()))
self.last_update = time.time() self.last_update = time.time()
if self.SAVE_RESPONSES: if self.logger.settings['save_responses']:
self.save_response(result) self.save_response(result)
document = self.get_document(result, parser, encoding=pageCls.ENCODING) document = self.get_document(result, parser, encoding=pageCls.ENCODING)

View file

@ -124,7 +124,6 @@ class BaseBrowser(object):
REFRESH_MAX = 0.0 REFRESH_MAX = 0.0
VERIFY = True VERIFY = True
SAVE_RESPONSES = False
PROXIES = None PROXIES = None
@ -199,7 +198,7 @@ class BaseBrowser(object):
session.proxies = self.PROXIES session.proxies = self.PROXIES
session.verify = self.VERIFY session.verify = self.VERIFY and not self.logger.settings['ssl_insecure']
# defines a max_retries. It's mandatory in case a server is not # defines a max_retries. It's mandatory in case a server is not
# handling keep alive correctly, like the proxy burp # handling keep alive correctly, like the proxy burp
@ -214,7 +213,7 @@ class BaseBrowser(object):
profile.setup_session(session) profile.setup_session(session)
if self.SAVE_RESPONSES: if self.logger.settings['save_responses']:
session.hooks['response'].append(self._save) session.hooks['response'].append(self._save)
self.session = session self.session = session
@ -279,7 +278,7 @@ class BaseBrowser(object):
proxies = self.PROXIES proxies = self.PROXIES
if verify is None: if verify is None:
verify = self.VERIFY verify = self.VERIFY and not self.logger.settings['ssl_insecure']
if timeout is None: if timeout is None:
timeout = self.TIMEOUT timeout = self.TIMEOUT

View file

@ -17,11 +17,12 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with weboob. If not, see <http://www.gnu.org/licenses/>. # along with weboob. If not, see <http://www.gnu.org/licenses/>.
from collections import defaultdict
from logging import Formatter, getLogger as _getLogger from logging import Formatter, getLogger as _getLogger
import sys import sys
__all__ = ['getLogger', 'createColoredFormatter'] __all__ = ['getLogger', 'createColoredFormatter', 'settings']
RESET_SEQ = "\033[0m" RESET_SEQ = "\033[0m"
@ -36,10 +37,16 @@ COLORS = {
} }
# Global settings f logger.
settings = defaultdict(lambda: None)
def getLogger(name, parent=None): def getLogger(name, parent=None):
if parent: if parent:
name = parent.name + '.' + name name = parent.name + '.' + name
return _getLogger(name) logger = _getLogger(name)
logger.settings = settings
return logger
class ColoredFormatter(Formatter): class ColoredFormatter(Formatter):