aboutsummaryrefslogtreecommitdiff
path: root/rpkid/portal-gui/scripts/rpkigui-check-expired.py
blob: 8f7740b7fbd976d756049dd9194edce7241ae5ff (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# Copyright (C) 2012  SPARTA, Inc. a Parsons Company
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND SPARTA DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS.  IN NO EVENT SHALL SPARTA BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
# Generate a report of all RPKI certs which are about to expire

__version__ = '$Id$'

from rpki.gui.cacheview.models import Cert
from rpki.gui.cacheview.views import cert_chain
from rpki.gui.app.models import ResourceCert, Conf

import datetime
import sys
from optparse import OptionParser

# check for certs expiring in this many days or less
expire_days = 14

now = datetime.datetime.utcnow()
expire_time = now + datetime.timedelta(expire_days)

Verbose = False


def check_bscs(conf, x):
    for p in x:
        t = p.certificate.getNotAfter()
        if Verbose or t <= expire_time:
            e = 'expired' if t <= now else 'will expire'
            print "%s's BSC %s on %s" % (conf.handle, e, t)


def check_cross_cert_expired(conf, x):
    for p in x:
        t = p.ta.getNotAfter()
        if Verbose or t <= expire_time:
            e = 'expired' if t <= now else 'will expire'
            print "%s's TA for %s %s %s on %s" % (conf.handle, p.__class__.__name__, p.handle, e, t)
        t = p.certificate.getNotAfter()
        if Verbose or t <= expire_time:
            e = 'expired' if t <= now else 'will expire'
            print "%s's cross cert for %s %s %s on %s" % (conf.handle, p.__class__.__name__, p.handle, e, t)


def check_expire(handle):
    # get certs for `handle'
    cert_set = ResourceCert.objects.filter(parent__issuer=handle)
    for cert in cert_set:
        # look up cert in cacheview db
        obj_set = Cert.objects.filter(repo__uri=cert.uri)
        if not obj_set:
            # since the <list_received_resources/> output is cached, this can
            # occur if the cache is out of date as well..
            print "Unable to locate rescert in rcynic cache: handle=%s uri=%s not_after=%s" % (handle.handle, cert.uri, cert.not_after)
            continue
        obj = obj_set[0]
        cert_list = cert_chain(obj)
        msg = []
        expired = False
        for n, c in cert_list:
            if c.not_after <= expire_time:
                expired = True
                f = '*'
            else:
                f = ' '
            msg.append("%s  [%d] uri=%s ski=%s name=%s expires=%s" % (f, n, c.repo.uri, c.keyid, c.name, c.not_after))
        if expired or Verbose:
            print "%s's rescert from parent %s will expire soon:\n" % (handle.handle, cert.parent.handle)
            print "Certificate chain:"
            print "\n".join(msg)


parser = OptionParser()
parser.add_option('-v', '--verbose', help='enable verbose output',
                    action='store_true', dest='verbose',
                    default=False)
parser.add_option('-V', '--version', help='display script version',
                    action='store_true', dest='version', default=False)
(options, args) = parser.parse_args()
if options.version:
    print __version__
    sys.exit(0)
Verbose = options.verbose

# check expiration of certs for all handles managed by the web portal
for h in Conf.objects.all():
    check_bscs(h, h.bscs.all())
    check_cross_cert_expired(h, h.parents.all())
    check_cross_cert_expired(h, h.children.all())
    check_cross_cert_expired(h, h.repositories.all())
    check_expire(h)

sys.exit(0)