# Derived from netcontext.py # # This file is part of SETools. # # SETools is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation, either version 2.1 of # the License, or (at your option) any later version. # # SETools is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with SETools. If not, see # <http://www.gnu.org/licenses/>. # from collections import namedtuple from . import qpol from . import symbol from . import context addr_range = namedtuple("memory_range", ["low", "high"]) port_range = namedtuple("port_range", ["low", "high"]) def iomemcon_factory(policy, name): """Factory function for creating iomemcon objects.""" if not isinstance(name, qpol.qpol_iomemcon_t): raise NotImplementedError return Iomemcon(policy, name) def ioportcon_factory(policy, name): """Factory function for creating ioportcon objects.""" if not isinstance(name, qpol.qpol_ioportcon_t): raise NotImplementedError return Ioportcon(policy, name) def pirqcon_factory(policy, name): """Factory function for creating pirqcon objects.""" if not isinstance(name, qpol.qpol_pirqcon_t): raise NotImplementedError return Pirqcon(policy, name) def pcidevicecon_factory(policy, name): """Factory function for creating pcidevicecon objects.""" if not isinstance(name, qpol.qpol_pcidevicecon_t): raise NotImplementedError return Pcidevicecon(policy, name) def devicetreecon_factory(policy, name): """Factory function for creating devicetreecon objects.""" if not isinstance(name, qpol.qpol_devicetreecon_t): raise NotImplementedError return Devicetreecon(policy, name) class XenContext(symbol.PolicySymbol): """Base class for in-policy xen labeling rules.""" def __str__(self): raise NotImplementedError @property def context(self): """The context for this statement.""" return context.context_factory(self.policy, self.qpol_symbol.context(self.policy)) def statement(self): return str(self) class Iomemcon(XenContext): """A iomemcon statement.""" def __str__(self): low, high = self.addr if low == high: return "iomemcon {0} {1}".format(low, self.context) else: return "iomemcon {0}-{1} {2}".format(low, high, self.context) @property def addr(self): """ The memory range for this iomemcon. Return: Tuple(low, high) low The low memory of the range. high The high memory of the range. """ low = self.qpol_symbol.low_addr(self.policy) high = self.qpol_symbol.high_addr(self.policy) return addr_range(low, high) class Ioportcon(XenContext): """A ioportcon statement.""" def __str__(self): low, high = self.ports if low == high: return "ioportcon {0} {1}".format(low, self.context) else: return "ioportcon {0}-{1} {2}".format(low, high, self.context) @property def ports(self): """ The port range for this ioportcon. Return: Tuple(low, high) low The low port of the range. high The high port of the range. """ low = self.qpol_symbol.low_port(self.policy) high = self.qpol_symbol.high_port(self.policy) return port_range(low, high) class Pcidevicecon(XenContext): """A pcidevicecon statement.""" def __str__(self): return "pcidevicecon {0.device} {0.context}".format(self) @property def device(self): """ The device for this pcidevicecon. Return: The PCI device ID. """ return self.qpol_symbol.device(self.policy) class Pirqcon(XenContext): """A pirqcon statement.""" def __str__(self): return "pirqcon {0.irq} {0.context}".format(self) @property def irq(self): """ The irq for this pirqcon. Return: The irq. """ return self.qpol_symbol.irq(self.policy) class Devicetreecon(XenContext): """A devicetreecon statement.""" def __str__(self): return "devicetreecon {0.path} {0.context}".format(self) @property def path(self): """ The path for this devicetreecon. Return: The device path name. """ return self.qpol_symbol.path(self.policy)