Move the introducer config reading code into _Config

This commit is contained in:
Jean-Paul Calderone
2020-11-14 09:12:14 -05:00
parent bcef851ae0
commit bef5ccd0ca
2 changed files with 68 additions and 42 deletions

View File

@ -1,7 +1,6 @@
import os, stat, time, weakref import os, stat, time, weakref
from base64 import urlsafe_b64encode from base64 import urlsafe_b64encode
from functools import partial from functools import partial
from errno import ENOENT, EPERM
# On Python 2 this will be the backported package: # On Python 2 this will be the backported package:
from configparser import NoSectionError from configparser import NoSectionError
@ -464,51 +463,13 @@ def create_introducer_clients(config, main_tub, _introducer_factory=None):
# we return this list # we return this list
introducer_clients = [] introducer_clients = []
introducers_yaml_filename = config.get_private_path("introducers.yaml") introducers = config.get_introducer_configuration()
introducers_filepath = FilePath(introducers_yaml_filename)
try: for petname, introducer_furl in introducers.items():
with introducers_filepath.open() as f:
introducers_yaml = yamlutil.safe_load(f)
if introducers_yaml is None:
raise EnvironmentError(
EPERM,
"Can't read '{}'".format(introducers_yaml_filename),
introducers_yaml_filename,
)
introducers = introducers_yaml.get("introducers", {})
log.msg(
"found {} introducers in private/introducers.yaml".format(
len(introducers),
)
)
except EnvironmentError as e:
if e.errno != ENOENT:
raise
introducers = {}
if "default" in introducers.keys():
raise ValueError(
"'default' introducer furl cannot be specified in introducers.yaml;"
" please fix impossible configuration."
)
# read furl from tahoe.cfg
tahoe_cfg_introducer_furl = config.get_config("client", "introducer.furl", None)
if tahoe_cfg_introducer_furl == "None":
raise ValueError(
"tahoe.cfg has invalid 'introducer.furl = None':"
" to disable it, use 'introducer.furl ='"
" or omit the key entirely"
)
if tahoe_cfg_introducer_furl:
introducers[u'default'] = {'furl':tahoe_cfg_introducer_furl}
for petname, introducer in introducers.items():
introducer_cache_filepath = FilePath(config.get_private_path("introducer_{}_cache.yaml".format(petname))) introducer_cache_filepath = FilePath(config.get_private_path("introducer_{}_cache.yaml".format(petname)))
ic = _introducer_factory( ic = _introducer_factory(
main_tub, main_tub,
introducer['furl'].encode("ascii"), introducer_furl.encode("ascii"),
config.nickname, config.nickname,
str(allmydata.__full_version__), str(allmydata.__full_version__),
str(_Client.OLDEST_SUPPORTED_VERSION), str(_Client.OLDEST_SUPPORTED_VERSION),

View File

@ -21,10 +21,13 @@ import types
import errno import errno
import tempfile import tempfile
from base64 import b32decode, b32encode from base64 import b32decode, b32encode
from errno import ENOENT, EPERM
from warnings import warn
# On Python 2 this will be the backported package. # On Python 2 this will be the backported package.
import configparser import configparser
from twisted.python.filepath import FilePath
from twisted.python import log as twlog from twisted.python import log as twlog
from twisted.application import service from twisted.application import service
from twisted.python.failure import Failure from twisted.python.failure import Failure
@ -37,6 +40,9 @@ from allmydata.util.assertutil import _assert
from allmydata.util.fileutil import abspath_expanduser_unicode from allmydata.util.fileutil import abspath_expanduser_unicode
from allmydata.util.encodingutil import get_filesystem_encoding, quote_output from allmydata.util.encodingutil import get_filesystem_encoding, quote_output
from allmydata.util import configutil from allmydata.util import configutil
from allmydata.util.yamlutil import (
safe_load,
)
def _common_valid_config(): def _common_valid_config():
return configutil.ValidConfiguration({ return configutil.ValidConfiguration({
@ -428,6 +434,65 @@ class _Config(object):
os.path.join(self._basedir, *args) os.path.join(self._basedir, *args)
) )
def get_introducer_configuration(self):
"""
Get configuration for introducers.
:return {unicode: unicode}: A mapping from introducer petname to the
introducer's fURL.
"""
introducers_yaml_filename = self.get_private_path("introducers.yaml")
introducers_filepath = FilePath(introducers_yaml_filename)
try:
with introducers_filepath.open() as f:
introducers_yaml = safe_load(f)
if introducers_yaml is None:
raise EnvironmentError(
EPERM,
"Can't read '{}'".format(introducers_yaml_filename),
introducers_yaml_filename,
)
introducers = {
petname: config["furl"]
for petname, config
in introducers_yaml.get("introducers", {}).items()
}
log.msg(
"found {} introducers in private/introducers.yaml".format(
len(introducers),
)
)
except EnvironmentError as e:
if e.errno != ENOENT:
raise
introducers = {}
if "default" in introducers.keys():
raise ValueError(
"'default' introducer furl cannot be specified in introducers.yaml;"
" please fix impossible configuration."
)
# read furl from tahoe.cfg
tahoe_cfg_introducer_furl = self.get_config("client", "introducer.furl", None)
if tahoe_cfg_introducer_furl == "None":
raise ValueError(
"tahoe.cfg has invalid 'introducer.furl = None':"
" to disable it, use 'introducer.furl ='"
" or omit the key entirely"
)
if tahoe_cfg_introducer_furl:
warn(
"tahoe.cfg [client]introducer.furl is deprecated; "
"use private/introducers.yaml instead.",
category=DeprecationWarning,
stacklevel=-1,
)
introducers['default'] = tahoe_cfg_introducer_furl
return introducers
def create_tub_options(config): def create_tub_options(config):
""" """