Newer
Older
#!/usr/bin/env python
#coding=utf8
'''
'''
import os, os.path
import sys
from cccli.printer import Printer, color
from cccli.command import Command, Alias
from sjrpc.client import SimpleRpcClient
# start printer
self.printer = Printer()
if sys.stderr.isatty() and sys.stdin.isatty():
self.printer.debug("Interactive mode")
self.prompt = "%s%s%s%s>%s%s%s "%(color["["],
color["light"],
color["]"],
self.settings["login"],
color["["],
color["reset"],
color["]"])
self.printer.set_interactive()
# load history
self.printer.history.load(self.settings.get("history", ""))
self.printer.history.maxsize(self.settings.get("hsize", None))
self.printer.debug("Loaded history: %s"%len(self.printer.history))
# enable completion
self.printer.completion.set_completer(self._completer)
# set prompt
# load alias
self.alias.load(self.settings.get("alias", ""))
self.printer.debug("Alias: %s"%self.alias)
# connecting
self._connect()
# auth
self._auth()
self.printer.history.write(self.settings.get("history", ""))
'''Connect to a cloud control server'''
self.rpc = SimpleRpcClient.from_addr(self.settings["server"],
self.settings["port"],
enable_ssl=True,
default_handler=CliHandler(),
on_disconnect="quit",
timeout=self.settings["timeout"]
except Exception as e:
s = "Connection failure!" if not str(e) else "Connection failure: %s"%str(e)
raise cliError(s)
self.rpc.call("authentify", self.settings["login"], self.settings["pass"])
except Exception as e:
s = "Authentication failure!" if not str(e) else "Authentication failure: %s"%str(e)
raise cliError(s)
argv = shlex.split(self.printer.getline(self.prompt), comments=True)
except ValueError as e:
self.printer.error("Lexer: %s"%str(e))
continue
if len(argv) == 0:
continue
# alias subsitution
if argv[0] in self.alias:
oldargv = argv[1:]
argv = shlex.split(self.alias[argv[0]])
argv.extend(oldargv)
self._exec_command(argv)
except KeyboardInterrupt:
self.printer.out("")
continue
except EOFError:
break
except SystemExit:
break
if (argv[0][0] == "!"):
argv[0] = argv[0][1:]
if not len(argv[0]):
return
p = subprocess.Popen(argv, close_fds=True, shell=True)
except cmdBadName:
self.printer.error("No command: %s."%argv[0])
except cmdWarning as e:
self.printer.warn("%s: %s"%(argv[0], str(e)))
except cmdError as e:
self.printer.error("%s: %s"%(argv[0], str(e)))
self.printer.error("%s: %s"%(type(e), str(e)))
self.printer.warn("This is a not expected error, please report it!")
def _completer(self, texte, state):
'''Return the list of completion'''
comp = self.printer.completion
stripped = comp.get_buf()[:comp.get_begin() + 1].lstrip()
if state == 0 and texte == "" and stripped != "":
return None
cl = [ c for c in Command.list() if c.startswith(texte) ]
if state < len(cl):
return cl[state]
return None
class CliHandler(RpcHandler):
'''Handle RPC incoming request'''
@pure
def get_tags(self, tags=()):
if "version" in tags:
@pure
def quit(self, rpc=None):
Printer().fatal("Disconnected from server!")