88 lines
2.2 KiB
Python
88 lines
2.2 KiB
Python
"""Lacre configuration
|
|
|
|
Routines defined here are responsible for processing configuration.
|
|
"""
|
|
|
|
from configparser import RawConfigParser
|
|
|
|
import os
|
|
|
|
|
|
# Environment variable name we read to retrieve configuration path. This is to
|
|
# enable non-root users to set up and run GPG Mailgate and to make the software
|
|
# testable.
|
|
CONFIG_PATH_ENV = "GPG_MAILGATE_CONFIG"
|
|
|
|
# List of mandatory configuration parameters. Each item on this list should be
|
|
# a pair: a section name and a parameter name.
|
|
MANDATORY_CONFIG_ITEMS = [("relay", "host"),
|
|
("relay", "port")]
|
|
|
|
# Global dict to keep configuration parameters. It's hidden behind several
|
|
# utility functions to make it easy to replace it with ConfigParser object in
|
|
# the future.
|
|
cfg = dict()
|
|
|
|
def load_config() -> dict:
|
|
"""Parses configuration file.
|
|
|
|
If environment variable identified by CONFIG_PATH_ENV
|
|
variable is set, its value is taken as a configuration file
|
|
path. Otherwise, the default is taken
|
|
('/etc/gpg-mailgate.conf').
|
|
"""
|
|
configFile = os.getenv(CONFIG_PATH_ENV, '/etc/gpg-mailgate.conf')
|
|
|
|
parser = read_config(configFile)
|
|
|
|
global cfg
|
|
cfg = copy_to_dict(parser)
|
|
return cfg
|
|
|
|
def read_config(fileName) -> RawConfigParser:
|
|
cp = RawConfigParser()
|
|
cp.read(fileName)
|
|
|
|
return cp
|
|
|
|
def copy_to_dict(confParser) -> dict:
|
|
config = dict()
|
|
|
|
for sect in confParser.sections():
|
|
config[sect] = dict()
|
|
for (name, value) in confParser.items(sect):
|
|
config[sect][name] = value
|
|
|
|
return config
|
|
|
|
def get_item(section, key, empty_value = None):
|
|
global cfg
|
|
if config_item_set(section, key):
|
|
return cfg[section][key]
|
|
else:
|
|
return empty_value
|
|
|
|
def has_section(section) -> bool:
|
|
global cfg
|
|
return section in cfg
|
|
|
|
def config_item_set(section, key) -> bool:
|
|
global cfg
|
|
return section in cfg and (key in cfg[section]) and not (cfg[section][key] is None)
|
|
|
|
def config_item_equals(section, key, value) -> bool:
|
|
global cfg
|
|
return section in cfg and key in cfg[section] and cfg[section][key] == value
|
|
|
|
def validate_config():
|
|
"""Checks whether the configuration is complete.
|
|
|
|
Returns a list of missing parameters, so an empty list means
|
|
configuration is complete.
|
|
"""
|
|
missing = []
|
|
for (section, param) in MANDATORY_CONFIG_ITEMS:
|
|
if not config_item_set(section, param):
|
|
missing.append((section, param))
|
|
return missing
|