Skip to content
Snippets Groups Projects
cli.py 3.34 KiB
Newer Older
#!/usr/bin/env python
#coding=utf8

'''
CloudControl CLI class
'''

import os, os.path
import sys
import socket
import ssl
import threading
Seblu's avatar
Seblu committed
import cccli
from cccli import printer, command
from cccli.clierror import *
from sjrpc.client import SimpleRpcClient
from sjrpc.utils import RpcHandler, pure, threadless, ConnectionProxy

Seblu's avatar
Seblu committed
import re
import readline
Seblu's avatar
Seblu committed
    def __init__(self, settings, alias, args):
        self._settings = settings
        self._alias = alias
Seblu's avatar
Seblu committed
        self._interactive = sys.stderr.isatty() and sys.stdin.isatty()
        self._prompt = "> "
        self._commands = args
        self._rpc = None
Seblu's avatar
Seblu committed
    def start(self):
        '''Start a CLI'''
        # Connecting
        self._connect()
        # authentifications
        self._auth()
        # run parsing args
        if len(self._commands) > 0:
            for c in self._commands:
                self._parse(c)
        elif self._interactive:
            self._interactive_parser()
        else:
            self._parser()
Seblu's avatar
Seblu committed
    def _connect(self):
        printer.debug("Connecting...")
        rpcc = SimpleRpcClient.from_addr(self._settings["server"],
                                        self._settings["port"],
                                        enable_ssl=True
                                        )
        # FIXME: wait sjrpc v5 with on_disconnect usable
        rpcc.start(daemonize=True)
        self._rpc = ConnectionProxy(rpcc)
Seblu's avatar
Seblu committed
    def _auth(self):
        printer.debug("Authenticating...")
        if self._rpc.authentify(self._settings["login"], self._settings["pass"]):
            printer.debug("Authenticated.")
        else:
            printer.fatal("Autentification failed!")

    def _interactive_parser(self):
        '''Interactive shell parser'''
        # init readline

        while True:
            try:
                line = raw_input(self._prompt)
                self._parse_line(line)
            except BadCommand, e:
                printer.error("No such command: %s"%e[0])
            except EOFError:
                printer.out("")
                break
            except SystemExit:
                break
            except KeyboardInterrupt:
                printer.out("")
            except Exception, e:
                printer.error(e)
                if cccli.debug:
                    raise
                else:
                    printer.error("This is a not expected error, please report it!")
        try:
            pass
            #readline.write_history_file(self._settings["histfile"])
        except IOError:
            pass
        printer.out("Tcho!")

    def _parser(self):
        '''Non interactive parser'''
        while True:
            line = raw_input(self._prompt)
            self._parse_line(line)

    def _parse_line(self, line):
        '''Parse a line (more than one command)'''
        for cmd in line.split(";"):
            if (cmd.strip() == "" or cmd[0] == "#"):
                continue
            elif (cmd[0] == "!"):
                p = subprocess.Popen(cmd[1:], close_fds=True, shell=True)
                p.wait()
                ret = p.returncode
            elif (cmd[0] == "?"):
                command.Command("help").call()
            else:
                argv = self._lex_argv(cmd)
                command.Command(argv, self._rpc).call()

    def _lex_argv(self, string):
        return string.split(" ")