Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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
#!/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'''
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)