"""Configuration loader and defaults for hbd.""" import logging import os try: import yaml except Exception: yaml = None DEFAULTS = { "hb_port": 50003, "hbd_port": 50004, "hbd_host": "", "pickfile": "/tmp/hb.pick", "logfile": "/var/log/heartbeat.log", "logfmt": "text", "pushsrv": "pushover", "pushover_token": "", "pushover_user": "", "interval": 20, "grace": 2, "dyndomains": ["wrede.org"], "watchhosts": [], "dyndnshosts": [], "drophosts": [], "nsupdate_bin": "/usr/bin/nsupdate", "foreground": False, "verbose": False, "debug": 0, "smtpserver": "smtp.fastmail.com", "smtpuser": "andreas@wrede.ca", "smtppassword": "pvtvefyp5gbhnch2", "smtpport": 587, "toemail": ["aew.hbd.notify@wrede.ca"], "fromemail": "aew.hbd@wrede.ca", "ws_port": 50005, "wss_port": None, "cert_path": "/usr/local/etc/ssl/", "wss_pem": "fullchain.pem", "wss_key": "privkey.pem", } def load_config(path=None): """Load configuration from a YAML file and merge with defaults. If YAML is not available or the file does not exist, defaults are returned. """ cfg = DEFAULTS.copy() if not path: # default path (~/.hb.yaml) path = os.path.join(os.path.expanduser("~"), ".hb.yaml") if os.path.exists(path): if yaml: with open(path) as fh: data = yaml.safe_load(fh) # only keep known keys for k, v in data.items(): if k in cfg: cfg[k] = v else: logging.warning("unknown config key %s in %s", k, path) else: # yaml not installed: do not attempt to parse; user must ensure defaults pass return cfg