# HG changeset patch # User Dennis Fink # Date 2015-10-14 21:58:40 # Node ID e38a51c033d702b02cbb6d72caef67728547e352 # Parent 9bc395e8631ec87d0dc93d6b5b2c1c8241a077bd Added config cli diff --git a/ennstatus/cli/__init__.py b/ennstatus/cli/__init__.py new file mode 100644 --- /dev/null +++ b/ennstatus/cli/__init__.py @@ -0,0 +1,19 @@ +import pathlib + +import click + + +@click.group() +@click.option('-p', '--path', default='/srv/http/enn.lu', + help='Path where the config files are') +@click.pass_context +def cli(ctx, path): + ctx.obj = {} + path = pathlib.Path(path) + ctx.obj['path'] = path + ctx.obj['config_file'] = path / 'config.json' + ctx.obj['data_dir'] = path / 'data' + + +if __name__ == '__main__': + cli() diff --git a/ennstatus/cli/commands/config.py b/ennstatus/cli/commands/config.py new file mode 100644 --- /dev/null +++ b/ennstatus/cli/commands/config.py @@ -0,0 +1,82 @@ +import os +import json +import ipaddress + +from pprint import pprint + +import click + +from ... import create_app +from ...utils import check_ip + + +@click.group(short_help='Configure ennstatus') +def config(): + pass + + +@config.command('show', short_help='Show current configuration') +@click.pass_obj +def show(obj): + + try: + os.chdir(str(obj['path'])) + except FileNotFoundError: + raise + + app = create_app() + pprint(app.config) + + +@config.group(short_help='Configure servers') +def server(): + pass + + +@server.command('add', short_help='Add server') +@click.argument('name', prompt=True) +@click.option('-i', '--ips', prompt='IPs (comma separated)') +@click.password_option() +@click.pass_obj +def add(obj, name, ips, password): + + config = json.load(obj['config_file']) + name = name.lower() + ips = [ip.strip() for ip in ips.split(',')] + + if name in config['ENNSTATUS_SERVERS']: + try: + click.confirm('Server already exits! Overwrite?', abort=True) + except click.Abort as e: + raise SystemExit from e + + converted_ips = {ipaddress.ip_address(ip) for ip in ips} + + for ip in converted_ips: + if not check_ip(ip): + raise SystemExit('ip {} is not accepted!'.format(str(ip))) + + config['ENNSTATUS_SERVERS'][name] = { + 'IPS': ips, + 'PASSWORD': password + } + + with open(obj['config_file'], mode='w', encoding='utf-8') as f: + json.dump(config, f, indent=4, sort_keys=True) + + +@server.command('delete', short_help='Remove server') +@click.argument('name', prompt=True) +@click.pass_obj +def delete(obj, name): + + config = json.load(obj['config_file']) + name = name.lower() + + try: + del config['ENNSTATUS_SERVERS'][name] + except KeyError: + raise SystemExit('{} does not exists!'.format(name)) + + with open(obj['config_file'], mode='w', encoding='utf-8') as f: + json.dump(config, f, indent=4, sort_keys=True)