diff options
Diffstat (limited to 'bin/python/isc/keydict.py.in')
-rw-r--r-- | bin/python/isc/keydict.py.in | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/bin/python/isc/keydict.py.in b/bin/python/isc/keydict.py.in new file mode 100644 index 0000000..723a32a --- /dev/null +++ b/bin/python/isc/keydict.py.in @@ -0,0 +1,87 @@ +# Copyright (C) Internet Systems Consortium, Inc. ("ISC") +# +# SPDX-License-Identifier: MPL-2.0 +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, you can obtain one at https://mozilla.org/MPL/2.0/. +# +# See the COPYRIGHT file distributed with this work for additional +# information regarding copyright ownership. + +from collections import defaultdict +from . import dnskey +import os +import glob + + +######################################################################## +# Class keydict +######################################################################## +class keydict: + """A dictionary of keys, indexed by name, algorithm, and key id""" + + _keydict = defaultdict(lambda: defaultdict(dict)) + _defttl = None + _missing = [] + + def __init__(self, dp=None, **kwargs): + self._defttl = kwargs.get("keyttl", None) + zones = kwargs.get("zones", None) + + if not zones: + path = kwargs.get("path", None) or "." + self.readall(path) + else: + for zone in zones: + if "path" in kwargs and kwargs["path"] is not None: + path = kwargs["path"] + else: + path = dp and dp.policy(zone).directory or "." + if not self.readone(path, zone): + self._missing.append(zone) + + def readall(self, path): + files = glob.glob(os.path.join(path, "*.private")) + + for infile in files: + key = dnskey(infile, path, self._defttl) + self._keydict[key.name][key.alg][key.keyid] = key + + def readone(self, path, zone): + if not zone.endswith("."): + zone += "." + match = "K" + zone + "+*.private" + files = glob.glob(os.path.join(path, match)) + + found = False + for infile in files: + key = dnskey(infile, path, self._defttl) + if key.fullname != zone: # shouldn't ever happen + continue + keyname = key.name if zone != "." else "." + self._keydict[keyname][key.alg][key.keyid] = key + found = True + + return found + + def __iter__(self): + for zone, algorithms in self._keydict.items(): + for alg, keys in algorithms.items(): + for key in keys.values(): + yield key + + def __getitem__(self, name): + return self._keydict[name] + + def zones(self): + return self._keydict.keys() + + def algorithms(self, zone): + return self._keydict[zone].keys() + + def keys(self, zone, alg): + return self._keydict[zone][alg].keys() + + def missing(self): + return self._missing |