Make init --refresh clean up indexes

This commit is contained in:
Tim Van Baak 2020-01-18 17:13:36 -08:00
parent 8e99788fcd
commit f79e5bfd87
2 changed files with 54 additions and 9 deletions

View File

@ -1,6 +1,12 @@
from cli.helpers import add_argument, no_argument, config_get, config_set, CONFIG_GET_ROOT_VALUE import os
@add_argument("--update", action="store_true", help="Refresh an existing config directory") from cli.helpers import (
add_argument, no_argument,
config_get, config_set, CONFIG_GET_ROOT_VALUE)
@add_argument(
"--refresh", action="store_true",
help="Refresh an existing config directory")
def command_init(args): def command_init(args):
""" """
Initialize a config directory at --config-dir Initialize a config directory at --config-dir
@ -8,10 +14,21 @@ def command_init(args):
A clean config directory will contain a config.json, a A clean config directory will contain a config.json, a
pidfile, a lexicon config directory, and a user config pidfile, a lexicon config directory, and a user config
directory. directory.
"""
import config.init
config.init.create_config_dir(args.config_dir, args.update) Refreshing an existing directory will add keys to the global config that
are present in the default configs. Users and lexicons that are missing
from the indexes will be deleted, and stale index entries will be removed.
"""
# Module imports
from config.init import create_config_dir
# Verify arguments
if args.refresh and not os.path.isdir(args.config_dir):
print("Error: couldn't find directory '{}'".format(args.config_dir))
# Internal call
create_config_dir(args.config_dir, args.refresh)
@no_argument @no_argument
def command_generate_secret(args): def command_generate_secret(args):
@ -30,6 +47,7 @@ def command_generate_secret(args):
cfg['secret_key'] = secret_key.hex() cfg['secret_key'] = secret_key.hex()
config.logger.info("Regenerated Flask secret key") config.logger.info("Regenerated Flask secret key")
@add_argument("-a", "--address", default="127.0.0.1") @add_argument("-a", "--address", default="127.0.0.1")
@add_argument("-p", "--port", default="5000") @add_argument("-p", "--port", default="5000")
def command_run(args): def command_run(args):
@ -47,6 +65,7 @@ def command_run(args):
return -1 return -1
server.app.run(host=args.address, port=args.port) server.app.run(host=args.address, port=args.port)
@add_argument("--get", metavar="PATHSPEC", dest="get", @add_argument("--get", metavar="PATHSPEC", dest="get",
nargs="?", const=CONFIG_GET_ROOT_VALUE, help="Get the value of a config key") nargs="?", const=CONFIG_GET_ROOT_VALUE, help="Get the value of a config key")
@add_argument("--set", metavar=("PATHSPEC", "VALUE"), dest="set", @add_argument("--set", metavar=("PATHSPEC", "VALUE"), dest="set",

View File

@ -3,6 +3,7 @@ import copy
import json import json
import logging.config import logging.config
import os import os
import shutil
# Module imports # Module imports
from errors import MissingConfigError, MalformedConfigError from errors import MissingConfigError, MalformedConfigError
@ -10,9 +11,9 @@ import config
from config.loader import json_ro from config.loader import json_ro
import resources import resources
def create_config_dir(config_dir, update=False): def create_config_dir(config_dir, refresh=False):
""" """
Create or update a config directory Create or refresh a config directory
""" """
from collections import OrderedDict from collections import OrderedDict
import fcntl import fcntl
@ -27,14 +28,14 @@ def create_config_dir(config_dir, update=False):
config.CONFIG_DIR = config_dir config.CONFIG_DIR = config_dir
# The directory should be empty if we're not updating an existing one. # The directory should be empty if we're not updating an existing one.
if len(os.listdir(config_dir)) > 0 and not update: if len(os.listdir(config_dir)) > 0 and not refresh:
print("Directory {} is not empty".format(config_dir)) print("Directory {} is not empty".format(config_dir))
return -1 return -1
# Update or create global config. # Update or create global config.
def_cfg = resources.get_stream("global.json") def_cfg = resources.get_stream("global.json")
global_config_path = path("config.json") global_config_path = path("config.json")
if update and os.path.isfile(global_config_path): if refresh and os.path.isfile(global_config_path):
# We need to write an entirely different ordereddict to the config # We need to write an entirely different ordereddict to the config
# file, so we mimic the config.loader functionality manually. # file, so we mimic the config.loader functionality manually.
with open(global_config_path, 'r+', encoding='utf8') as cfg_file: with open(global_config_path, 'r+', encoding='utf8') as cfg_file:
@ -77,6 +78,30 @@ def create_config_dir(config_dir, update=False):
with open(path('user', 'index.json'), 'w') as f: with open(path('user', 'index.json'), 'w') as f:
json.dump({}, f) json.dump({}, f)
if refresh:
for dir_name in ('lexicon', 'user'):
# Clean up unindexed folders
with config.json_ro(dir_name, 'index.json') as index:
known = list(index.values())
entries = os.listdir(path(dir_name))
for dir_entry in entries:
if dir_entry == "index.json":
continue
if dir_entry in known:
continue
print("Removing unindexed folder: '{}/{}'"
.format(dir_name, dir_entry))
shutil.rmtree(path(dir_name, dir_entry))
# Remove orphaned index listings
with config.json_rw(dir_name, 'index.json') as index:
for name, entry in index.items():
if not os.path.isdir(path(dir_name, entry)):
print("Removing stale {} index entry '{}: {}'"
.format(dir_name, name, entry))
del index[name]
def verify_config_dir(config_dir): def verify_config_dir(config_dir):
""" """
Verifies that the given directory has a valid global config in it and Verifies that the given directory has a valid global config in it and
@ -99,6 +124,7 @@ def verify_config_dir(config_dir):
# Configs verified # Configs verified
return True return True
def init_logging(args, logging_config): def init_logging(args, logging_config):
""" """
Initializes logging by using the logging section of the global config Initializes logging by using the logging section of the global config