Improve logging

This commit is contained in:
s3lph 2022-04-19 01:17:25 +02:00
parent d50ce036ea
commit 6c9856c74a
5 changed files with 22 additions and 26 deletions

View file

@ -28,7 +28,6 @@ class KeyConflictResolution:
self._key_template: str = key_template self._key_template: str = key_template
self._user_template: str = user_template self._user_template: str = user_template
self._dry_run: bool = False self._dry_run: bool = False
self._logger: logging.Logger = logging.getLogger()
def dry_run(self): def dry_run(self):
self._dry_run = True self._dry_run = True
@ -84,10 +83,10 @@ class KeyConflictResolution:
# Conflict Resolution: Choose the OLDEST subscription with a key, but notify using ALL keys # Conflict Resolution: Choose the OLDEST subscription with a key, but notify using ALL keys
earliest: SchleuderSubscriber = min(notnull, key=lambda x: x.created_at) earliest: SchleuderSubscriber = min(notnull, key=lambda x: x.created_at)
assert earliest.key is not None # Make mypy happy; it can't know that earliest.key can't be None assert earliest.key is not None # Make mypy happy; it can't know that earliest.key can't be None
self._logger.debug(f'Key Conflict for {earliest.email} in lists, chose {earliest.key.fingerprint}:') logging.debug(f'Key Conflict for {earliest.email} in lists, chose {earliest.key.fingerprint}:')
for s in subscriptions: for s in subscriptions:
fpr = 'no key' if s.key is None else s.key.fingerprint fpr = 'no key' if s.key is None else s.key.fingerprint
self._logger.debug(f' - {s.schleuder}: {fpr}') logging.debug(f' {s.schleuder}: {fpr}')
# Generate a SHA1 digest that only changes when the subscription list changes # Generate a SHA1 digest that only changes when the subscription list changes
digest = self._make_key_digest(earliest, subscriptions) digest = self._make_key_digest(earliest, subscriptions)
msg: Optional[Message] = None msg: Optional[Message] = None
@ -121,9 +120,10 @@ class KeyConflictResolution:
# Conflict Resolution: Choose the OLDEST subscription with a key, but notify using ALL recipients # Conflict Resolution: Choose the OLDEST subscription with a key, but notify using ALL recipients
earliest: SchleuderSubscriber = min(notnull, key=lambda x: x.created_at) earliest: SchleuderSubscriber = min(notnull, key=lambda x: x.created_at)
assert earliest.key is not None # Make mypy happy; it can't know that earliest.key can't be None assert earliest.key is not None # Make mypy happy; it can't know that earliest.key can't be None
self._logger.debug(f'User Conflict for {earliest.key.fingerprint} in lists, chose {earliest.email}:') logging.debug(f'User Conflict for {earliest.key.fingerprint} in lists, chose {earliest.email}:')
for s in subscriptions: for s in subscriptions:
self._logger.debug(f' - {s.schleuder}: {s.email}') sschleuder = sourcemap.get(s.schleuder, 'unknown')
logging.debug(f' {sschleuder}: {s.email}')
# Generate a SHA1 digest that only changes when the subscription list changes # Generate a SHA1 digest that only changes when the subscription list changes
digest = self._make_user_digest(earliest, subscriptions) digest = self._make_user_digest(earliest, subscriptions)
msgs: Optional[List[Message]] = None msgs: Optional[List[Message]] = None
@ -155,7 +155,7 @@ class KeyConflictResolution:
try: try:
state = json.load(f) state = json.load(f)
except BaseException: except BaseException:
self._logger.exception('Cannot read statefile. Not sending any messages!') logging.exception('Cannot read statefile. Not sending any messages!')
return False return False
# Remove all state entries older than conflict_interval # Remove all state entries older than conflict_interval
state = {k: v for k, v in state.items() if now-v < self._interval} state = {k: v for k, v in state.items() if now-v < self._interval}
@ -171,7 +171,7 @@ class KeyConflictResolution:
json.dump(state, f) json.dump(state, f)
return send return send
except BaseException: except BaseException:
self._logger.exception('Cannot open or write statefile. Not sending any messages!') logging.exception('Cannot open or write statefile. Not sending any messages!')
return False return False
def _make_key_digest(self, chosen: SchleuderSubscriber, candidates: List[SchleuderSubscriber]) -> str: def _make_key_digest(self, chosen: SchleuderSubscriber, candidates: List[SchleuderSubscriber]) -> str:

View file

@ -69,10 +69,9 @@ def main():
ap.add_argument('--verbose', '-v', action='store_true', default=False) ap.add_argument('--verbose', '-v', action='store_true', default=False)
ap.add_argument('--version', action='version', version=__version__) ap.add_argument('--version', action='version', version=__version__)
ns = ap.parse_args(sys.argv[1:]) ns = ap.parse_args(sys.argv[1:])
if ns.verbose: level: str = logging.DEBUG if ns.verbose else logging.INFO
logger = logging.getLogger() logging.basicConfig(style='{', format='{asctime:s} [{levelname:^8s}] {message:}', level=level)
logger.setLevel('DEBUG') logging.debug('Verbose logging enabled')
logger.debug('Verbose logging enabled')
lists, smtp = parse_config(ns) lists, smtp = parse_config(ns)
for lst in lists: for lst in lists:
lst.process(ns.dry_run) lst.process(ns.dry_run)

View file

@ -28,10 +28,9 @@ class MultiList:
self._api: SchleuderApi = api self._api: SchleuderApi = api
self._kcr: KeyConflictResolution = kcr self._kcr: KeyConflictResolution = kcr
self._reporter: Reporter = reporter self._reporter: Reporter = reporter
self._logger: logging.Logger = logging.getLogger()
def process(self, dry_run: bool = False): def process(self, dry_run: bool = False):
self._logger.info(f'Processing: {self._target} {"DRY RUN" if dry_run else ""}') logging.info(f'Processing: {self._target} {"DRY RUN" if dry_run else ""}')
target_list, sources = self._lists_by_name() target_list, sources = self._lists_by_name()
target_admins = self._api.get_list_admins(target_list) target_admins = self._api.get_list_admins(target_list)
# Get current subs, except for unmanaged adresses # Get current subs, except for unmanaged adresses
@ -67,29 +66,29 @@ class MultiList:
# Perform the actual list modifications in an order which avoids race conditions # Perform the actual list modifications in an order which avoids race conditions
for key in to_add: for key in to_add:
self._api.post_key(key, target_list) self._api.post_key(key, target_list)
self._logger.info(f'Added key: {key}') logging.info(f'Added key: {key}')
for sub in to_subscribe: for sub in to_subscribe:
self._api.subscribe(sub, target_list) self._api.subscribe(sub, target_list)
self._logger.info(f'Subscribed user: {sub}') logging.info(f'Subscribed user: {sub}')
for sub in to_update: for sub in to_update:
self._api.update_fingerprint(sub, target_list) self._api.update_fingerprint(sub, target_list)
self._logger.info(f'Updated key: {sub}') logging.info(f'Updated key: {sub}')
for sub in to_unsubscribe: for sub in to_unsubscribe:
self._api.unsubscribe(sub, target_list) self._api.unsubscribe(sub, target_list)
self._logger.info(f'Unsubscribed user: {sub}') logging.info(f'Unsubscribed user: {sub}')
for key in to_remove: for key in to_remove:
self._api.delete_key(key, target_list) self._api.delete_key(key, target_list)
self._logger.info(f'Removed key: {key}') logging.info(f'Removed key: {key}')
if len(to_add) + len(to_subscribe) + len(to_unsubscribe) + len(to_remove) == 0: if len(to_add) + len(to_subscribe) + len(to_unsubscribe) + len(to_remove) == 0:
self._logger.info(f'No changes for {self._target}') logging.info(f'No changes for {self._target}')
else: else:
for admin in target_admins: for admin in target_admins:
report = AdminReport(self._target, admin.email, self._mail_from, report = AdminReport(self._target, admin.email, self._mail_from,
admin.key.blob if admin.key is not None else None, admin.key.blob if admin.key is not None else None,
to_subscribe, to_unsubscribe, to_update, to_add, to_remove) to_subscribe, to_unsubscribe, to_update, to_add, to_remove)
self._reporter.add_message(report) self._reporter.add_message(report)
self._logger.info(f'Finished processing: {self._target}') logging.info(f'Finished processing: {self._target}')
def _lists_by_name(self) -> Tuple[SchleuderList, List[SchleuderList]]: def _lists_by_name(self) -> Tuple[SchleuderList, List[SchleuderList]]:
lists = self._api.get_lists() lists = self._api.get_lists()

View file

@ -224,7 +224,6 @@ class AdminReport(Message):
class Reporter: class Reporter:
_messages: List['Message'] = [] _messages: List['Message'] = []
_logger: logging.Logger = logging.getLogger()
def __init__(self, def __init__(self,
send_conflict_messages: bool, send_conflict_messages: bool,

View file

@ -42,7 +42,6 @@ class SmtpClient:
self._password: Optional[str] = password self._password: Optional[str] = password
self._smtp: Optional[smtplib.SMTP] = None self._smtp: Optional[smtplib.SMTP] = None
self._dry_run: bool = False self._dry_run: bool = False
self._logger = logging.getLogger()
@staticmethod @staticmethod
def parse(config: Dict[str, Any]) -> 'SmtpClient': def parse(config: Dict[str, Any]) -> 'SmtpClient':
@ -63,7 +62,7 @@ class SmtpClient:
with self as smtp: with self as smtp:
for m in messages: for m in messages:
msg = m.mime msg = m.mime
self._logger.debug(f'MIME Message:\n{str(msg)}') logging.debug(f'MIME Message:\n{str(msg)}')
self._send_message(msg) self._send_message(msg)
def _send_message(self, msg: email.message.Message): def _send_message(self, msg: email.message.Message):
@ -71,7 +70,7 @@ class SmtpClient:
raise RuntimeError('SMTP connection is not established') raise RuntimeError('SMTP connection is not established')
if not self._dry_run: if not self._dry_run:
self._smtp.send_message(msg) self._smtp.send_message(msg)
self._logger.debug(f'Sent email message.') logging.debug(f'Sent email message.')
def __enter__(self): def __enter__(self):
# TLS from the start requires a different class # TLS from the start requires a different class
@ -84,7 +83,7 @@ class SmtpClient:
# Only sign in if both username and password are provided # Only sign in if both username and password are provided
if self._username is not None and self._password is not None: if self._username is not None and self._password is not None:
smtp.login(self._username, self._password) smtp.login(self._username, self._password)
self._logger.debug(f'SMTP connection to {str(self)} established') logging.debug(f'SMTP connection to {str(self)} established')
return smtp return smtp
def __exit__(self, exc_type, exc_val, exc_tb): def __exit__(self, exc_type, exc_val, exc_tb):
@ -92,7 +91,7 @@ class SmtpClient:
raise RuntimeError('SMTP connection is not established') raise RuntimeError('SMTP connection is not established')
self._smtp.quit() self._smtp.quit()
ret = self._smtp.__exit__(exc_type, exc_val, exc_tb) ret = self._smtp.__exit__(exc_type, exc_val, exc_tb)
self._logger.debug(f'SMTP connection to {str(self)} closed') logging.debug(f'SMTP connection to {str(self)} closed')
self._smtp = None self._smtp = None
return ret return ret