Module jumpscale.install.certbot.certbot_cronjob

Certbot Custom Cronjob This script used as custom certbot cronjob - Make sure that the certificates for all domains are managed be certbot. - Renew certificates.

Cronjob Flow: 1. If domain has a no/pre-fetched certificate "Not managed by certbot" –> Obtain and install a new certificate 2. If domain has a managed certificate "Managed by certbot" –> continue for other domains 3. Renew all managed certificate if needed (Renewal will only occur if expiration is within 30 days)

Expand source code
"""Certbot Custom Cronjob
This script used as custom certbot cronjob
- Make sure that the certificates for all domains are managed be certbot.
- Renew certificates.

Cronjob Flow:
1. If domain has a no/pre-fetched certificate "Not managed by certbot"  --> Obtain and install a new certificate
2. If domain has a managed certificate "Managed by certbot"             --> continue for other domains
3. Renew all managed certificate if needed (Renewal will only occur if expiration is within 30 days)
"""

from jumpscale.loader import j


def check_managed_certificate(certbot):
    """Check if the certificate managed by certbot or not

    Args:
        certbot (Certbot): certbot object that contains website configurations

    Returns:
        bool: True if managed by certbot, False otherwise
    """
    cmd = certbot.run_cmd
    cmd.insert(1, "certificates")

    rc, out, err = j.sals.process.execute(cmd)

    if rc > 0:
        j.logger.error(f"Check certificate failed {out}\n{err}")
        return False
    elif out.count("No certificates found") > 0:
        j.logger.info(f"No certificate managed by certbot for {certbot.domain}")
        return False

    j.logger.info(f"Certificate managed by certbot for {certbot.domain}")
    return True


def main():
    j.logger.info("Start Certbot Cronjob")
    threebot_server = j.servers.threebot.get("default")
    renew_command = []
    for p in threebot_server.packages.list_all():
        package = threebot_server.packages.get(p)
        package.nginx_config.nginx.cert = False  # To disable generate a certificate
        package.nginx_config.apply(write_config=False)
        j.logger.debug(f"Check Package:{p}")
        for w in package.nginx_config.nginx.websites.list_all():
            website = package.nginx_config.nginx.websites.get(w)
            if website.domain:
                certbot = website.certbot
                if check_managed_certificate(certbot):
                    # Certificate managed by certbot, Execute renew after check all certificates
                    if not renew_command:  # We need to run it one time to get renew command
                        renew_command = certbot.renew_cmd
                    continue
                else:
                    # Certifcate not managed by certbot, Run certbot to get a new one
                    j.logger.info("New certificate will created to be managed by certbot")
                    website.obtain_and_install_certifcate()

    j.logger.info("Excute certbot renew to renew all the managed certificates")
    j.logger.info(f"{' '.join(renew_command)}")
    rc, out, err = j.sals.process.execute(renew_command)

    if rc > 0:
        j.logger.error(f"Renew certificates failed {out}\n{err}")
    else:
        j.logger.info(f"Certificates Renewed\n{out}")


if __name__ == "__main__":
    main()

Functions

def check_managed_certificate(certbot)

Check if the certificate managed by certbot or not

Args

certbot : Certbot
certbot object that contains website configurations

Returns

bool
True if managed by certbot, False otherwise
Expand source code
def check_managed_certificate(certbot):
    """Check if the certificate managed by certbot or not

    Args:
        certbot (Certbot): certbot object that contains website configurations

    Returns:
        bool: True if managed by certbot, False otherwise
    """
    cmd = certbot.run_cmd
    cmd.insert(1, "certificates")

    rc, out, err = j.sals.process.execute(cmd)

    if rc > 0:
        j.logger.error(f"Check certificate failed {out}\n{err}")
        return False
    elif out.count("No certificates found") > 0:
        j.logger.info(f"No certificate managed by certbot for {certbot.domain}")
        return False

    j.logger.info(f"Certificate managed by certbot for {certbot.domain}")
    return True
def main()
Expand source code
def main():
    j.logger.info("Start Certbot Cronjob")
    threebot_server = j.servers.threebot.get("default")
    renew_command = []
    for p in threebot_server.packages.list_all():
        package = threebot_server.packages.get(p)
        package.nginx_config.nginx.cert = False  # To disable generate a certificate
        package.nginx_config.apply(write_config=False)
        j.logger.debug(f"Check Package:{p}")
        for w in package.nginx_config.nginx.websites.list_all():
            website = package.nginx_config.nginx.websites.get(w)
            if website.domain:
                certbot = website.certbot
                if check_managed_certificate(certbot):
                    # Certificate managed by certbot, Execute renew after check all certificates
                    if not renew_command:  # We need to run it one time to get renew command
                        renew_command = certbot.renew_cmd
                    continue
                else:
                    # Certifcate not managed by certbot, Run certbot to get a new one
                    j.logger.info("New certificate will created to be managed by certbot")
                    website.obtain_and_install_certifcate()

    j.logger.info("Excute certbot renew to renew all the managed certificates")
    j.logger.info(f"{' '.join(renew_command)}")
    rc, out, err = j.sals.process.execute(renew_command)

    if rc > 0:
        j.logger.error(f"Renew certificates failed {out}\n{err}")
    else:
        j.logger.info(f"Certificates Renewed\n{out}")