main.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. # SPDX-FileCopyrightText: 2016-2023 Helmut Pozimski <helmut@pozimski.eu>
  2. #
  3. # SPDX-License-Identifier: GPL-2.0-only
  4. # -*- coding: utf8 -*-
  5. """ Main function of acme-updater, parses command line arguments, sets up
  6. logging and executes the modules.
  7. """
  8. import argparse
  9. import logging
  10. import json
  11. import sys
  12. from amulib.cert_path_provider import AcmeToolCertPathProvider
  13. from amulib.helpers import get_log_level
  14. from amulib import apache
  15. from amulib import postfix
  16. from amulib import dovecot
  17. from amulib import ejabberd
  18. def main():
  19. """
  20. Main function of acme-updater.
  21. """
  22. config = None
  23. cert_path_provider = None
  24. parser = argparse.ArgumentParser()
  25. parser.add_argument("--apache", help="use the apache module",
  26. action="store_true")
  27. parser.add_argument("--postfix", help="use the postfix module",
  28. action="store_true")
  29. parser.add_argument("--dovecot", help="use the dovecot module",
  30. action="store_true")
  31. parser.add_argument("--ejabberd", help="use the ejabberd module",
  32. action="store_true")
  33. parser.add_argument("--verbose", "-V", help="be verbose, enables debug "
  34. "output",
  35. action="store_true")
  36. parser.add_argument("--config", "-C", help="path to the configuration "
  37. "file", type=str)
  38. args = parser.parse_args()
  39. logger = logging.getLogger("acme-updater")
  40. logger.addHandler(logging.StreamHandler())
  41. config = read_config(args, config, logger)
  42. set_log_level(args, config, logger)
  43. cert_path_provider = create_cert_path_provider(cert_path_provider, config, logger)
  44. execute_services(args, cert_path_provider, config)
  45. def read_config(args, config, logger):
  46. if args.config:
  47. try:
  48. with open(args.config, "r") as fobj:
  49. config = json.load(fobj)
  50. except IOError:
  51. logger.error("Error: Could not open configuration file")
  52. sys.exit(1)
  53. except json.JSONDecodeError:
  54. logger.error("Error: Could not parse configuration file")
  55. sys.exit(1)
  56. else:
  57. logger.error("A configuration file has to be provided with --config")
  58. sys.exit(1)
  59. return config
  60. def set_log_level(args, config, logger):
  61. if args.verbose:
  62. logger.setLevel(logging.DEBUG)
  63. elif config:
  64. logger.setLevel(get_log_level(config["loglevel"]))
  65. else:
  66. logger.setLevel(logging.INFO)
  67. def create_cert_path_provider(cert_path_provider, config, logger):
  68. if "acme_tool" in config and config["acme_tool"] == "acmetool":
  69. cert_path_provider = AcmeToolCertPathProvider(config["acme_dir"])
  70. else:
  71. logger.error("Invalid acme tooling specified")
  72. sys.exit(1)
  73. return cert_path_provider
  74. def execute_services(args, cert_path_provider, config):
  75. if args.apache:
  76. if config:
  77. apache.run(cert_path_provider, config["apache"],
  78. config["named_key_path"], config["dns_server"])
  79. else:
  80. apache.run(cert_path_provider)
  81. if args.postfix:
  82. if config:
  83. postfix.run(config["postfix"], config["acme_dir"],
  84. config["named_key_path"], config["dns_server"])
  85. else:
  86. postfix.run(cert_path_provider)
  87. if args.dovecot:
  88. if config:
  89. dovecot.run(config["dovecot"], config["acme_dir"],
  90. config["named_key_path"], config["dns_server"])
  91. else:
  92. dovecot.run(cert_path_provider)
  93. if args.ejabberd:
  94. if config:
  95. ejabberd.run(config["ejabberd"], config["acme_dir"],
  96. config["dns_server"])
  97. else:
  98. ejabberd.run(cert_path_provider)