From 21f4266273ce94365bbecc560c2829b47d9f76ed Mon Sep 17 00:00:00 2001 From: Pim Kunis Date: Sat, 23 Sep 2023 21:11:15 +0200 Subject: [PATCH] incorporate PR review comments --- borgmatic/config/schema.yaml | 66 +++++++++++++----------------------- borgmatic/hooks/apprise.py | 60 ++++++++++++-------------------- setup.py | 3 ++ 3 files changed, 48 insertions(+), 81 deletions(-) diff --git a/borgmatic/config/schema.yaml b/borgmatic/config/schema.yaml index 43754e5c..7315a22e 100644 --- a/borgmatic/config/schema.yaml +++ b/borgmatic/config/schema.yaml @@ -1311,15 +1311,28 @@ properties: required: ['service_urls'] additionalProperties: false properties: - service_urls: - type: array - items: - type: string + services: + type: object + required: + - url + - label + properties: + url: + type: string + example: "mastodon://accesskey/host/?visibility=direct" + label: + type: string + example: mastodon description: | - List of Apprise service URLs to publish to. + A list of Apprise services to publish to with URLs and labels. + The labels are used for logging. + A full list of services and their configuration can be found at + https://github.com/caronc/apprise/wiki. example: - - "mastodon://accesskey/host/?visibility=direct" - - "pagerduty://A1BRTD4JD@TIiajkdnlazkcOXrIdevi7F/node01.local/drive_sda/" + - url: "slack://xoxb-1234-1234-4ddbaae6f3523ada2d/#backups" + label: slackbackups + - url: "matrixs://nuxref:abc123@matrix.example.com/#general/#backups" + label: matrix start: type: object properties: @@ -1332,18 +1345,7 @@ properties: type: string description: | Specify the message body. - exampe: Your backups have failed. - notification_type: - type: string - description: | - The Apprise message type. - enum: - - info - - success - - failure - - warning - example: - - failure + example: Starting backup process. finish: type: object properties: @@ -1356,18 +1358,7 @@ properties: type: string description: | Specify the message body. - exampe: Your backups have failed. - notification_type: - type: string - description: | - The Apprise message type. - enum: - - info - - success - - failure - - warning - example: - - failure + example: Backups successfully made. fail: type: object properties: @@ -1380,18 +1371,7 @@ properties: type: string description: | Specify the message body. - exampe: Your backups have failed. - notification_type: - type: string - description: | - The Apprise message type. - enum: - - info - - success - - failure - - warning - example: - - failure + example: Your backups have failed. states: type: array items: diff --git a/borgmatic/hooks/apprise.py b/borgmatic/hooks/apprise.py index c4ee6bc2..184c75fa 100644 --- a/borgmatic/hooks/apprise.py +++ b/borgmatic/hooks/apprise.py @@ -5,6 +5,13 @@ from apprise import NotifyType, NotifyFormat logger = logging.getLogger(__name__) +state_to_notify_type = { + 'start': NotifyType.INFO, + 'finish': NotifyType.SUCCESS, + 'fail': NotifyType.FAILURE, + 'log': NotifyType.INFO +} + def initialize_monitor( ping_url, config, config_filename, monitoring_log_level, dry_run @@ -17,9 +24,8 @@ def initialize_monitor( def ping_monitor(hook_config, config, config_filename, state, monitoring_log_level, dry_run): ''' - Ping the configured Apprise service URLs. - Use the given configuration filename in any log entries. - If this is a dry run, then don't actually ping anything. + Ping the configured Apprise service URLs. Use the given configuration filename in any log + entries. If this is a dry run, then don't actually ping anything. ''' run_states = hook_config.get('states', ['fail']) @@ -30,60 +36,38 @@ def ping_monitor(hook_config, config, config_filename, state, monitoring_log_lev state.name.lower(), { 'title': f'A borgmatic {state.name} event happened', - 'body': f'A borgmatic {state.name} event happened', - 'notification_type': default_notify_type(state.name.lower()), + 'body': f'A borgmatic {state.name} event happened' }, ) - # TODO: Currently not very meaningful message. - # However, the Apprise service URLs can contain sensitive info. - dry_run_label = ' (dry run; not actually pinging)' if dry_run else '' - logger.info(f'{config_filename}: Pinging Apprise {dry_run_label}') - logger.debug(f'{config_filename}: Using Apprise ping') + if not hook_config.get('services'): + logger.info(f'{config_filename}: No Apprise services to ping') + return + + dry_run_string = ' (dry run; not actually pinging)' if dry_run else '' + labels_string = ', '.join(map(lambda service: service['label'], hook_config.get('services'))) + logger.info(f'{config_filename}: Pinging Apprise services: {labels_string}{dry_run_string}') title = state_config.get('title', '') body = state_config.get('body') - notify_type = state_config.get('notification_type', 'success') + notify_type = state_to_notify_type[state.name.lower()] - apobj = apprise.Apprise() - apobj.add(hook_config.get('service_urls')) + apprise_object = apprise.Apprise() + apprise_object.add(map(lambda service: service['url'], hook_config.get('services'))) if dry_run: return - result = apobj.notify( + result = apprise_object.notify( title=title, body=body, body_format=NotifyFormat.TEXT, - notify_type=get_notify_type(notify_type) - ) + notify_type=notify_type) if result is False: logger.warning(f'{config_filename}: error sending some apprise notifications') -def get_notify_type(s): - if s == 'info': - return NotifyType.INFO - if s == 'success': - return NotifyType.SUCCESS - if s == 'warning': - return NotifyType.WARNING - if s == 'failure': - return NotifyType.FAILURE - - -def default_notify_type(state): - if state == 'start': - return NotifyType.INFO - if state == 'finish': - return NotifyType.SUCCESS - if state == 'fail': - return NotifyType.FAILURE - if state == 'log': - return NotifyType.INFO - - def destroy_monitor( ping_url_or_uuid, config, config_filename, monitoring_log_level, dry_run ): # pragma: no cover diff --git a/setup.py b/setup.py index 9b7e698a..cf892b95 100644 --- a/setup.py +++ b/setup.py @@ -37,6 +37,9 @@ setup( 'setuptools', 'apprise' ), + extra_require={ + "Apprise": ["apprise"] + }, include_package_data=True, python_requires='>=3.7', )