1# Derived from portconquery.py
2#
3# This file is part of SETools.
4#
5# SETools is free software: you can redistribute it and/or modify
6# it under the terms of the GNU Lesser General Public License as
7# published by the Free Software Foundation, either version 2.1 of
8# the License, or (at your option) any later version.
9#
10# SETools is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13# GNU Lesser General Public License for more details.
14#
15# You should have received a copy of the GNU Lesser General Public
16# License along with SETools.  If not, see
17# <http://www.gnu.org/licenses/>.
18#
19import logging
20
21from .mixins import MatchContext
22from .query import PolicyQuery
23
24
25class DevicetreeconQuery(MatchContext, PolicyQuery):
26
27    """
28    Devicetreecon context query.
29
30    Parameter:
31    policy          The policy to query.
32
33    Keyword Parameters/Class attributes:
34    path             A single devicetree path.
35
36    user            The criteria to match the context's user.
37    user_regex      If true, regular expression matching
38                    will be used on the user.
39
40    role            The criteria to match the context's role.
41    role_regex      If true, regular expression matching
42                    will be used on the role.
43
44    type_           The criteria to match the context's type.
45    type_regex      If true, regular expression matching
46                    will be used on the type.
47
48    range_          The criteria to match the context's range.
49    range_subset    If true, the criteria will match if it is a subset
50                    of the context's range.
51    range_overlap   If true, the criteria will match if it overlaps
52                    any of the context's range.
53    range_superset  If true, the criteria will match if it is a superset
54                    of the context's range.
55    range_proper    If true, use proper superset/subset operations.
56                    No effect if not using set operations.
57    """
58
59    path = None
60
61    def __init__(self, policy, **kwargs):
62        super(DevicetreeconQuery, self).__init__(policy, **kwargs)
63        self.log = logging.getLogger(__name__)
64
65    def results(self):
66        """Generator which yields all matching devicetreecons."""
67        self.log.info("Generating results from {0.policy}".format(self))
68        self.log.debug("Path: {0.path!r}".format(self))
69        self._match_context_debug(self.log)
70
71        for devicetreecon in self.policy.devicetreecons():
72
73            if self.path and self.path != devicetreecon.path:
74                continue
75
76            if not self._match_context(devicetreecon.context):
77                continue
78
79            yield devicetreecon
80