Source code for insights.parsers.certificates_enddate

"""
CertificatesEnddate - command ``/usr/bin/openssl x509 -noout -enddate -in path/to/cert/file``
=============================================================================================

This command gets the enddate of the certificate files.

Sample Output::

    /usr/bin/find: '/etc/origin/node': No such file or directory
    /usr/bin/find: '/etc/origin/master': No such file or directory
    notAfter=May 25 16:39:40 2019 GMT
    FileName= /etc/origin/node/cert.pem
    unable to load certificate
    139881193203616:error:0906D066:PEM routines:PEM_read_bio:bad end line:pem_lib.c:802:
    unable to load certificate
    140695459370912:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:703:Expecting: TRUSTED CERTIFICATE
    notAfter=May 25 16:39:40 2019 GMT
    FileName= /etc/pki/ca-trust/extracted/pem/email-ca-bundle.pem
    notAfter=Dec  9 10:55:38 2017 GMT
    FileName= /etc/pki/consumer/cert.pem
    notAfter=Jan  1 04:59:59 2022 GMT
    FileName= /etc/pki/entitlement/3343502840335059594.pem
    notAfter=Aug 31 02:19:59 2017 GMT
    FileName= /etc/pki/consumer/cert.pem
    notAfter=Jan  1 04:59:59 2022 GMT
    FileName= /etc/pki/entitlement/2387590574974617178.pem

Examples:
    >>> type(cert_enddate)
    <class 'insights.parsers.certificates_enddate.CertificatesEnddate'>
    >>> paths = cert_enddate.certificates_path
    >>> '/etc/origin/node/cert.pem' in paths
    True
    >>> cert_enddate.expiration_date('/etc/origin/node/cert.pem').datetime
    datetime.datetime(2019, 5, 25, 16, 39, 40)
    >>> cert_enddate.expiration_date('/etc/origin/node/cert.pem').str
    'May 25 16:39:40 2019'
"""
from collections import namedtuple
from datetime import datetime

from insights.core import CommandParser
from insights.core.exceptions import SkipComponent
from insights.core.plugins import parser
from insights.specs import Specs


[docs] @parser(Specs.certificates_enddate) class CertificatesEnddate(CommandParser, dict): """Class to parse the expiration date.""" ExpirationDate = namedtuple('ExpirationDate', ['str', 'datetime']) """namedtuple: contains the expiration date in string and datetime format."""
[docs] def parse_content(self, content): """Parse the content of crt files.""" datestamp = None for l in content: if datestamp and l.startswith("FileName="): self[l.split("=")[-1].strip()] = datestamp datestamp = None elif l.startswith("notAfter="): datestamp = l.split("=")[-1].rsplit(" ", 1)[0] else: datestamp = None if not self: raise SkipComponent("No certification files found.")
@property def data(self): """ Set data as property to keep compatibility """ return self @property def certificates_path(self): """list: Return filepaths in list or [].""" return self.data.keys() if self.data else []
[docs] def expiration_date(self, path): """This will return a namedtuple(['str', 'datetime']) contains the expiration date in string and datetime format. If the expiration date is unparsable, the ExpirationDate.datetime should be None. Args: path(str): The certificate file path. Returns: A ExpirationDate for available path. None otherwise. """ path_date = self.data.get(path) if path_date: try: path_datetime = datetime.strptime(path_date, '%b %d %H:%M:%S %Y') return self.ExpirationDate(path_date, path_datetime) except Exception: return self.ExpirationDate(path_date, None)