#!/usr/bin/python3

import argparse
import logging.handlers
import logging
import sys
import ssl

from grove import config as grove_config
from grove import dirs as grove_dirs
from grove import services as grove_services
from grove import util

# create root logger
logger = logging.getLogger()
logger.setLevel(logging.INFO)

# create stream handler to log to STDOUT
stream_handler = logging.StreamHandler()

# create logging formatter
formatter = logging.Formatter("%(asctime)s %(name)-12s %(levelname)-8s %(message)s")
stream_handler.setFormatter(formatter)

# add stream handler to logger
logger.addHandler(stream_handler)

def main(args):
  config = grove_config.load_config()
  homedir = config["homedir"]
  svstagedir = grove_dirs.svstagedir(homedir)
  svdir = config["svdir"]

  # configure self signed SSL cert
  ssl_cert = config.get("server_ca_cert")

  ssl_context = None
  if ssl_cert is not None:
    ssl_context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH)
    ssl_context.load_verify_locations(ssl_cert)

  healthy = util.asyncio_run(
    grove_services.health(svstagedir, svdir, args.services, ssl_context)
  )

  if healthy is False:
    sys.exit(1)

if __name__ == "__main__":
  parser = argparse.ArgumentParser(description='Probe service health')
  parser.add_argument(
    'services',
    type=str,
    action="append",
    help='managed service name'
  )
  parser.add_argument(
    '--syslog',
    action="store_true",
    default=False,
    help='enable logging to syslog at localhost UDP port 514'
  )
  parser.add_argument(
    '--debug',
    action="store_true",
    default=False,
    help='enable debug logging'
  )
  args = parser.parse_args()

  if args.syslog is True:
    syslog_handler = logging.handlers.SysLogHandler(
      address=("127.0.0.1", logging.handlers.SYSLOG_UDP_PORT)
    )

    # set syslog identifier to match runit services
    syslog_handler.ident = "[grove-health] "

    logger.addHandler(syslog_handler)

  if args.debug is True:
    logger.setLevel(logging.DEBUG)

  main(args)
