db757edcd2
Allows us to have a new config provider for each setup, with no overlap of the directories used, and automatic cleanup of those directories.
77 lines
2.3 KiB
Python
77 lines
2.3 KiB
Python
import os
|
|
import tempfile
|
|
import tarfile
|
|
|
|
from flask import request, make_response, send_file
|
|
|
|
from data.database import configure
|
|
from util.config.validator import EXTRA_CA_DIRECTORY
|
|
|
|
from config_app.c_app import app, config_provider
|
|
from config_app.config_endpoints.api import resource, ApiResource, nickname
|
|
|
|
@resource('/v1/configapp/initialization')
|
|
class ConfigInitialization(ApiResource):
|
|
"""
|
|
Resource for dealing with any initialization logic for the config app
|
|
"""
|
|
|
|
@nickname('scStartNewConfig')
|
|
def get(self):
|
|
config_provider.new_config_dir()
|
|
|
|
return make_response('OK')
|
|
|
|
|
|
@resource('/v1/configapp/tarconfig')
|
|
class TarConfigLoader(ApiResource):
|
|
"""
|
|
Resource for dealing with configuration as a tarball,
|
|
including loading and generating functions
|
|
"""
|
|
|
|
@nickname('scGetConfigTarball')
|
|
def get(self):
|
|
config_path = config_provider.get_config_dir_path()
|
|
|
|
# remove the initial trailing / from the prefix path, and add the last dir one
|
|
tar_dir_prefix = config_path[1:] + '/'
|
|
|
|
def tarinfo_filter(tarinfo):
|
|
# remove leading directory info
|
|
tarinfo.name = tarinfo.name.replace(tar_dir_prefix, '')
|
|
|
|
# ignore any directory that isn't the specified extra ca one:
|
|
if tarinfo.isdir() and not tarinfo.name == EXTRA_CA_DIRECTORY:
|
|
return None
|
|
|
|
return tarinfo
|
|
|
|
temp = tempfile.NamedTemporaryFile()
|
|
|
|
tar = tarfile.open(temp.name, mode="w|gz")
|
|
|
|
for name in os.listdir(config_path):
|
|
tar.add(os.path.join(config_path, name), filter=tarinfo_filter)
|
|
|
|
tar.close()
|
|
|
|
return send_file(temp.name, mimetype='application/gzip')
|
|
|
|
@nickname('scUploadTarballConfig')
|
|
def put(self):
|
|
""" Loads tarball config into the config provider """
|
|
# Generate a new empty dir to load the config into
|
|
config_provider.new_config_dir()
|
|
|
|
input_stream = request.stream
|
|
with tarfile.open(mode="r|gz", fileobj=input_stream) as tar_stream:
|
|
tar_stream.extractall(config_provider.get_config_dir_path())
|
|
|
|
# now try to connect to the db provided in their config to validate it works
|
|
combined = dict(**app.config)
|
|
combined.update(config_provider.get_config())
|
|
|
|
configure(combined)
|
|
|
|
return make_response('OK')
|