import json import binascii import click import requests from os.path import join as join_path from pyotp import TOTP from uncloud_cli.config import config, config_file def load_dump_pretty(content): if isinstance(content, bytes): content = content.decode("utf-8") parsed = json.loads(content) return json.dumps(parsed, indent=4, sort_keys=True) def make_request(*args, data=None, request_method=requests.post): r = request_method( join_path(config['client']['api_server'], *args), json=data ) print(load_dump_pretty(r.content)) def get_token(ctx, param, value): if value is not None: try: token = TOTP(value).now() except binascii.Error: raise click.BadParameter('Please enter the correct seed in {}'.format(config_file)) else: param.name = 'token' return token def add_otp_options(f): options = [ click.option( "--name", required=True, default=config['client']['name'], show_default='name mentioned in {}'.format(config_file) ), click.option( "--realm", required=True, default=config['client']['realm'], show_default='realm mentioned in {}'.format(config_file) ), click.option( "--seed", required=True, default=config['client']['seed'], callback=get_token, show_default='seed mentioned in {}'.format(config_file) ) ] for opt in reversed(options): f = opt(f) return f def add_vm_options(f): options = [ click.option('--vm-name', required=True), click.option('--action', required=True, default=f.__name__) ] for opt in reversed(options): f = opt(f) return f