|
|
@ -1,5 +1,7 @@ |
|
|
|
# -*- coding: utf-8 -*- |
|
|
|
# -*- coding: utf-8 -*- |
|
|
|
# Copyright 2014-2016 OpenMarket Ltd |
|
|
|
# Copyright 2014-2016 OpenMarket Ltd |
|
|
|
|
|
|
|
# Copyright 2017-2018 New Vector Ltd |
|
|
|
|
|
|
|
# Copyright 2019 The Matrix.org Foundation C.I.C. |
|
|
|
# |
|
|
|
# |
|
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
# you may not use this file except in compliance with the License. |
|
|
|
# you may not use this file except in compliance with the License. |
|
|
@ -216,7 +218,7 @@ class Config(object): |
|
|
|
"--keys-directory", |
|
|
|
"--keys-directory", |
|
|
|
metavar="DIRECTORY", |
|
|
|
metavar="DIRECTORY", |
|
|
|
help="Where files such as certs and signing keys are stored when" |
|
|
|
help="Where files such as certs and signing keys are stored when" |
|
|
|
" their location is given explicitly in the config." |
|
|
|
" their location is not given explicitly in the config." |
|
|
|
" Defaults to the directory containing the last config file", |
|
|
|
" Defaults to the directory containing the last config file", |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
@ -228,10 +230,22 @@ class Config(object): |
|
|
|
|
|
|
|
|
|
|
|
config_files = find_config_files(search_paths=config_args.config_path) |
|
|
|
config_files = find_config_files(search_paths=config_args.config_path) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not config_files: |
|
|
|
|
|
|
|
config_parser.error("Must supply a config file.") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if config_args.keys_directory: |
|
|
|
|
|
|
|
config_dir_path = config_args.keys_directory |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
config_dir_path = os.path.dirname(config_files[-1]) |
|
|
|
|
|
|
|
config_dir_path = os.path.abspath(config_dir_path) |
|
|
|
|
|
|
|
data_dir_path = os.getcwd() |
|
|
|
|
|
|
|
|
|
|
|
config_dict = obj.read_config_files( |
|
|
|
config_dict = obj.read_config_files( |
|
|
|
config_files, keys_directory=config_args.keys_directory |
|
|
|
config_files, config_dir_path=config_dir_path, data_dir_path=data_dir_path |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
obj.parse_config_dict( |
|
|
|
|
|
|
|
config_dict, config_dir_path=config_dir_path, data_dir_path=data_dir_path |
|
|
|
) |
|
|
|
) |
|
|
|
obj.parse_config_dict(config_dict) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
obj.invoke_all("read_arguments", config_args) |
|
|
|
obj.invoke_all("read_arguments", config_args) |
|
|
|
|
|
|
|
|
|
|
@ -282,7 +296,7 @@ class Config(object): |
|
|
|
metavar="DIRECTORY", |
|
|
|
metavar="DIRECTORY", |
|
|
|
help=( |
|
|
|
help=( |
|
|
|
"Specify where additional config files such as signing keys and log" |
|
|
|
"Specify where additional config files such as signing keys and log" |
|
|
|
" config should be stored. Defaults to the same directory as the main" |
|
|
|
" config should be stored. Defaults to the same directory as the last" |
|
|
|
" config file." |
|
|
|
" config file." |
|
|
|
), |
|
|
|
), |
|
|
|
) |
|
|
|
) |
|
|
@ -290,6 +304,20 @@ class Config(object): |
|
|
|
|
|
|
|
|
|
|
|
config_files = find_config_files(search_paths=config_args.config_path) |
|
|
|
config_files = find_config_files(search_paths=config_args.config_path) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not config_files: |
|
|
|
|
|
|
|
config_parser.error( |
|
|
|
|
|
|
|
"Must supply a config file.\nA config file can be automatically" |
|
|
|
|
|
|
|
' generated using "--generate-config -H SERVER_NAME' |
|
|
|
|
|
|
|
' -c CONFIG-FILE"' |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if config_args.config_directory: |
|
|
|
|
|
|
|
config_dir_path = config_args.config_directory |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
config_dir_path = os.path.dirname(config_files[-1]) |
|
|
|
|
|
|
|
config_dir_path = os.path.abspath(config_dir_path) |
|
|
|
|
|
|
|
data_dir_path = os.getcwd() |
|
|
|
|
|
|
|
|
|
|
|
generate_missing_configs = config_args.generate_missing_configs |
|
|
|
generate_missing_configs = config_args.generate_missing_configs |
|
|
|
|
|
|
|
|
|
|
|
obj = cls() |
|
|
|
obj = cls() |
|
|
@ -300,20 +328,10 @@ class Config(object): |
|
|
|
"Please specify either --report-stats=yes or --report-stats=no\n\n" |
|
|
|
"Please specify either --report-stats=yes or --report-stats=no\n\n" |
|
|
|
+ MISSING_REPORT_STATS_SPIEL |
|
|
|
+ MISSING_REPORT_STATS_SPIEL |
|
|
|
) |
|
|
|
) |
|
|
|
if not config_files: |
|
|
|
|
|
|
|
config_parser.error( |
|
|
|
|
|
|
|
"Must supply a config file.\nA config file can be automatically" |
|
|
|
|
|
|
|
' generated using "--generate-config -H SERVER_NAME' |
|
|
|
|
|
|
|
' -c CONFIG-FILE"' |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
(config_path,) = config_files |
|
|
|
(config_path,) = config_files |
|
|
|
if not cls.path_exists(config_path): |
|
|
|
if not cls.path_exists(config_path): |
|
|
|
print("Generating config file %s" % (config_path,)) |
|
|
|
print("Generating config file %s" % (config_path,)) |
|
|
|
if config_args.config_directory: |
|
|
|
|
|
|
|
config_dir_path = config_args.config_directory |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
config_dir_path = os.path.dirname(config_path) |
|
|
|
|
|
|
|
config_dir_path = os.path.abspath(config_dir_path) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
server_name = config_args.server_name |
|
|
|
server_name = config_args.server_name |
|
|
|
if not server_name: |
|
|
|
if not server_name: |
|
|
@ -324,7 +342,7 @@ class Config(object): |
|
|
|
|
|
|
|
|
|
|
|
config_str = obj.generate_config( |
|
|
|
config_str = obj.generate_config( |
|
|
|
config_dir_path=config_dir_path, |
|
|
|
config_dir_path=config_dir_path, |
|
|
|
data_dir_path=os.getcwd(), |
|
|
|
data_dir_path=data_dir_path, |
|
|
|
server_name=server_name, |
|
|
|
server_name=server_name, |
|
|
|
report_stats=(config_args.report_stats == "yes"), |
|
|
|
report_stats=(config_args.report_stats == "yes"), |
|
|
|
generate_secrets=True, |
|
|
|
generate_secrets=True, |
|
|
@ -367,35 +385,37 @@ class Config(object): |
|
|
|
obj.invoke_all("add_arguments", parser) |
|
|
|
obj.invoke_all("add_arguments", parser) |
|
|
|
args = parser.parse_args(remaining_args) |
|
|
|
args = parser.parse_args(remaining_args) |
|
|
|
|
|
|
|
|
|
|
|
if not config_files: |
|
|
|
|
|
|
|
config_parser.error( |
|
|
|
|
|
|
|
"Must supply a config file.\nA config file can be automatically" |
|
|
|
|
|
|
|
' generated using "--generate-config -H SERVER_NAME' |
|
|
|
|
|
|
|
' -c CONFIG-FILE"' |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
config_dict = obj.read_config_files( |
|
|
|
config_dict = obj.read_config_files( |
|
|
|
config_files, keys_directory=config_args.config_directory |
|
|
|
config_files, config_dir_path=config_dir_path, data_dir_path=data_dir_path |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
if generate_missing_configs: |
|
|
|
if generate_missing_configs: |
|
|
|
obj.generate_missing_files(config_dict) |
|
|
|
obj.generate_missing_files(config_dict) |
|
|
|
return None |
|
|
|
return None |
|
|
|
|
|
|
|
|
|
|
|
obj.parse_config_dict(config_dict) |
|
|
|
obj.parse_config_dict( |
|
|
|
|
|
|
|
config_dict, config_dir_path=config_dir_path, data_dir_path=data_dir_path |
|
|
|
|
|
|
|
) |
|
|
|
obj.invoke_all("read_arguments", args) |
|
|
|
obj.invoke_all("read_arguments", args) |
|
|
|
|
|
|
|
|
|
|
|
return obj |
|
|
|
return obj |
|
|
|
|
|
|
|
|
|
|
|
def read_config_files(self, config_files, keys_directory=None): |
|
|
|
def read_config_files(self, config_files, config_dir_path, data_dir_path): |
|
|
|
"""Read the config files into a dict |
|
|
|
"""Read the config files into a dict |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Args: |
|
|
|
|
|
|
|
config_files (iterable[str]): A list of the config files to read |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
config_dir_path (str): The path where the config files are kept. Used to |
|
|
|
|
|
|
|
create filenames for things like the log config and the signing key. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
data_dir_path (str): The path where the data files are kept. Used to create |
|
|
|
|
|
|
|
filenames for things like the database and media store. |
|
|
|
|
|
|
|
|
|
|
|
Returns: dict |
|
|
|
Returns: dict |
|
|
|
""" |
|
|
|
""" |
|
|
|
if not keys_directory: |
|
|
|
# FIXME: get rid of this |
|
|
|
keys_directory = os.path.dirname(config_files[-1]) |
|
|
|
self.config_dir_path = config_dir_path |
|
|
|
|
|
|
|
|
|
|
|
self.config_dir_path = os.path.abspath(keys_directory) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# first we read the config files into a dict |
|
|
|
# first we read the config files into a dict |
|
|
|
specified_config = {} |
|
|
|
specified_config = {} |
|
|
@ -409,8 +429,8 @@ class Config(object): |
|
|
|
raise ConfigError(MISSING_SERVER_NAME) |
|
|
|
raise ConfigError(MISSING_SERVER_NAME) |
|
|
|
server_name = specified_config["server_name"] |
|
|
|
server_name = specified_config["server_name"] |
|
|
|
config_string = self.generate_config( |
|
|
|
config_string = self.generate_config( |
|
|
|
config_dir_path=self.config_dir_path, |
|
|
|
config_dir_path=config_dir_path, |
|
|
|
data_dir_path=os.getcwd(), |
|
|
|
data_dir_path=data_dir_path, |
|
|
|
server_name=server_name, |
|
|
|
server_name=server_name, |
|
|
|
generate_secrets=False, |
|
|
|
generate_secrets=False, |
|
|
|
) |
|
|
|
) |
|
|
@ -430,8 +450,24 @@ class Config(object): |
|
|
|
) |
|
|
|
) |
|
|
|
return config |
|
|
|
return config |
|
|
|
|
|
|
|
|
|
|
|
def parse_config_dict(self, config_dict): |
|
|
|
def parse_config_dict(self, config_dict, config_dir_path, data_dir_path): |
|
|
|
self.invoke_all("read_config", config_dict) |
|
|
|
"""Read the information from the config dict into this Config object. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Args: |
|
|
|
|
|
|
|
config_dict (dict): Configuration data, as read from the yaml |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
config_dir_path (str): The path where the config files are kept. Used to |
|
|
|
|
|
|
|
create filenames for things like the log config and the signing key. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
data_dir_path (str): The path where the data files are kept. Used to create |
|
|
|
|
|
|
|
filenames for things like the database and media store. |
|
|
|
|
|
|
|
""" |
|
|
|
|
|
|
|
self.invoke_all( |
|
|
|
|
|
|
|
"read_config", |
|
|
|
|
|
|
|
config_dict, |
|
|
|
|
|
|
|
config_dir_path=config_dir_path, |
|
|
|
|
|
|
|
data_dir_path=data_dir_path, |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
def generate_missing_files(self, config_dict): |
|
|
|
def generate_missing_files(self, config_dict): |
|
|
|
self.invoke_all("generate_files", config_dict) |
|
|
|
self.invoke_all("generate_files", config_dict) |
|
|
|