Complete version of letsencrypt_renew.py
This commit is contained in:
parent
f5d10eff7d
commit
49062a23a1
1 changed files with 85 additions and 10 deletions
|
@ -1,7 +1,9 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import argparse
|
||||||
from io import TextIOWrapper
|
from io import TextIOWrapper
|
||||||
import logging
|
import logging
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
from sarge import run, shell_format, capture_both
|
from sarge import run, shell_format, capture_both
|
||||||
from systemd.journal import JournalHandler
|
from systemd.journal import JournalHandler
|
||||||
|
@ -41,27 +43,100 @@ def parse_domain_list(domainfile):
|
||||||
return domains
|
return domains
|
||||||
|
|
||||||
|
|
||||||
def renew_domains(letsencrypt_path, domains):
|
def renew_domains(letsencrypt_path, domains, dry_run=False):
|
||||||
|
|
||||||
domains = " ".join(domains)
|
domains = " ".join(domains)
|
||||||
command = " ".join([letsencrypt_path, "certonly", domains])
|
command = " ".join([letsencrypt_path, "certonly", domains])
|
||||||
|
|
||||||
logger.info("Renewing domain certificates...")
|
logger.info("Renewing domain certificates...")
|
||||||
process = capture_both(command)
|
|
||||||
|
|
||||||
for stdout in TextIOWrapper(process.stdout):
|
if not dry_run:
|
||||||
logger.info(stdin)
|
|
||||||
|
|
||||||
for stderr in TextIOWrapper(process.stderr):
|
process = capture_both(command)
|
||||||
logger.info(stderr)
|
|
||||||
|
|
||||||
if process.returncode != 0:
|
for stdout in TextIOWrapper(process.stdout):
|
||||||
logger.error("Let's Encrypt domain renewal failed.")
|
logger.info(stdin)
|
||||||
return
|
|
||||||
|
for stderr in TextIOWrapper(process.stderr):
|
||||||
|
logger.info(stderr)
|
||||||
|
|
||||||
|
if process.returncode != 0:
|
||||||
|
logger.error("Let's Encrypt domain renewal failed.")
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
logger.info("Domain renewal succeeded.")
|
||||||
|
|
||||||
|
restart_services()
|
||||||
else:
|
else:
|
||||||
logger.info("Domain renewal succeeded.")
|
print("The following command will be performed:")
|
||||||
|
print(command)
|
||||||
|
|
||||||
|
|
||||||
|
def get_letsencrypt_path(configfile):
|
||||||
|
|
||||||
|
with open(configfile, "r") as handle:
|
||||||
|
|
||||||
|
for row in handle:
|
||||||
|
|
||||||
|
if not row.rstrip():
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Ignore everything after # (comment)
|
||||||
|
row = row.partition("#")[0]
|
||||||
|
row = row.rstrip()
|
||||||
|
|
||||||
|
if not row:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if row.startswith("LETSENCRYPT_COMMAND"):
|
||||||
|
break
|
||||||
|
|
||||||
|
command_path = row.split("=")[1]
|
||||||
|
|
||||||
|
if not Path(command_path).exists():
|
||||||
|
logger.error("No letsencrypt command found.")
|
||||||
|
return
|
||||||
|
|
||||||
|
return command_path
|
||||||
|
|
||||||
|
|
||||||
|
def restart_services():
|
||||||
|
|
||||||
|
logger.info("Restarting web server...")
|
||||||
|
run("/bin/systemctl restart nginx")
|
||||||
|
logger.info("Reloading mail server configuration...")
|
||||||
|
run("/bin/systemctl restart postfix")
|
||||||
|
logger.info("Services restarted.")
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument("-c", "--config-file",
|
||||||
|
default="/etc/sysconfig/letsencrypt/config",
|
||||||
|
help="Configuration file to use")
|
||||||
|
parser.add_argument("-d", "--domain-file";
|
||||||
|
default="/etc/sysconfig/letsencrypt/domains",
|
||||||
|
help="File including domains (one per line)")
|
||||||
|
parser.add_argument("--dry-run", action="store_true",
|
||||||
|
help="Just print out the command, don't do anything")
|
||||||
|
|
||||||
|
options = parser.parse_args()
|
||||||
|
|
||||||
|
letsencrypt_path = get_letsencrypt_path(options.config_file)
|
||||||
|
|
||||||
|
if letsencrypt_path is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
domains = parse_domain_list(options.domain_file)
|
||||||
|
|
||||||
|
if not domains:
|
||||||
|
return
|
||||||
|
|
||||||
|
renew_domains(letsencrypt_path, domains, dry_run=options.dry_run)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue