# Quality agent
#
###############################################################################
-# Export variables for the quality agent
-export QUALITY_AGENT_PERMIT_NOT_FULL_RELRO
-export QUALITY_AGENT_RPATH_ALLOW_ORIGIN
-export QUALITY_AGENT_WHITELIST_EXECSTACK
-export QUALITY_AGENT_WHITELIST_NX
-export QUALITY_AGENT_WHITELIST_RPATH
-export QUALITY_AGENT_WHITELIST_SONAME
-export QUALITY_AGENT_WHITELIST_SYMLINK
-export QUALITY_AGENT_NO_DIRECTORY_CHECK
-export QUALITY_AGENT_NO_DIRECTORY_PRUNE
+# Macro to define and start the quality agent.
+# Long term goal is to improve the commited code.
+MACRO_QUALITY_AGENT = /usr/lib/pakfire/quality-agent
+
+# XXX to be moved to some place else
+#export QUALITY_AGENT_NO_DIRECTORY_CHECK
+#export QUALITY_AGENT_NO_DIRECTORY_PRUNE
LEXER_PACKAGE2_LINE = LEXER_BLOCK_LINE
LEXER_PACKAGE2_END = LEXER_BLOCK_END
+LEXER_QUALITY_AGENT_BEGIN = re.compile(r"^quality-agent$")
+LEXER_QUALITY_AGENT_LINE = LEXER_BLOCK_LINE
+LEXER_QUALITY_AGENT_END = LEXER_BLOCK_END
+
# Statements:
LEXER_EXPORT = re.compile(r"^export\s+([A-Za-z0-9_\-]+)\s*(\+)?=\s*(.+)?$")
LEXER_EXPORT2 = re.compile(r"^export\s+([A-Za-z0-9_\-]+)$")
pass
+class QualityAgentLexer(DefaultLexer):
+ """
+ A lexer to read quality agent exceptions.
+ """
+ @property
+ def exports(self):
+ exports = {}
+
+ # Check if we permit full relro.
+ if self.get_var("permit_not_full_relro"):
+ exports["QUALITY_AGENT_PERMIT_NOT_FULL_RELRO"] = \
+ self.get_var("permit_not_full_relro")
+
+ # Check if we permit $ORIGIN in rpath.
+ if self.get_var("rpath_allow_origin"):
+ exports["QUALITY_AGENT_RPATH_ALLOW_ORIGIN"] = \
+ self.get_var("rpath_allow_origin")
+
+ # Load execstack whitelist.
+ if self.get_var("whitelist_execstack"):
+ exports["QUALITY_AGENT_WHITELIST_EXECSTACK"] = \
+ self.get_var("whitelist_execstack")
+
+ # Load nx whitelist.
+ if self.get_var("whitelist_nx"):
+ exports["QUALITY_AGENT_WHITELIST_NX"] = \
+ self.get_var("whitelist_nx")
+
+ # Load rpath whitelist.
+ if self.get_var("whitelist_rpath"):
+ exports["QUALITY_AGENT_WHITELIST_RPATH"] = \
+ self.get_var("whitelist_rpath")
+
+ # Load symlink whitelist
+ if self.get_var("whitelist_symlink"):
+ exports["QUALITY_AGENT_WHITELIST_SYMLINK"] = \
+ self.get_var("whitelist_symlink")
+
+ return exports
+
+
class TemplateLexer(DefaultLexer):
def init(self, environ):
# A place to store the scriptlets.
# Place for build instructions
self.build = BuildLexer([], parent=self)
+ # Place for quality-agent exceptions
+ self.quality_agent = QualityAgentLexer([], parent=self)
+
# Include all macros.
if not self.parent:
for macro in MACRO_FILES:
self.build.inherit(other.build)
self.packages.inherit(other.packages)
+ self.quality_agent.inherit(other.quality_agent)
@property
def templates(self):
(LEXER_INCLUDE, self.parse_include),
(LEXER_PACKAGES_BEGIN, self.parse_packages),
(LEXER_BUILD_BEGIN, self.parse_build),
+ (LEXER_QUALITY_AGENT_BEGIN, self.parse_quality_agent),
]
return parsers
pkgs = PackagesLexer(lines, parent=self)
self.packages.inherit(pkgs)
+ def parse_quality_agent(self):
+ keys, lines = self.read_block(
+ pattern_start=LEXER_QUALITY_AGENT_BEGIN,
+ pattern_line=LEXER_QUALITY_AGENT_LINE,
+ pattern_end=LEXER_QUALITY_AGENT_END,
+ raw = True,
+ )
+
+ qa = QualityAgentLexer(lines, parent=self)
+ self.quality_agent.inherit(qa)
+
class PackagesLexer(DefaultLexer):
def init(self, environ):