summaryrefslogtreecommitdiff
path: root/src/mailman/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/mailman/core')
-rw-r--r--src/mailman/core/initialize.py29
-rw-r--r--src/mailman/core/plugins.py42
2 files changed, 62 insertions, 9 deletions
diff --git a/src/mailman/core/initialize.py b/src/mailman/core/initialize.py
index dc67e9a68..18e874552 100644
--- a/src/mailman/core/initialize.py
+++ b/src/mailman/core/initialize.py
@@ -26,11 +26,11 @@ by the command line arguments.
import os
import sys
+import warnings
import mailman.config.config
import mailman.core.logging
from mailman.interfaces.database import IDatabaseFactory
-from mailman.utilities.modules import call_name
from pkg_resources import resource_string as resource_bytes
from public import public
from zope.component import getUtility
@@ -133,7 +133,7 @@ def initialize_2(debug=False, propagate_logs=None, testing=False):
* Database
* Logging
- * Pre-hook
+ * Plugin's pre_hook
* Rules
* Chains
* Pipelines
@@ -146,10 +146,17 @@ def initialize_2(debug=False, propagate_logs=None, testing=False):
"""
# Create the queue and log directories if they don't already exist.
mailman.core.logging.initialize(propagate_logs)
- # Run the pre-hook if there is one.
+ # Initialize plugins
+ from mailman.core.plugins import initialize as initialize_plugins
+ initialize_plugins()
+ # Run the plugin pre_hooks
config = mailman.config.config
- if config.mailman.pre_hook:
- call_name(config.mailman.pre_hook)
+ if "pre_hook" in config.mailman: # pragma: no cover
+ warnings.warn(
+ "The pre_hook configuration value has been replaced by the "
+ "plugins infrastructure.", DeprecationWarning)
+ for plugin in config.plugins.values():
+ plugin.pre_hook()
# Instantiate the database class, ensure that it's of the right type, and
# initialize it. Then stash the object on our configuration object.
utility_name = ('testing' if testing else 'production')
@@ -171,12 +178,16 @@ def initialize_2(debug=False, propagate_logs=None, testing=False):
def initialize_3():
"""Third initialization step.
- * Post-hook
+ * Plugin's post_hook
"""
- # Run the post-hook if there is one.
+ # Run the plugin post_hooks
config = mailman.config.config
- if config.mailman.post_hook:
- call_name(config.mailman.post_hook)
+ if "post_hook" in config.mailman: # pragma: no cover
+ warnings.warn(
+ "The post_hook configuration value has been replaced by the "
+ "plugins infrastructure.", DeprecationWarning)
+ for plugin in config.plugins.values():
+ plugin.post_hook()
@public
diff --git a/src/mailman/core/plugins.py b/src/mailman/core/plugins.py
new file mode 100644
index 000000000..565c590b5
--- /dev/null
+++ b/src/mailman/core/plugins.py
@@ -0,0 +1,42 @@
+# Copyright (C) 2008-2017 by the Free Software Foundation, Inc.
+#
+# This file is part of GNU Mailman.
+#
+# GNU Mailman is free software: you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation, either version 3 of the License, or (at your option)
+# any later version.
+#
+# GNU Mailman 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 General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# GNU Mailman. If not, see <http://www.gnu.org/licenses/>.
+
+"""Various plugin helpers."""
+
+from lazr.config import as_boolean
+from mailman.config import config
+from mailman.interfaces.plugin import IPlugin
+from mailman.utilities.modules import find_name
+from public import public
+from zope.interface.verify import verifyObject
+
+
+@public
+def initialize():
+ """Initialize all enabled plugins."""
+ for plugin_config in config.plugin_configs:
+ plugin_class_path = plugin_config['class']
+ if as_boolean(plugin_config.enable) and plugin_class_path:
+ plugin_class = find_name(plugin_class_path)
+ plugin = plugin_class()
+ verifyObject(IPlugin, plugin)
+ name = plugin_config.name.split('.')[-1]
+ plugin.name = name
+ assert plugin.name not in config.plugins, (
+ 'Duplicate plugin "{}" found in {}'.format(
+ plugin.name, plugin_class))
+ config.plugins[plugin.name] = plugin