From 703dc315bc0af61de557a84c59691e1537299d58 Mon Sep 17 00:00:00 2001 From: Mike Salvatore Date: Fri, 25 Mar 2022 08:34:45 -0400 Subject: [PATCH] Agent: Remove disused Plugin abstract class --- .../utils/plugins/__init__.py | 0 .../infection_monkey/utils/plugins/plugin.py | 91 ------------------- .../utils/plugins/pluginTests/BadImport.py | 7 -- .../utils/plugins/pluginTests/BadInit.py | 6 -- .../utils/plugins/pluginTests/ComboFile.py | 10 -- .../plugins/pluginTests/PluginTestClass.py | 23 ----- .../plugins/pluginTests/PluginWorking.py | 5 - .../utils/plugins/pluginTests/__init__.py | 0 .../utils/plugins/test_plugin.py | 38 -------- 9 files changed, 180 deletions(-) delete mode 100644 monkey/infection_monkey/utils/plugins/__init__.py delete mode 100644 monkey/infection_monkey/utils/plugins/plugin.py delete mode 100644 monkey/tests/unit_tests/infection_monkey/utils/plugins/pluginTests/BadImport.py delete mode 100644 monkey/tests/unit_tests/infection_monkey/utils/plugins/pluginTests/BadInit.py delete mode 100644 monkey/tests/unit_tests/infection_monkey/utils/plugins/pluginTests/ComboFile.py delete mode 100644 monkey/tests/unit_tests/infection_monkey/utils/plugins/pluginTests/PluginTestClass.py delete mode 100644 monkey/tests/unit_tests/infection_monkey/utils/plugins/pluginTests/PluginWorking.py delete mode 100644 monkey/tests/unit_tests/infection_monkey/utils/plugins/pluginTests/__init__.py delete mode 100644 monkey/tests/unit_tests/infection_monkey/utils/plugins/test_plugin.py diff --git a/monkey/infection_monkey/utils/plugins/__init__.py b/monkey/infection_monkey/utils/plugins/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/monkey/infection_monkey/utils/plugins/plugin.py b/monkey/infection_monkey/utils/plugins/plugin.py deleted file mode 100644 index 81297d5e8..000000000 --- a/monkey/infection_monkey/utils/plugins/plugin.py +++ /dev/null @@ -1,91 +0,0 @@ -import glob -import importlib -import inspect -import logging -from abc import ABCMeta, abstractmethod -from os.path import basename, dirname, isfile, join -from typing import Callable, Sequence, Type, TypeVar - -logger = logging.getLogger(__name__) - - -def _get_candidate_files(base_package_file): - files = glob.glob(join(dirname(base_package_file), "*.py")) - return [basename(f)[:-3] for f in files if isfile(f) and not f.endswith("__init__.py")] - - -PluginType = TypeVar("PluginType", bound="Plugin") - - -class Plugin(metaclass=ABCMeta): - @staticmethod - @abstractmethod - def should_run(class_name: str) -> bool: - raise NotImplementedError() - - @classmethod - def get_classes(cls) -> Sequence[Callable]: - """ - Returns the class objects from base_package_spec - base_package name and file must refer to the same package otherwise bad results - :return: A list of parent_class classes. - """ - objects = [] - candidate_files = _get_candidate_files(cls.base_package_file()) - logger.info( - "looking for classes of type {} in {}".format(cls.__name__, cls.base_package_name()) - ) - # Go through all of files - for file in candidate_files: - # Import module from that file - module = importlib.import_module("." + file, cls.base_package_name()) - # Get all classes in a module - # m[1] because return object is (name,class) - classes = [ - m[1] - for m in inspect.getmembers(module, inspect.isclass) - if ((m[1].__module__ == module.__name__) and issubclass(m[1], cls)) - ] - # Get object from class - for class_object in classes: - logger.debug("Checking if should run object {}".format(class_object.__name__)) - try: - if class_object.should_run(class_object.__name__): - objects.append(class_object) - logger.debug("Added {} to list".format(class_object.__name__)) - except Exception as e: - logger.warning( - "Exception {} when checking if {} should run".format( - str(e), class_object.__name__ - ) - ) - return objects - - @classmethod - def get_instances(cls) -> Sequence[Type[PluginType]]: - """ - Returns the type objects from base_package_spec. - base_package name and file must refer to the same package otherwise bad results - :return: A list of parent_class objects. - """ - class_objects = cls.get_classes() - instances = [] - for class_object in class_objects: - try: - instance = class_object() - instances.append(instance) - except Exception as e: - logger.warning( - "Exception {} when initializing {}".format(str(e), class_object.__name__) - ) - return instances - - @staticmethod - @abstractmethod - def base_package_file(): - pass - - @staticmethod - @abstractmethod - def base_package_name(): - pass diff --git a/monkey/tests/unit_tests/infection_monkey/utils/plugins/pluginTests/BadImport.py b/monkey/tests/unit_tests/infection_monkey/utils/plugins/pluginTests/BadImport.py deleted file mode 100644 index f0276b19d..000000000 --- a/monkey/tests/unit_tests/infection_monkey/utils/plugins/pluginTests/BadImport.py +++ /dev/null @@ -1,7 +0,0 @@ -from tests.unit_tests.infection_monkey.utils.plugins.pluginTests.PluginTestClass import ( # noqa: F401, E501 - PluginTester, -) - - -class SomeDummyPlugin: - pass diff --git a/monkey/tests/unit_tests/infection_monkey/utils/plugins/pluginTests/BadInit.py b/monkey/tests/unit_tests/infection_monkey/utils/plugins/pluginTests/BadInit.py deleted file mode 100644 index 821b2d063..000000000 --- a/monkey/tests/unit_tests/infection_monkey/utils/plugins/pluginTests/BadInit.py +++ /dev/null @@ -1,6 +0,0 @@ -from tests.unit_tests.infection_monkey.utils.plugins.pluginTests.PluginTestClass import PluginTester - - -class BadPluginInit(PluginTester): - def __init__(self): - raise Exception("TestException") diff --git a/monkey/tests/unit_tests/infection_monkey/utils/plugins/pluginTests/ComboFile.py b/monkey/tests/unit_tests/infection_monkey/utils/plugins/pluginTests/ComboFile.py deleted file mode 100644 index 45f39738a..000000000 --- a/monkey/tests/unit_tests/infection_monkey/utils/plugins/pluginTests/ComboFile.py +++ /dev/null @@ -1,10 +0,0 @@ -from tests.unit_tests.infection_monkey.utils.plugins.pluginTests.PluginTestClass import PluginTester - - -class BadInit(PluginTester): - def __init__(self): - raise Exception("TestException") - - -class ProperClass(PluginTester): - pass diff --git a/monkey/tests/unit_tests/infection_monkey/utils/plugins/pluginTests/PluginTestClass.py b/monkey/tests/unit_tests/infection_monkey/utils/plugins/pluginTests/PluginTestClass.py deleted file mode 100644 index 0220e0683..000000000 --- a/monkey/tests/unit_tests/infection_monkey/utils/plugins/pluginTests/PluginTestClass.py +++ /dev/null @@ -1,23 +0,0 @@ -import tests.unit_tests.infection_monkey.utils.plugins.pluginTests - -from infection_monkey.utils.plugins.plugin import Plugin - - -class PluginTester(Plugin): - classes_to_load = [] - - @staticmethod - def should_run(class_name): - """ - Decides if post breach action is enabled in config - :return: True if it needs to be ran, false otherwise - """ - return class_name in PluginTester.classes_to_load - - @staticmethod - def base_package_file(): - return tests.unit_tests.infection_monkey.utils.plugins.pluginTests.__file__ - - @staticmethod - def base_package_name(): - return tests.unit_tests.infection_monkey.utils.plugins.pluginTests.__package__ diff --git a/monkey/tests/unit_tests/infection_monkey/utils/plugins/pluginTests/PluginWorking.py b/monkey/tests/unit_tests/infection_monkey/utils/plugins/pluginTests/PluginWorking.py deleted file mode 100644 index bae443c50..000000000 --- a/monkey/tests/unit_tests/infection_monkey/utils/plugins/pluginTests/PluginWorking.py +++ /dev/null @@ -1,5 +0,0 @@ -from tests.unit_tests.infection_monkey.utils.plugins.pluginTests.PluginTestClass import PluginTester - - -class PluginWorking(PluginTester): - pass diff --git a/monkey/tests/unit_tests/infection_monkey/utils/plugins/pluginTests/__init__.py b/monkey/tests/unit_tests/infection_monkey/utils/plugins/pluginTests/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/monkey/tests/unit_tests/infection_monkey/utils/plugins/test_plugin.py b/monkey/tests/unit_tests/infection_monkey/utils/plugins/test_plugin.py deleted file mode 100644 index db1069bf0..000000000 --- a/monkey/tests/unit_tests/infection_monkey/utils/plugins/test_plugin.py +++ /dev/null @@ -1,38 +0,0 @@ -from unittest import TestCase - -from tests.unit_tests.infection_monkey.utils.plugins.pluginTests.BadImport import SomeDummyPlugin -from tests.unit_tests.infection_monkey.utils.plugins.pluginTests.BadInit import BadPluginInit -from tests.unit_tests.infection_monkey.utils.plugins.pluginTests.ComboFile import ( - BadInit, - ProperClass, -) -from tests.unit_tests.infection_monkey.utils.plugins.pluginTests.PluginTestClass import PluginTester -from tests.unit_tests.infection_monkey.utils.plugins.pluginTests.PluginWorking import PluginWorking - - -class TestPlugin(TestCase): - def test_combo_file(self): - PluginTester.classes_to_load = [BadInit.__name__, ProperClass.__name__] - to_init = PluginTester.get_classes() - self.assertEqual(len(to_init), 2) - objects = PluginTester.get_instances() - self.assertEqual(len(objects), 1) - - def test_bad_init(self): - PluginTester.classes_to_load = [BadPluginInit.__name__] - to_init = PluginTester.get_classes() - self.assertEqual(len(to_init), 1) - objects = PluginTester.get_instances() - self.assertEqual(len(objects), 0) - - def test_bad_import(self): - PluginTester.classes_to_load = [SomeDummyPlugin.__name__] - to_init = PluginTester.get_classes() - self.assertEqual(len(to_init), 0) - - def test_flow(self): - PluginTester.classes_to_load = [PluginWorking.__name__] - to_init = PluginTester.get_classes() - self.assertEqual(len(to_init), 1) - objects = PluginTester.get_instances() - self.assertEqual(len(objects), 1)