Skip to content
Snippets Groups Projects
zephir-client 5.05 KiB
Newer Older
#!/usr/bin/env python3
"""Zephir-cmd-input script
"""
Lionel Morin's avatar
Lionel Morin committed
import yaml
Matthieu Lamalle's avatar
Matthieu Lamalle committed
import sys
Bruno Boiget's avatar
Bruno Boiget committed
from json import dumps
from pathlib import Path
Bruno Boiget's avatar
Bruno Boiget committed
from zephir_client import remote_json_to_config, cmdline_factory, send, remove_token, list_messages, describe_messages, authenticate, ZcliConfig
Bruno Boiget's avatar
Bruno Boiget committed
# get calling script base name
progname = Path(sys.argv[0]).parts[-1]
Matthieu Lamalle's avatar
Matthieu Lamalle committed

Bruno Boiget's avatar
Bruno Boiget committed
def main():
Bruno Boiget's avatar
Bruno Boiget committed
    zcliconf = ZcliConfig()
Bruno Boiget's avatar
Bruno Boiget committed
    URL = zcliconf.url
    VERSION = zcliconf.version
    OUTPUT = 'yaml'
    list_msgs = 0
    prettyjson = 2
gwenael remond's avatar
gwenael remond committed
    no_msg = False
Bruno Boiget's avatar
Bruno Boiget committed

    if '--json' in sys.argv:
Matthieu Lamalle's avatar
Matthieu Lamalle committed
        OUTPUT = 'json'
Bruno Boiget's avatar
Bruno Boiget committed
        sys.argv.remove('--json')
gwenael remond's avatar
gwenael remond committed
    
    if '--batch' in sys.argv:
        no_msg = True
        sys.argv.remove('--batch')

    if '--no-pretty' in sys.argv:
        prettyjson = None
        sys.argv.remove('--no-pretty')

Bruno Boiget's avatar
Bruno Boiget committed
    if len(sys.argv) == 1:
        help()
    if '-h' ==  sys.argv[1] or '--help' ==  sys.argv[1]:
        if len(sys.argv) == 2 :
            help()
Matthieu Lamalle's avatar
Matthieu Lamalle committed

Bruno Boiget's avatar
Bruno Boiget committed
    if 'logout' in sys.argv:
        if '-h' in  sys.argv or '--help' in  sys.argv:
            help()
Matthieu Lamalle's avatar
Matthieu Lamalle committed
        remove_token()
Bruno Boiget's avatar
Bruno Boiget committed
        sys.argv.remove('logout')
        print("Jeton d'authentification supprimé")
        sys.exit(0)

    if 'login' in sys.argv:
        if '-h' in  sys.argv or '--help' in  sys.argv:
            help()
        remove_token()
        user = None
        if len(sys.argv) > 2 :
            user = sys.argv[2]
        authenticate(URL, user)
        sys.exit(0)

    if 'list' in sys.argv:
        if '-h' in  sys.argv or '--help' in  sys.argv:
            help()
        list_msgs = 1
Bruno Boiget's avatar
Bruno Boiget committed
        start = None
        if len(sys.argv) > 2 :
            start = sys.argv[2]
            sys.argv.remove(start)
        sys.argv.remove('list')

    if 'describe' in sys.argv:
        if '-h' in  sys.argv or '--help' in  sys.argv:
            help()
        list_msgs = 2
        start = None
        if len(sys.argv) > 2 :
            start = sys.argv[2]
            sys.argv.remove(start)
        sys.argv.remove('describe')

Bruno Boiget's avatar
Bruno Boiget committed
    try:
        remote_config = remote_json_to_config(URL, VERSION)
    except:
        print(f"Erreur d'accès à l'API Zéphir ({URL})")
        sys.exit(1)
Bruno Boiget's avatar
Bruno Boiget committed
    config = cmdline_factory(remote_config)

    if list_msgs:
        if list_msgs == 1:
            messages = list_messages(config, start)
        elif list_msgs == 2:
            messages = describe_messages(config, start)
Bruno Boiget's avatar
Bruno Boiget committed
        if not messages:
            print("Aucun résultat.")
        elif OUTPUT == "yaml":
            print("\n")
            for msg in messages:
                print(msg)
            print("\n")
            print(dumps(messages, indent=prettyjson ))
Bruno Boiget's avatar
Bruno Boiget committed
        sys.exit(0)

    # special case: no message name given
    if 'message' in config.value.mandatory():
        print(f"""\nNom de commande manquant. Vous devez spécifier une commande à exécuter.
Utiliser <{progname} list> pour lister les commandes disponibles.\n""")
        sys.exit(0)
    # ask for missing parameters
gwenael remond's avatar
gwenael remond committed
    if not no_msg: 
        for key in config.value.mandatory():
            if not config.option(key).option.issymlinkoption():
                val_ok = False
                while not val_ok:
                    text = input("* "+config.option(key).option.doc() + " : ")
                    try:
                        if config.option(key).option.type() == 'integer':
                            config.option(key).value.set(int(text))
                        else:
                            config.option(key).value.set(text)
                        val_ok = True
                    except Exception as err:
                        print('\nValeur invalide: {}\n'.format(err))
        result = send(URL, VERSION, config)
    else:
        result = send(URL, VERSION, config)
        if "Erreur" in result:
            print("ERREUR: paramètres requis manquants.")
            print("Les paramètres nécessaires sont :" + ", ".join((key for key in config.value.mandatory() if not config.option(key).option.issymlinkoption())))
            sys.exit(1)
    
Bruno Boiget's avatar
Bruno Boiget committed
    if OUTPUT == "yaml":
Bruno Boiget's avatar
Bruno Boiget committed
        print(yaml.dump(result, default_flow_style=False, allow_unicode=True))
Bruno Boiget's avatar
Bruno Boiget committed
    else:
        print(dumps(result, indent=prettyjson ))
Bruno Boiget's avatar
Bruno Boiget committed


def help():
    print(f"""
Client pour interroger un serveur Zéphir.

{progname} login [utilisateur]
    Génère un token d'authentification.

{progname} logout
    Supprime le token d'authentification.

{progname} list [recherche]
Bruno Boiget's avatar
Bruno Boiget committed
    Liste les messages disponibles commençant par <recherche>.
{progname} describe [recherche]
Bruno Boiget's avatar
Bruno Boiget committed
    Décrit les messages disponibles commençant par <recherche>.
Bruno Boiget's avatar
Bruno Boiget committed
{progname} <message> [paramètres]
    Exécute le message avec ses paramètres.

{progname} -h <message>
    Affiche l'aide d'un message.

{progname} --json [--no-pretty] <message>
    Affiche le résultat au format json
        --no-pretty
            Affiche le résultat json brut

gwenael remond's avatar
gwenael remond committed
{progname} --batch <message> [paramètres]
    Execute le message avec ses paramètres, en mode batch


Bruno Boiget's avatar
Bruno Boiget committed
""")
    sys.exit(0)


if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("\n  Sortie utilisateur...")
        sys.exit(0)