Implements full path for hash checks of binaries
[releng-anteater.git] / anteater / src / get_lists.py
index 8941510..4eb1d3f 100644 (file)
     Gathers various values from the gate check yaml file and return them to the
     calling instance
 """
+from __future__ import absolute_import
 
-import anteater.utils.anteater_logger as antlog
-import ConfigParser
+import logging
+import six.moves.configparser
+import copy
+import os
 import yaml
 import re
 
-config = ConfigParser.RawConfigParser()
+
+config = six.moves.configparser.RawConfigParser()
 config.read('anteater.conf')
-logger = antlog.Logger(__name__).getLogger()
-gate_checks = config.get('config', 'gate_checks')
+logger = logging.getLogger(__name__)
+master_list = config.get('config', 'master_list')
+ignore_list = config.get('config', 'ignore_list')
+
+with open(master_list, 'r') as f:
+    ml = yaml.safe_load(f)
+
+with open(ignore_list, 'r') as f:
+    il = yaml.safe_load(f)
+
 
-with open(gate_checks, 'r') as f:
-    yl = yaml.safe_load(f)
+def _remove_nullvalue(contents):
+    if contents and len(contents) > 2 and 'nullvalue' in contents:
+        contents.remove('nullvalue')
+
+
+def _merge(org, ded):
+    ret = copy.deepcopy(org)
+    for key in list(set([k for k in org] + [k for k in ded])):
+        if key in org and key in ded:
+            ret[key] = list(set(ret[key] + ded[key]))
+            _remove_nullvalue(ret[key])
+        elif key in ded:
+            ret[key] = ded[key]
+    return ret
 
 
 class GetLists(object):
     def __init__(self, *args):
         # Placeholder for future args if more filters are needed
         self.args = args
+        self.loaded = False
+
+    def load_project_exception_file(self, project_exceptions, project):
+        if self.loaded:
+            return
+        exception_file = None
+        for item in project_exceptions:
+            if project in item:
+                exception_file = item.get(project)
+        if exception_file is not None:
+            with open(exception_file, 'r') as f:
+                ex = yaml.safe_load(f)
+            for key in ex:
+                if key in ml:
+                    ml[key][project] = _merge(ml[key][project], ex.get(key, None)) \
+                            if project in ml[key] else ex.get(key, None)
+            self.loaded = True
 
     def binary_list(self, project):
-        project_list = False
         try:
-            default_list = (yl['binaries']['binary_ignore'])
+            default_list = (ml['binaries']['binary_ignore'])
         except KeyError:
             logger.error('Key Error processing binary list values')
-        try:
-            project_list = (yl['binaries'][project]['binary_ignore'])
-        except KeyError:
-            logger.info('No binary waivers found for {0}'.
-                        format(project))
 
         binary_re = re.compile("|".join(default_list),
-                flags=re.IGNORECASE)
+                               flags=re.IGNORECASE)
+        return binary_re
+
+    def binary_hash(self, project, patch_file):
+        self.load_project_exception_file(ml.get('project_exceptions'), project)
+        try:
+            binary_hash = (ml['binaries'][project][patch_file])
+            return binary_hash
+        except KeyError:
+            binary_hash = 'null'
+            return binary_hash
 
-        if project_list:
-            binary_project_re = re.compile("|".join(project_list),
-                                           flags=re.IGNORECASE)
-            return binary_re, binary_project_re
-        else:
-            binary_project_re = re.compile("")
-            return binary_re, binary_project_re
 
     def file_audit_list(self, project):
         project_list = False
+        self.load_project_exception_file(ml.get('project_exceptions'), project)
         try:
-            default_list = set((yl['file_audits']['file_names']))
+            default_list = set((ml['file_audits']['file_names']))
         except KeyError:
             logger.error('Key Error processing file_names list values')
         try:
-            project_list = set((yl['file_audits'][project]['file_names']))
-            logger.info('file_names waivers found for {0}'.
-                        format(project))
+            project_list = set((ml['file_audits'][project]['file_names']))
+            logger.info('file_names waivers found for %s', project)
         except KeyError:
-            logger.info('No file_names waivers found for {0}'.
-                        format(project))
+            logger.info('No file_names waivers found for %s', project)
 
         file_names_re = re.compile("|".join(default_list),
                                    flags=re.IGNORECASE)
@@ -83,37 +120,48 @@ class GetLists(object):
 
     def file_content_list(self,  project):
         project_list = False
+        self.load_project_exception_file(ml.get('project_exceptions'), project)
         try:
-            default_list = set((yl['file_audits']['file_contents']))
+            master_list = (ml['file_audits']['file_contents'])
+
         except KeyError:
             logger.error('Key Error processing file_contents list values')
+
         try:
-            project_list = set((yl['file_audits'][project]['file_contents']))
+            ignore_list = il['file_audits']['file_contents']
+
         except KeyError:
-            logger.info('No file_contents waivers found  for {0}'.
-                        format(project))
+            logger.error('Key Error processing file_contents list values')
 
-        file_contents_re = re.compile("|".join(default_list),
-                                      flags=re.IGNORECASE)
+        try:
+            project_list = ml['file_audits'][project]['file_contents']
 
-        if project_list:
-            file_contents_proj_re = re.compile("|".join(project_list),
-                                               flags=re.IGNORECASE)
-            return file_contents_re, file_contents_proj_re
-        else:
-            file_contents_proj_re = re.compile("")
-            return file_contents_re, file_contents_proj_re
+        except KeyError:
+            logger.info('No file_contents waivers found  for %s', project)
+
+        ignore_list_merge = project_list + ignore_list
+
+        ignore_list_re = re.compile("|".join(ignore_list_merge), flags=re.IGNORECASE)
+
+        return master_list, ignore_list_re
+
+    def file_ignore(self):
+        try:
+            file_ignore = (ml['file_ignore'])
+        except KeyError:
+            logger.error('Key Error processing file_ignore list values')
+        return file_ignore
 
     def licence_extensions(self):
         try:
-            licence_extensions = (yl['licence']['licence_ext'])
+            licence_extensions = (ml['licence']['licence_ext'])
         except KeyError:
             logger.error('Key Error processing licence_extensions list values')
         return licence_extensions
 
     def licence_ignore(self):
         try:
-            licence_ignore = (yl['licence']['licence_ignore'])
+            licence_ignore = (ml['licence']['licence_ignore'])
         except KeyError:
             logger.error('Key Error processing licence_ignore list values')
         return licence_ignore