device_cgroup_rules.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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 valid_device_cgroup_rule_or_raise
  7. except ImportError:
  8. from error import RenderError
  9. from validations import valid_device_cgroup_rule_or_raise
  10. class DeviceCGroupRule:
  11. def __init__(self, rule: str):
  12. rule = valid_device_cgroup_rule_or_raise(rule)
  13. parts = rule.split(" ")
  14. major, minor = parts[1].split(":")
  15. self._type = parts[0]
  16. self._major = major
  17. self._minor = minor
  18. self._permissions = parts[2]
  19. def get_key(self):
  20. return f"{self._type}_{self._major}_{self._minor}"
  21. def render(self):
  22. return f"{self._type} {self._major}:{self._minor} {self._permissions}"
  23. class DeviceCGroupRules:
  24. def __init__(self, render_instance: "Render"):
  25. self._render_instance = render_instance
  26. self._rules: set[DeviceCGroupRule] = set()
  27. self._track_rule_combos: set[str] = set()
  28. def add_rule(self, rule: str):
  29. dev_group_rule = DeviceCGroupRule(rule)
  30. if dev_group_rule in self._rules:
  31. raise RenderError(f"Device Group Rule [{rule}] already added")
  32. rule_key = dev_group_rule.get_key()
  33. if rule_key in self._track_rule_combos:
  34. raise RenderError(f"Device Group Rule [{rule}] has already been added for this device group")
  35. self._rules.add(dev_group_rule)
  36. self._track_rule_combos.add(rule_key)
  37. def has_rules(self):
  38. return len(self._rules) > 0
  39. def render(self):
  40. return sorted([rule.render() for rule in self._rules])