summaryrefslogtreecommitdiffstats
path: root/bin/python/isc/keydict.py.in
diff options
context:
space:
mode:
Diffstat (limited to 'bin/python/isc/keydict.py.in')
-rw-r--r--bin/python/isc/keydict.py.in87
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