Skip to content
Snippets Groups Projects
repmgr-event.py 2.09 KiB
#!/usr/bin/env python3

"""
event_notification_command='/usr/local/bin/repmgr_event.py %n %e %s "%t" "%d"'
"""

import argparse
import json
import logging
import logging.handlers
import sys

PARSER = argparse.ArgumentParser()
PARSER.add_argument("node_id")
PARSER.add_argument("event_type")
PARSER.add_argument("success")
PARSER.add_argument("timestamp")
PARSER.add_argument("details")
ARGS = PARSER.parse_args()

MONIT_EVENTS = (
    "standby_promote",
    "repmgrd_failover_promote",
    "repmgrd_failover_follow",
)

LOG_DATA = (ARGS.timestamp, ARGS.node_id, ARGS.event_type, ARGS.success, ARGS.details)


def main():
    """Log repmgrd events."""

    # do not process unwanted events
    if ARGS.event_type not in MONIT_EVENTS:
        sys.exit(0)

    # load config if exists
    try:
        with open("/etc/postgresql/11/main/repmgr-event.json") as data_file:
            data = json.load(data_file)
    except EnvironmentError:
        data = {}

    # get config, fallback on defaults
    log_file = data.get("log", "/var/log/repmgr-event.log")
    mail = data.get("mail", None)
    if mail:
        host = mail.get("host", "localhost")
        sender = mail.get("sender", "root@localhost")
        recipients = mail.get("recipients", ["root@localhost"])
        credentials = mail.get("credentials", None)
        secure = mail.get("secure", None)
    # from args
    subject = "repmgr event: {}".format(ARGS.event_type)

    # logging conf
    logger = logging.getLogger("repmgr_event")
    logger.setLevel(logging.INFO)

    # log to stream
    stream_handler = logging.StreamHandler(sys.stdout)
    logger.addHandler(stream_handler)

    # log to file
    file_handler = logging.handlers.RotatingFileHandler(
        log_file, maxBytes=102400, backupCount=7
    )
    logger.addHandler(file_handler)

    # log to mail
    if mail:
        mail_handler = logging.handlers.SMTPHandler(
            host, sender, recipients, subject, credentials, secure
        )
        logger.addHandler(mail_handler)

    # write log
    logger.info("%s - %s:%s:%s - %s", *LOG_DATA)

    sys.exit(0)


if __name__ == "__main__":
    main()