Newer
Older
#!/usr/bin/env python
#coding=utf8
'''
'''
import os, os.path
import sys
from sjrpc.client import SimpleRpcClient
from sjrpc.utils import RpcHandler, ConnectionProxy, pure
sys.stdin = StringIO.StringIO(line)
# set interactive mode
self.interactive = sys.stderr.isatty() and sys.stdin.isatty()
self.printer = Printer(self.interactive,
self.settings.get("forceyes", False),
historyfile=self.settings.get("history", ""),
historysize=self.settings.get("hsize", None))
# load alias
self.alias.load(self.settings.get("alias", ""))
# print debug
self.printer.debug("Interactive: %s"%self.interactive)
self.printer.debug("Loaded history: %s"%len(self.printer.history))
self.printer.history.save(self.settings.get("history", ""))
'''Connect to a cloud control server'''
try:
rpcc = SimpleRpcClient.from_addr(self.settings["server"],
self.settings["port"],
enable_ssl=True,
default_handler=CliHandler(),
on_disconnect="quit",
timeout=self.settings["timeout"]
rpcc.start(daemonize=True)
self.rpc = ConnectionProxy(rpcc)
except Exception:
raise cliError("Connection failure!")
self.printer.debug("Connected.")
try:
self.rpc.authentify(self.settings["login"], self.settings["pass"])
except Exception:
raise cliError("Autentification failed!")
self.printer.debug("Authenticated.")
prompt = "\001%s\002%s>\001%s\002 "%(color["light"],self.settings["login"],color["reset"])
try:
argv = shlex.split(self.printer.getline(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
def _exec_command(self, argv):
'''Execute command'''
try:
if (argv[0] == "!"):
p = subprocess.Popen(argv[1:], 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)))
if cccli.debug:
raise
self.printer.error(str(e))
self.printer.warn("This is a not expected error, please report it!")
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!")