Only configure --config-dir/--work-dir (rest dynamic).

This commit is contained in:
Jakub Warmuz
2015-06-01 23:49:07 +00:00
parent 9ea5e20b44
commit 3fefd28080
7 changed files with 99 additions and 84 deletions
-10
View File
@@ -332,16 +332,6 @@ def _paths_parser(parser):
help=config_help("config_dir")) help=config_help("config_dir"))
add("--work-dir", default=flag_default("work_dir"), add("--work-dir", default=flag_default("work_dir"),
help=config_help("work_dir")) help=config_help("work_dir"))
add("--backup-dir", default=flag_default("backup_dir"),
help=config_help("backup_dir"))
add("--key-dir", default=flag_default("key_dir"),
help=config_help("key_dir"))
add("--cert-dir", default=flag_default("certs_dir"),
help=config_help("cert_dir"))
add("--renewer-config-file", default=flag_default("renewer_config_file"),
help=config_help("renewer_config_file"))
return parser return parser
+41 -22
View File
@@ -17,10 +17,15 @@ class NamespaceConfig(object):
:attr:`~letsencrypt.interfaces.IConfig.work_dir` and relative :attr:`~letsencrypt.interfaces.IConfig.work_dir` and relative
paths defined in :py:mod:`letsencrypt.constants`: paths defined in :py:mod:`letsencrypt.constants`:
- ``temp_checkpoint_dir`` - `accounts_dir`
- ``in_progress_dir`` - `account_keys_dir`
- ``cert_key_backup`` - `cert_dir`
- ``rec_token_dir`` - `cert_key_backup`
- `in_progress_dir`
- `key_dir`
- `rec_token_dir`
- `renewer_config_file`
- `temp_checkpoint_dir`
:ivar namespace: Namespace typically produced by :ivar namespace: Namespace typically produced by
:meth:`argparse.ArgumentParser.parse_args`. :meth:`argparse.ArgumentParser.parse_args`.
@@ -35,27 +40,12 @@ class NamespaceConfig(object):
def __getattr__(self, name): def __getattr__(self, name):
return getattr(self.namespace, name) return getattr(self.namespace, name)
@property
def temp_checkpoint_dir(self): # pylint: disable=missing-docstring
return os.path.join(
self.namespace.work_dir, constants.TEMP_CHECKPOINT_DIR)
@property
def in_progress_dir(self): # pylint: disable=missing-docstring
return os.path.join(self.namespace.work_dir, constants.IN_PROGRESS_DIR)
@property @property
def server_path(self): def server_path(self):
"""File path based on ``server``.""" """File path based on ``server``."""
parsed = urlparse.urlparse(self.namespace.server) parsed = urlparse.urlparse(self.namespace.server)
return (parsed.netloc + parsed.path).replace('/', os.path.sep) return (parsed.netloc + parsed.path).replace('/', os.path.sep)
@property
def cert_key_backup(self): # pylint: disable=missing-docstring
return os.path.join(
self.namespace.work_dir, constants.CERT_KEY_BACKUP_DIR,
self.server_path)
@property @property
def accounts_dir(self): #pylint: disable=missing-docstring def accounts_dir(self): #pylint: disable=missing-docstring
return os.path.join( return os.path.join(
@@ -63,11 +53,40 @@ class NamespaceConfig(object):
@property @property
def account_keys_dir(self): #pylint: disable=missing-docstring def account_keys_dir(self): #pylint: disable=missing-docstring
return os.path.join( return os.path.join(self.accounts_dir, constants.ACCOUNT_KEYS_DIR)
self.namespace.config_dir, constants.ACCOUNTS_DIR,
self.server_path, constants.ACCOUNT_KEYS_DIR) @property
def backup_dir(self): # pylint: disable=missing-docstring
return os.path.join(self.namespace.work_dir, constants.BACKUP_DIR)
@property
def cert_dir(self): # pylint: disable=missing-docstring
return os.path.join(self.namespace.config_dir, constants.CERT_DIR)
@property
def cert_key_backup(self): # pylint: disable=missing-docstring
return os.path.join(self.namespace.work_dir,
constants.CERT_KEY_BACKUP_DIR, self.server_path)
@property
def in_progress_dir(self): # pylint: disable=missing-docstring
return os.path.join(self.namespace.work_dir, constants.IN_PROGRESS_DIR)
@property
def key_dir(self): # pylint: disable=missing-docstring
return os.path.join(self.namespace.config_dir, constants.KEY_DIR)
# TODO: This should probably include the server name # TODO: This should probably include the server name
@property @property
def rec_token_dir(self): # pylint: disable=missing-docstring def rec_token_dir(self): # pylint: disable=missing-docstring
return os.path.join(self.namespace.work_dir, constants.REC_TOKEN_DIR) return os.path.join(self.namespace.work_dir, constants.REC_TOKEN_DIR)
@property
def renewer_config_file(self): # pylint: disable=missing-docstring
return os.path.join(
self.namespace.config_dir, constants.RENEWER_CONFIG_FILENAME)
@property
def temp_checkpoint_dir(self): # pylint: disable=missing-docstring
return os.path.join(
self.namespace.work_dir, constants.TEMP_CHECKPOINT_DIR)
+29 -26
View File
@@ -1,6 +1,5 @@
"""Let's Encrypt constants.""" """Let's Encrypt constants."""
import logging import logging
import os
from acme import challenges from acme import challenges
@@ -8,24 +7,14 @@ from acme import challenges
SETUPTOOLS_PLUGINS_ENTRY_POINT = "letsencrypt.plugins" SETUPTOOLS_PLUGINS_ENTRY_POINT = "letsencrypt.plugins"
"""Setuptools entry point group name for plugins.""" """Setuptools entry point group name for plugins."""
_CLI_DEFAULT_CONFIG_DIR = "/etc/letsencrypt"
_CLI_DEFAULT_WORK_DIR = "/var/lib/letsencrypt"
_CLI_DEFAULT_CERT_DIR = os.path.join(_CLI_DEFAULT_CONFIG_DIR, "certs")
CLI_DEFAULTS = dict( CLI_DEFAULTS = dict(
config_files=["/etc/letsencrypt/cli.ini"], config_files=["/etc/letsencrypt/cli.ini"],
verbose_count=-(logging.WARNING / 10), verbose_count=-(logging.WARNING / 10),
server="https://www.letsencrypt-demo.org/acme/new-reg", server="https://www.letsencrypt-demo.org/acme/new-reg",
rsa_key_size=2048, rsa_key_size=2048,
rollback_checkpoints=0, rollback_checkpoints=0,
config_dir=_CLI_DEFAULT_CONFIG_DIR, config_dir="/etc/letsencrypt",
work_dir=_CLI_DEFAULT_CONFIG_DIR, work_dir="/var/lib/letsencrypt",
backup_dir=os.path.join(_CLI_DEFAULT_WORK_DIR, "backups"),
key_dir=os.path.join(_CLI_DEFAULT_CONFIG_DIR, "keys"),
certs_dir=_CLI_DEFAULT_CERT_DIR,
cert_path=os.path.join(_CLI_DEFAULT_CERT_DIR, "cert-letsencrypt.pem"),
chain_path=os.path.join(_CLI_DEFAULT_CERT_DIR, "chain-letsencrypt.pem"),
renewer_config_file=os.path.join(_CLI_DEFAULT_CONFIG_DIR, "renewer.conf"),
test_mode=False, test_mode=False,
) )
"""Defaults for CLI flags and `.IConfig` attributes.""" """Defaults for CLI flags and `.IConfig` attributes."""
@@ -64,26 +53,40 @@ List of expected options parameters:
CONFIG_DIRS_MODE = 0o755 CONFIG_DIRS_MODE = 0o755
"""Directory mode for ``.IConfig.config_dir`` et al.""" """Directory mode for ``.IConfig.config_dir`` et al."""
TEMP_CHECKPOINT_DIR = "temp_checkpoint"
"""Temporary checkpoint directory (relative to IConfig.work_dir)."""
IN_PROGRESS_DIR = "IN_PROGRESS"
"""Directory used before a permanent checkpoint is finalized (relative to
IConfig.work_dir)."""
CERT_KEY_BACKUP_DIR = "keys-certs"
"""Directory where all certificates and keys are stored (relative to
IConfig.work_dir. Used for easy revocation."""
ACCOUNTS_DIR = "accounts" ACCOUNTS_DIR = "accounts"
"""Directory where all accounts are saved.""" """Directory where all accounts are saved."""
ACCOUNT_KEYS_DIR = "keys" ACCOUNT_KEYS_DIR = "keys"
"""Directory where account keys are saved. Relative to ACCOUNTS_DIR.""" """Directory where account keys are saved. Relative to `ACCOUNTS_DIR`."""
BACKUP_DIR = "backups"
"""Directory (relative to `IConfig.work_dir`) where backups are kept."""
CERT_KEY_BACKUP_DIR = "keys-certs"
"""Directory where all certificates and keys are stored (relative to
`IConfig.work_dir`). Used for easy revocation."""
CERT_DIR = "certs"
"""Directory (relative to `IConfig.config_dir`) where CSRs are saved."""
IN_PROGRESS_DIR = "IN_PROGRESS"
"""Directory used before a permanent checkpoint is finalized (relative to
`IConfig.work_dir`)."""
KEYS_DIR = "keys"
"""Directory (relative to `IConfig.config_dir`) where keys are saved."""
TEMP_CHECKPOINT_DIR = "temp_checkpoint"
"""Temporary checkpoint directory (relative to `IConfig.work_dir`)."""
REC_TOKEN_DIR = "recovery_tokens" REC_TOKEN_DIR = "recovery_tokens"
"""Directory where all recovery tokens are saved (relative to """Directory where all recovery tokens are saved (relative to
IConfig.work_dir).""" `IConfig.work_dir`)."""
RENEWER_CONFIG_FILENAME = "renewer.conf"
"""Renewer config file name (relative to `IConfig.config_dir`)."""
NETSTAT = "/bin/netstat" NETSTAT = "/bin/netstat"
"""Location of netstat binary for checking whether a listener is already """Location of netstat binary for checking whether a listener is already
+11 -11
View File
@@ -156,23 +156,23 @@ class IConfig(zope.interface.Interface):
config_dir = zope.interface.Attribute("Configuration directory.") config_dir = zope.interface.Attribute("Configuration directory.")
work_dir = zope.interface.Attribute("Working directory.") work_dir = zope.interface.Attribute("Working directory.")
backup_dir = zope.interface.Attribute("Configuration backups directory.")
temp_checkpoint_dir = zope.interface.Attribute(
"Temporary checkpoint directory.")
in_progress_dir = zope.interface.Attribute(
"Directory used before a permanent checkpoint is finalized.")
cert_key_backup = zope.interface.Attribute(
"Directory where all certificates and keys are stored. "
"Used for easy revocation.")
accounts_dir = zope.interface.Attribute( accounts_dir = zope.interface.Attribute(
"Directory where all account information is stored.") "Directory where all account information is stored.")
account_keys_dir = zope.interface.Attribute( account_keys_dir = zope.interface.Attribute(
"Directory where all account keys are stored.") "Directory where all account keys are stored.")
backup_dir = zope.interface.Attribute("Configuration backups directory.")
cert_dir = zope.interface.Attribute("Certificates and CSRs storage.")
cert_key_backup = zope.interface.Attribute(
"Directory where all certificates and keys are stored. "
"Used for easy revocation.")
in_progress_dir = zope.interface.Attribute(
"Directory used before a permanent checkpoint is finalized.")
key_dir = zope.interface.Attribute("Keys storage.")
rec_token_dir = zope.interface.Attribute( rec_token_dir = zope.interface.Attribute(
"Directory where all recovery tokens are saved.") "Directory where all recovery tokens are saved.")
temp_checkpoint_dir = zope.interface.Attribute(
key_dir = zope.interface.Attribute("Keys storage.") "Temporary checkpoint directory.")
cert_dir = zope.interface.Attribute("Certificates and CSRs storage.")
renewer_config_file = zope.interface.Attribute( renewer_config_file = zope.interface.Attribute(
"Location of renewal configuration file.") "Location of renewal configuration file.")
+17 -9
View File
@@ -30,23 +30,31 @@ class NamespaceConfigTest(unittest.TestCase):
@mock.patch('letsencrypt.configuration.constants') @mock.patch('letsencrypt.configuration.constants')
def test_dynamic_dirs(self, constants): def test_dynamic_dirs(self, constants):
constants.TEMP_CHECKPOINT_DIR = 't'
constants.IN_PROGRESS_DIR = '../p'
constants.CERT_KEY_BACKUP_DIR = 'c/'
constants.REC_TOKEN_DIR = '/r'
constants.ACCOUNTS_DIR = 'acc' constants.ACCOUNTS_DIR = 'acc'
constants.ACCOUNT_KEYS_DIR = 'keys' constants.ACCOUNT_KEYS_DIR = 'keys'
constants.BACKUP_DIR = 'backups'
constants.CERT_DIR = 'certs'
constants.CERT_KEY_BACKUP_DIR = 'c/'
constants.IN_PROGRESS_DIR = '../p'
constants.KEY_DIR = 'keys'
constants.REC_TOKEN_DIR = '/r'
constants.RENEWER_CONFIG_FILENAME = 'r.conf'
constants.TEMP_CHECKPOINT_DIR = 't'
self.assertEqual(self.config.temp_checkpoint_dir, '/tmp/foo/t')
self.assertEqual(self.config.in_progress_dir, '/tmp/foo/../p')
self.assertEqual(
self.config.cert_key_backup, '/tmp/foo/c/acme-server.org:443/new')
self.assertEqual(self.config.rec_token_dir, '/r')
self.assertEqual( self.assertEqual(
self.config.accounts_dir, '/tmp/config/acc/acme-server.org:443/new') self.config.accounts_dir, '/tmp/config/acc/acme-server.org:443/new')
self.assertEqual( self.assertEqual(
self.config.account_keys_dir, self.config.account_keys_dir,
'/tmp/config/acc/acme-server.org:443/new/keys') '/tmp/config/acc/acme-server.org:443/new/keys')
self.assertEqual(self.config.backup_dir, '/tmp/foo/backups')
self.assertEqual(self.config.cert_dir, '/tmp/config/certs')
self.assertEqual(
self.config.cert_key_backup, '/tmp/foo/c/acme-server.org:443/new')
self.assertEqual(self.config.in_progress_dir, '/tmp/foo/../p')
self.assertEqual(self.config.key_dir, '/tmp/config/keys')
self.assertEqual(self.config.rec_token_dir, '/r')
self.assertEqual(self.config.renewer_config_file, '/tmp/config/r.conf')
self.assertEqual(self.config.temp_checkpoint_dir, '/tmp/foo/t')
if __name__ == '__main__': if __name__ == '__main__':
-3
View File
@@ -76,10 +76,7 @@ def get_apache_configurator(
apache_server_root=config_path, apache_server_root=config_path,
apache_mod_ssl_conf=ssl_options, apache_mod_ssl_conf=ssl_options,
apache_le_vhost_ext=constants.CLI_DEFAULTS["le_vhost_ext"], apache_le_vhost_ext=constants.CLI_DEFAULTS["le_vhost_ext"],
backup_dir=backups,
config_dir=config_dir, config_dir=config_dir,
temp_checkpoint_dir=os.path.join(work_dir, "temp_checkpoints"),
in_progress_dir=os.path.join(backups, "IN_PROGRESS"),
work_dir=work_dir), work_dir=work_dir),
name="apache", name="apache",
version=version) version=version)
+1 -3
View File
@@ -46,9 +46,7 @@ def get_nginx_configurator(
config = configurator.NginxConfigurator( config = configurator.NginxConfigurator(
config=mock.MagicMock( config=mock.MagicMock(
nginx_server_root=config_path, nginx_mod_ssl_conf=ssl_options, nginx_server_root=config_path, nginx_mod_ssl_conf=ssl_options,
backup_dir=backups, config_dir=config_dir, work_dir=work_dir, config_dir=config_dir, work_dir=work_dir),
temp_checkpoint_dir=os.path.join(work_dir, "temp_checkpoints"),
in_progress_dir=os.path.join(backups, "IN_PROGRESS")),
name="nginx", name="nginx",
version=version) version=version)
config.prepare() config.prepare()