import requests import json import argparse import binascii from pyotp import TOTP from os.path import join as join_path from uncloud.common.shared import shared def get_otp_parser(): otp_parser = argparse.ArgumentParser('otp') otp_parser.add_argument('--name') otp_parser.add_argument('--realm') otp_parser.add_argument('--seed', type=get_token, dest='token', metavar='SEED') return otp_parser 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): try: r = request_method(join_path(shared.settings['client']['api_server'], *args), json=data) except requests.exceptions.RequestException: print('Error occurred while connecting to API server.') else: try: print(load_dump_pretty(r.content)) except Exception: print('Error occurred while getting output from api server.') def get_token(seed): if seed is not None: try: token = TOTP(seed).now() except binascii.Error: raise argparse.ArgumentTypeError('Invalid seed') else: return token