Move config dir init logic to config.init

This commit is contained in:
Tim Van Baak 2020-01-17 14:01:52 -08:00
parent d60340e9e9
commit 34d3a08416
2 changed files with 69 additions and 50 deletions

View File

@ -9,57 +9,9 @@ def command_init(args):
pidfile, a lexicon config directory, and a user config pidfile, a lexicon config directory, and a user config
directory. directory.
""" """
from collections import OrderedDict import config.init
import fcntl
import json
import os
import resources config.init.create_config_dir(args.config_dir, args.update)
cfd = args.config_dir
# Create the directory if it doesn't exist.
if not os.path.isdir(cfd):
os.mkdir(cfd)
# The directory should be empty if we're not updating an existing one.
if len(os.listdir(cfd)) > 0 and not args.update:
print("Directory {} is not empty".format(cfd))
return -1
# Update or create global config.
def_cfg = resources.get_stream("global.json")
if args.update and os.path.isfile(os.path.join(cfd, "config.json")):
with open(os.path.join(cfd, "config.json"), 'r+', encoding='utf8') as cfg_file:
fcntl.lockf(cfg_file, fcntl.LOCK_EX)
old_cfg = json.load(cfg_file, object_pairs_hook=OrderedDict)
new_cfg = json.load(def_cfg, object_pairs_hook=OrderedDict)
merged = {}
for key in new_cfg:
merged[key] = old_cfg[key] if key in old_cfg else new_cfg[key]
if key not in old_cfg:
print("Added key '{}' to config".format(key))
for key in old_cfg:
if key not in new_cfg:
print("Config contains unknown key '{}'".format(key))
merged[key] = old_cfg[key]
cfg_file.seek(0)
json.dump(merged, cfg_file, allow_nan=False, indent='\t')
cfg_file.truncate()
fcntl.lockf(cfg_file, fcntl.LOCK_UN)
else:
with open(os.path.join(cfd, "config.json"), 'wb') as f:
f.write(def_cfg.read())
# Ensure pidfile exists.
if not os.path.isfile(os.path.join(cfd, "pid")):
with open(os.path.join(cfd, "pid"), 'w') as f:
f.write(str(os.getpid()))
# Ensure subdirs exist.
if not os.path.isdir(os.path.join(cfd, "lexicon")):
os.mkdir(os.path.join(cfd, "lexicon"))
if not os.path.isdir(os.path.join(cfd, "user")):
os.mkdir(os.path.join(cfd, "user"))
if not os.path.isfile(os.path.join(cfd, 'user', 'index.json')):
with open(os.path.join(cfd, 'user', 'index.json'), 'w') as f:
json.dump({}, f)
@no_argument @no_argument
def command_generate_secret(args): def command_generate_secret(args):

View File

@ -6,9 +6,76 @@ import os
# Module imports # Module imports
from errors import MissingConfigError, MalformedConfigError from errors import MissingConfigError, MalformedConfigError
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):
"""
Create or update a config directory
"""
from collections import OrderedDict
import fcntl
path = config.prepend
# Create the directory if it doesn't exist.
if not os.path.isdir(config_dir):
os.mkdir(config_dir)
# Initialize the config dir without verification
config.CONFIG_DIR = config_dir
# The directory should be empty if we're not updating an existing one.
if len(os.listdir(config_dir)) > 0 and not update:
print("Directory {} is not empty".format(config_dir))
return -1
# Update or create global config.
def_cfg = resources.get_stream("global.json")
global_config_path = path("config.json")
if update and os.path.isfile(global_config_path):
# We need to write an entirely different ordereddict to the config
# file, so we mimic the config.loader functionality manually.
with open(global_config_path, 'r+', encoding='utf8') as cfg_file:
fcntl.lockf(cfg_file, fcntl.LOCK_EX)
old_cfg = json.load(cfg_file, object_pairs_hook=OrderedDict)
new_cfg = json.load(def_cfg, object_pairs_hook=OrderedDict)
merged = {}
for key in new_cfg:
merged[key] = old_cfg[key] if key in old_cfg else new_cfg[key]
if key not in old_cfg:
print("Added key '{}' to config".format(key))
for key in old_cfg:
if key not in new_cfg:
print("Config contains unknown key '{}'".format(key))
merged[key] = old_cfg[key]
cfg_file.seek(0)
json.dump(merged, cfg_file, allow_nan=False, indent='\t')
cfg_file.truncate()
fcntl.lockf(cfg_file, fcntl.LOCK_UN)
else:
with open(path("config.json"), 'wb') as f:
f.write(def_cfg.read())
# Ensure pidfile exists.
if not os.path.isfile(path("pid")):
with open(path("pid"), 'w') as f:
f.write(str(os.getpid()))
# Ensure lexicon subdir exists.
if not os.path.isdir(path("lexicon")):
os.mkdir(path("lexicon"))
if not os.path.isfile(path("lexicon", "index.json")):
with open(path("lexicon", "index.json"), 'w') as f:
json.dump({}, f)
# Ensure user subdir exists.
if not os.path.isdir(path("user")):
os.mkdir(path("user"))
if not os.path.isfile(path('user', 'index.json')):
with open(path('user', 'index.json'), 'w') as f:
json.dump({}, f)
def verify_config_dir(config_dir): def verify_config_dir(config_dir):
""" """