Newer
Older
#!/usr/bin/env python
#coding=utf8
'''
CloudControl CLI Parser
'''
import sys
import os, os.path
class Parser(object):
def __init__(self, options, alias):
self.interactive = sys.stderr.isatty() and sys.stdin.isatty()
# if os.environ.has_key("ITPASS_HISTFILE"):
# self.histfile = os.environ["ITPASS_HISTFILE"]
# else:
# self.histfile = "%s/.history"%os.environ["ITPASS_ROOT"]
# if os.environ.has_key("ITPASS_HISTSIZE"):
# self.histsize = int(os.environ["ITPASS_HISTSIZE"])
# else:
# self.histsize = 500
# if self.interactive:
# try:
# readline.read_history_file(self.histfile)
# except IOError:
# pass
# readline.set_history_length(self.histsize)
# readline.parse_and_bind("tab: complete")
# readline.set_completer_delims(string.whitespace)
# readline.set_completer(Completer().syntax_completion)
def _prompt(self):
'''Show a parser prompt'''
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
bang = "#" if Keyring().has_unlocked_key() else "$"
try:
cwd = re.sub(self.rootpath, '~', os.getcwd())
except:
cwd = "?"
return "%s:%s %s "%(os.path.basename(sys.argv[0]), cwd, bang)
def _interactive_parser(self):
'''Interactive shell parser'''
while True:
try:
line = raw_input(self._prompt())
Keyring().check_timeout()
ret = self._parser(line)
if ret != 0:
warn("function return %s, not 0"%ret)
except EOFError:
out("")
break
except SystemExit:
break
except KeyboardInterrupt:
out("")
except myError, e:
error(str(e))
except Exception, e:
error(e)
if os.environ.has_key("ITPASS_DEBUG"):
raise
else:
warn("this is a not expected error, please report it")
try:
readline.write_history_file(self.histfile)
except IOError:
pass
out("Tcho!")
def _parser(self, string):
'''Parse a string'''
cmd_list = [ x.strip() for x in Parser.split(string, ";|\n", show_quote=True) ]
ret = 0
for cmd in cmd_list:
if (cmd == "" 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("help").call()
ret = 0
else:
Command(cmd).call()
ret = 0
return ret
def parse(self, command = ""):
'''Parser start'''
if command == "":
if self.interactive:
return self._interactive_parser()
else:
fatal("Not a TTY. Unable to start interactive parser")
else:
self._parser(command)