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
 | 
			
		||||
 | 
			
		||||
import argparse
 | 
			
		||||
from io import TextIOWrapper
 | 
			
		||||
import logging
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
 | 
			
		||||
from sarge import run, shell_format, capture_both
 | 
			
		||||
from systemd.journal import JournalHandler
 | 
			
		||||
| 
						 | 
				
			
			@ -41,27 +43,100 @@ def parse_domain_list(domainfile):
 | 
			
		|||
    return domains
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def renew_domains(letsencrypt_path, domains):
 | 
			
		||||
def renew_domains(letsencrypt_path, domains, dry_run=False):
 | 
			
		||||
 | 
			
		||||
    domains = " ".join(domains)
 | 
			
		||||
    command = " ".join([letsencrypt_path, "certonly", domains])
 | 
			
		||||
 | 
			
		||||
    logger.info("Renewing domain certificates...")
 | 
			
		||||
    process = capture_both(command)
 | 
			
		||||
 | 
			
		||||
    for stdout in TextIOWrapper(process.stdout):
 | 
			
		||||
        logger.info(stdin)
 | 
			
		||||
    if not dry_run:
 | 
			
		||||
 | 
			
		||||
    for stderr in TextIOWrapper(process.stderr):
 | 
			
		||||
        logger.info(stderr)
 | 
			
		||||
        process = capture_both(command)
 | 
			
		||||
 | 
			
		||||
    if process.returncode != 0:
 | 
			
		||||
        logger.error("Let's Encrypt domain renewal failed.")
 | 
			
		||||
        return
 | 
			
		||||
        for stdout in TextIOWrapper(process.stdout):
 | 
			
		||||
            logger.info(stdin)
 | 
			
		||||
 | 
			
		||||
        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:
 | 
			
		||||
        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
		Add a link
		
	
		Reference in a new issue