"""Collects and displays information to the user.""" from __future__ import print_function import collections import logging import sys import textwrap from six.moves import queue # type: ignore # pylint: disable=import-error import zope.interface from certbot import interfaces from certbot import util logger = logging.getLogger(__name__) @zope.interface.implementer(interfaces.IReporter) class Reporter(object): """Collects and displays information to the user. :ivar `queue.PriorityQueue` messages: Messages to be displayed to the user. """ HIGH_PRIORITY = 0 """High priority constant. See `add_message`.""" MEDIUM_PRIORITY = 1 """Medium priority constant. See `add_message`.""" LOW_PRIORITY = 2 """Low priority constant. See `add_message`.""" _msg_type = collections.namedtuple('ReporterMsg', 'priority text on_crash') def __init__(self, config): self.messages = queue.PriorityQueue() self.config = config def add_message(self, msg, priority, on_crash=True): """Adds msg to the list of messages to be printed. :param str msg: Message to be displayed to the user. :param int priority: One of `HIGH_PRIORITY`, `MEDIUM_PRIORITY`, or `LOW_PRIORITY`. :param bool on_crash: Whether or not the message should be printed if the program exits abnormally. """ assert self.HIGH_PRIORITY <= priority <= self.LOW_PRIORITY self.messages.put(self._msg_type(priority, msg, on_crash)) logger.debug("Reporting to user: %s", msg) def print_messages(self): """Prints messages to the user and clears the message queue. If there is an unhandled exception, only messages for which ``on_crash`` is ``True`` are printed. """ bold_on = False if not self.messages.empty(): no_exception = sys.exc_info()[0] is None bold_on = sys.stdout.isatty() if not self.config.quiet: if bold_on: print(util.ANSI_SGR_BOLD) print('IMPORTANT NOTES:') first_wrapper = textwrap.TextWrapper( initial_indent=' - ', subsequent_indent=(' ' * 3), break_long_words=False, break_on_hyphens=False) next_wrapper = textwrap.TextWrapper( initial_indent=first_wrapper.subsequent_indent, subsequent_indent=first_wrapper.subsequent_indent, break_long_words=False, break_on_hyphens=False) while not self.messages.empty(): msg = self.messages.get() if self.config.quiet: # In --quiet mode, we only print high priority messages that # are flagged for crash cases if not (msg.priority == self.HIGH_PRIORITY and msg.on_crash): continue if no_exception or msg.on_crash: if bold_on and msg.priority > self.HIGH_PRIORITY: if not self.config.quiet: sys.stdout.write(util.ANSI_SGR_RESET) bold_on = False lines = msg.text.splitlines() print(first_wrapper.fill(lines[0])) if len(lines) > 1: print("\n".join( next_wrapper.fill(line) for line in lines[1:])) if bold_on and not self.config.quiet: sys.stdout.write(util.ANSI_SGR_RESET)
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
__pycache__ | Folder | 0755 |
|
|
display | Folder | 0755 |
|
|
plugins | Folder | 0755 |
|
|
tests | Folder | 0755 |
|
|
__init__.py | File | 114 B | 0644 |
|
account.py | File | 13.98 KB | 0644 |
|
achallenges.py | File | 1.59 KB | 0644 |
|
auth_handler.py | File | 20.92 KB | 0644 |
|
cert_manager.py | File | 15.1 KB | 0644 |
|
cli.py | File | 71.49 KB | 0644 |
|
client.py | File | 28.72 KB | 0644 |
|
compat.py | File | 6.91 KB | 0644 |
|
configuration.py | File | 5.66 KB | 0644 |
|
constants.py | File | 6.54 KB | 0644 |
|
crypto_util.py | File | 15.29 KB | 0644 |
|
eff.py | File | 3.07 KB | 0644 |
|
error_handler.py | File | 5.81 KB | 0644 |
|
errors.py | File | 2.59 KB | 0644 |
|
hooks.py | File | 8.44 KB | 0644 |
|
interfaces.py | File | 22.02 KB | 0644 |
|
lock.py | File | 3.56 KB | 0644 |
|
log.py | File | 12.39 KB | 0644 |
|
main.py | File | 48.47 KB | 0644 |
|
notify.py | File | 1.04 KB | 0644 |
|
ocsp.py | File | 4.1 KB | 0644 |
|
renewal.py | File | 20.91 KB | 0644 |
|
reporter.py | File | 3.46 KB | 0644 |
|
reverter.py | File | 23.32 KB | 0644 |
|
ssl-dhparams.pem | File | 424 B | 0644 |
|
storage.py | File | 44.91 KB | 0644 |
|
updater.py | File | 3.86 KB | 0644 |
|
util.py | File | 20.35 KB | 0644 |
|