dns.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. from typing import TYPE_CHECKING
  2. if TYPE_CHECKING:
  3. from render import Render
  4. try:
  5. from .error import RenderError
  6. from .validations import allowed_dns_opt_or_raise
  7. except ImportError:
  8. from error import RenderError
  9. from validations import allowed_dns_opt_or_raise
  10. class Dns:
  11. def __init__(self, render_instance: "Render"):
  12. self._render_instance = render_instance
  13. self._dns_options: set[str] = set()
  14. self._dns_searches: set[str] = set()
  15. self._dns_nameservers: set[str] = set()
  16. self._auto_add_dns_opts_from_values()
  17. self._auto_add_dns_searches_from_values()
  18. self._auto_add_dns_nameservers_from_values()
  19. def _get_dns_opt_keys(self):
  20. return [self._get_key_from_opt(opt) for opt in self._dns_options]
  21. def _get_key_from_opt(self, opt):
  22. return opt.split(":")[0]
  23. def _auto_add_dns_opts_from_values(self):
  24. values = self._render_instance.values
  25. for dns_opt in values.get("network", {}).get("dns_opts", []):
  26. self.add_dns_opt(dns_opt)
  27. def _auto_add_dns_searches_from_values(self):
  28. values = self._render_instance.values
  29. for dns_search in values.get("network", {}).get("dns_searches", []):
  30. self.add_dns_search(dns_search)
  31. def _auto_add_dns_nameservers_from_values(self):
  32. values = self._render_instance.values
  33. for dns_nameserver in values.get("network", {}).get("dns_nameservers", []):
  34. self.add_dns_nameserver(dns_nameserver)
  35. def add_dns_search(self, dns_search):
  36. if dns_search in self._dns_searches:
  37. raise RenderError(f"DNS Search [{dns_search}] already added")
  38. self._dns_searches.add(dns_search)
  39. def add_dns_nameserver(self, dns_nameserver):
  40. if dns_nameserver in self._dns_nameservers:
  41. raise RenderError(f"DNS Nameserver [{dns_nameserver}] already added")
  42. self._dns_nameservers.add(dns_nameserver)
  43. def add_dns_opt(self, dns_opt):
  44. # eg attempts:3
  45. key = allowed_dns_opt_or_raise(self._get_key_from_opt(dns_opt))
  46. if key in self._get_dns_opt_keys():
  47. raise RenderError(f"DNS Option [{key}] already added")
  48. self._dns_options.add(dns_opt)
  49. def has_dns_opts(self):
  50. return len(self._dns_options) > 0
  51. def has_dns_searches(self):
  52. return len(self._dns_searches) > 0
  53. def has_dns_nameservers(self):
  54. return len(self._dns_nameservers) > 0
  55. def render_dns_searches(self):
  56. return sorted(self._dns_searches)
  57. def render_dns_opts(self):
  58. return sorted(self._dns_options)
  59. def render_dns_nameservers(self):
  60. return sorted(self._dns_nameservers)