summaryrefslogtreecommitdiff
path: root/src/mailman/core/initialize.py
blob: bb3f8a66e9b08ec57c49c59d0f64e497209d0a0b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# Copyright (C) 2006-2009 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/>.

"""Initialize all global state.

Every entrance into the Mailman system, be it by command line, mail program,
or cgi, must call the initialize function here in order for the system's
global state to be set up properly.  Typically this is called after command
line argument parsing, since some of the initialization behavior is controlled
by the command line arguments.
"""

from __future__ import absolute_import, unicode_literals

__metaclass__ = type
__all__ = [
    'initialize',
    'initialize_1',
    'initialize_2',
    'initialize_3',
    ]


import os

from zope.interface.interface import adapter_hooks
from zope.interface.verify import verifyObject

import mailman.config.config
import mailman.core.logging

from mailman.core.plugins import get_plugin
from mailman.interfaces.database import IDatabase



# These initialization calls are separated for the testing framework, which
# needs to do some internal calculations after config file loading and log
# initialization, but before database initialization.  Generally all other
# code will just call initialize().

def initialize_1(config_path=None, propagate_logs=None):
    """First initialization step.

    * The configuration system
    * Run-time directories
    * The logging subsystem

    :param config_path: The path to the configuration file.
    :type config_path: string
    :param propagate_logs: Should the log output propagate to stderr?
    :type propagate_logs: boolean or None
    """
    # By default, set the umask so that only owner and group can read and
    # write our files.  Specifically we must have g+rw and we probably want
    # o-rwx although I think in most cases it doesn't hurt if other can read
    # or write the files.  Note that the Pipermail archive has more
    # restrictive permissions in order to handle private archives, but it
    # handles that correctly.
    os.umask(007)
    mailman.config.config.load(config_path)
    # Create the queue and log directories if they don't already exist.
    mailman.config.config.ensure_directories_exist()
    mailman.core.logging.initialize(propagate_logs)


def initialize_2(debug=False):
    """Second initialization step.

    * Rules
    * Chains
    * Pipelines
    * Commands

    :param debug: Should the database layer be put in debug mode?
    :type debug: boolean
    """
    database_plugin = get_plugin('mailman.database')
    # Instantiate the database plugin, ensure that it's of the right type, and
    # initialize it.  Then stash the object on our configuration object.
    database = database_plugin()
    verifyObject(IDatabase, database)
    database.initialize(debug)
    mailman.config.config.db = database
    # Initialize the rules and chains.  Do the imports here so as to avoid
    # circular imports.
    from mailman.app.commands import initialize as initialize_commands
    from mailman.core.chains import initialize as initialize_chains
    from mailman.core.pipelines import initialize as initialize_pipelines
    from mailman.core.rules import initialize as initialize_rules
    # Order here is somewhat important.
    initialize_rules()
    initialize_chains()
    initialize_pipelines()
    initialize_commands()


def initialize_3():
    """Third initialization step.

    * Adapters
    """
    from mailman.app.registrar import adapt_domain_to_registrar
    adapter_hooks.append(adapt_domain_to_registrar)
    from mailman.database.autorespond import adapt_mailing_list_to_response_set
    adapter_hooks.append(adapt_mailing_list_to_response_set)
    from mailman.database.mailinglist import (
        adapt_mailing_list_to_acceptable_alias_set)
    adapter_hooks.append(adapt_mailing_list_to_acceptable_alias_set)



def initialize(config_path=None, propagate_logs=None):
    initialize_1(config_path, propagate_logs)
    initialize_2()
    initialize_3()