#!/usr/bin/env python3 import sys as _sys import os as _os import json as _json import pathlib as _pathlib import argparse as _argparse def file_read(path): handle = open(path, "r") content = handle.read() handle.close() return content def main(): ## args argument_parser = _argparse.ArgumentParser() argument_parser.add_argument( "-c", "--conf-path", type = str, dest = "conf_path", metavar = "", default = _os.path.join(str(_pathlib.Path.home()), ".tls-get-conf.json"), ) argument_parser.add_argument( dest = "domain", metavar = "", help = "the domain for which the TLS certificate shall be generated" ) argument_parser.add_argument( "-t", "--target-directory", dest = "target_directory", type = str, metavar = "", default = "/etc/ssl", ) argument_parser.add_argument( "-x", "--challenge-prefix", dest = "challenge_prefix", type = str, metavar = "", default = "_acme-challenge", help = "which subdomain to use for ACME challanges", ) argument_parser.add_argument( "-w", "--delay", dest = "delay", type = float, default = 60.0, metavar = "", help = "seconds to wait at end of certbot auth hook", ) argument_parser.add_argument( "-q", "--dry-run", dest = "dry_run", action = "store_true", default = False, help = "whether to only print the command on stdout instead of executing it", ) args = argument_parser.parse_args() ## vars conf = _json.loads(file_read(args.conf_path)) le_dir = "/etc/letsencrypt/live" ## exec command_certbot = " ".join( [ "certbot", "certonly", ("--email='%s'" % conf["acme_account"]["email"]), # ("--work-dir='%s'" % conf["misc"]["working_directory"]), "--preferred-challenges='dns'", "--non-interactive", "--agree-tos", ("--domain='%s'" % args.domain), "--manual", ( "--manual-auth-hook='%s'" % " ".join( [ "/usr/local/bin/inwx", ("--username=\"%s\"" % conf["inwx_account"]["username"]), ("--password=\"%s\"" % conf["inwx_account"]["password"]), "certbot-hook", ("--delay=%.4f" % args.delay), ] ) ), ( "--post-hook='%s'" % " ".join( [ "/usr/local/bin/inwx", ("--username=\"%s\"" % conf["inwx_account"]["username"]), ("--password=\"%s\"" % conf["inwx_account"]["password"]), "delete", ("--domain=\"%s\"" % (args.challenge_prefix + "." + args.domain)), ("--type=\"TXT\""), ] ) ), ] ) if (args.dry_run): _sys.stdout.write(command_certbot + "\n") else: _os.system(command_certbot) subjects = [ {"source_name": "privkey", "target_directory": "private"}, {"source_name": "cert", "target_directory": "certs"}, {"source_name": "chain", "target_directory": "chains"}, {"source_name": "fullchain", "target_directory": "fullchains"}, ] for subject in subjects: _os.system( "mkdir --parents %s && cp --dereference %s %s" % ( _os.path.join(args.target_directory, subject["target_directory"]), _os.path.join(le_dir, args.domain, "%s.pem" % subject["source_name"]), _os.path.join(args.target_directory, subject["target_directory"], "%s.pem" % args.domain), ) ) main()