dn42.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import os
  2. from netaddr import IPNetwork, IPSet
  3. # WARNING: deprecated lib, see 'registry.py' instead.
  4. ROOT_PREFIX = "172.22.0.0/15"
  5. ADDRSPACE = IPSet([ROOT_PREFIX])
  6. class Prefix(object):
  7. prefix = None
  8. display = "none"
  9. def __init__(self, prefix):
  10. self.prefix = IPNetwork(prefix)
  11. def __str__(self):
  12. return str(self.prefix)
  13. def to_dict(self):
  14. d = dict()
  15. d["name"] = d["prefix"] = str(self.prefix)
  16. d["size"] = self.prefix.size
  17. if self.display:
  18. d["display"] = self.display
  19. return d
  20. class UsedPrefix(Prefix):
  21. properties = dict()
  22. reserved_properties = {"name", "prefix", "size", "display"}
  23. def __init__(self, prefix, properties):
  24. self.properties = properties
  25. self.check_properties()
  26. super(UsedPrefix, self).__init__(prefix)
  27. self.display = None
  28. def check_properties(self):
  29. if self.reserved_properties.intersection(self.properties.keys()):
  30. raise ValueError
  31. def to_dict(self):
  32. d = super(UsedPrefix, self).to_dict()
  33. d.update(self.properties)
  34. return d
  35. def parse_record(stream):
  36. """General parsing of the "key: value" syntax. Returns a key → [values]
  37. dictionary.
  38. """
  39. d = dict()
  40. for entry in stream.readlines():
  41. try:
  42. key, value = [s.strip() for s in entry.split(':', 1)]
  43. if not key in d:
  44. d[key] = list()
  45. d[key].append(value)
  46. except ValueError: pass
  47. return d
  48. def parse_records(records_dir, fix_underscore=True):
  49. """Takes a directory containing records, and builds a dictionary mapping the
  50. filename of each record to its parsed data. By default, we transform '_'
  51. to '/' in the name of the records.
  52. """
  53. records = dict()
  54. for record in os.listdir(records_dir):
  55. record_path = os.path.join(records_dir, record)
  56. record_key = record.replace('_', '/') if fix_underscore else record
  57. with open(record_path, "r") as f:
  58. records[record_key] = parse_record(f)
  59. return records