added command line client
[sfa.git] / cmdline / genicli.py
1 # command line interface
2
3 import getopt
4 import sys
5 from clientstub import *
6
7 long_opts = ["username=", "usertype=", "help", "outfile=", "credfile="]
8
9 # default command line options
10 username = "planetlab.scott.pl.smbaker"
11 usertype = "user"
12 opname = "lookup"
13 type = None
14 hrn = None
15 cred_name = None
16 id_file = None
17 key_file = None
18 acc_file = None
19 cred_file = None
20 leaf_name = None
21 server_host = "127.0.0.1"
22 server_port = 8002
23 out_file = None
24
25 def showhelp():
26    print "syntax: cli <options> command <args>"
27    print "options:"
28    print "    --username       ... hrn of user performing op"
29    print "    --usertype       ... kind of user performing op (user, slice, ...)"
30    print "    --outfile        ... write reply to file"
31    print "    --credfile       ... credential to pass"
32    print "commands:"
33    print "    lookup <type> <hrn>"
34    print "    dumpCredential"
35    print "    getCredential <cred_name>"
36    print "    start <hrn>"
37
38 def process_options():
39    global username, usertype, opname
40    global type, hrn, cred_name
41    global leaf_name
42    global id_file, cred_file
43    global acc_file, key_file, out_file
44
45    (options, args) = getopt.getopt(sys.argv[1:], '', long_opts)
46    for opt in options:
47        name = opt[0]
48        val = opt[1]
49
50        if name == "--username":
51            username = val
52        elif name == "--usertype":
53            usertype = val
54        elif name == "--help":
55            showhelp()
56            sys.exit(0)
57        elif name == "--outfile":
58            out_file = val
59        elif name == "--credfile":
60            cred_file = val
61
62    if not args:
63        report.error("no operation specified")
64        sys.exit(-1)
65
66    opname = args[0]
67
68    if opname == "lookup":
69        if len(args) < 3:
70            report.error("syntax: lookup <type> <hrn>")
71            sys.exit(-1)
72        type = args[1]
73        hrn = args[2]
74
75    elif opname == "getCredential":
76        if len(args) < 1:
77            report.error("syntax: getcredential <cred_name>")
78            sys.exit(-1)
79        cred_name = args[1]
80
81    elif opname == "start":
82        if len(args) < 1:
83            report.error("syntax: start <hrn>")
84            sys.exit(-1)
85        hrn = args[1]
86
87    if not leaf_name:
88        leaf_name = get_leaf(username)
89
90    if id_file == None:
91        id_file = leaf_name + ".cert"
92
93    if key_file == None:
94        key_file = leaf_name + ".pkey"
95
96    if acc_file == None:
97        acc_file = "acc_file"
98
99    if cred_file == None:
100        cred_file = "cred_file"
101
102 def show_options():
103    print " username:", username
104    print "     leaf:", leaf_name
105    print " usertype:", usertype
106    print "  id_file:", id_file
107    print " key_file:", key_file
108    print " acc_file:", acc_file
109    print "cred_file:", cred_file
110    print "operation:", opname
111    print "     type:", type
112    print "      hrn:", hrn
113    print "cred_name:", cred_name
114    print " out_file:", out_file
115
116 def get_authority(x):
117     parts = x.split(".")
118     return ".".join(parts[:3])
119
120 def compose_message():
121    g_params = {}
122    p_params = {}
123    dict = {"opname": opname}
124
125    if opname == "lookup":
126       g_params["hrn"] = hrn
127       g_params["type"] = type
128
129    elif opname == "getCredential":
130       g_params["cred_name"] = cred_name
131
132       parts = cred_name.split(":")
133       if len(parts) < 2:
134           report.error("bad format for getCredential (slice:hrn.of.slice, ...)")
135
136       # XXX smbaker: this looks redundant
137       if parts[0] == "slice":
138          g_params["hrn"] = get_authority(parts[1])
139          g_params["type"] = "slice"
140
141    elif opname == "start":
142       g_params["hrn"] = hrn
143       g_params["type"] = "slice"
144
145    dict["g_params"] = g_params
146    dict["p_params"] = p_params
147
148    return dict
149
150 def do_remote_op():
151    message = compose_message()
152
153    client = GENIClient(username, usertype, id_file, key_file, acc_file, cred_file)
154
155    server = client.connect(server_host, server_port)
156    if not server:
157        report.error("failed to connect to server")
158        sys.exit(-1)
159
160    report.trace("message:" + str(message))
161
162    server.write(str(message))
163
164    reply = server.read(MAX_RESULT)
165    if not reply:
166       report.error("No reply")
167       sys.exit(-1)
168
169    if out_file:
170       open(out_file, "w").write(reply)
171    else:
172       print "////// RESULT: //////"
173       print reply
174
175 def dumpCredential():
176     cred_str = open(cred_file).read()
177     c_pem = X509.load_cert_string(cred_str)
178     subjectAltName = c_pem.get_ext("subjectAltName").get_value()
179     info_cert = get_cred_info(subjectAltName)
180
181     print "subject:", c_pem.get_subject().CN
182     print "issuer:", c_pem.get_issuer().CN
183     print "cred_str:"
184     print " ", subjectAltName
185     print "rights:"
186     op_set = info_cert['operation_set']
187     for item in op_set.keys():
188        rights = op_set[item]
189        print " ", item, ", ".join(rights)
190
191     print "interfaces:"
192     interfaces = info_cert['on_interfaces']
193     for item in interfaces:
194        print " ", item['lbl'], item['type'], item['name']
195
196 def main():
197    process_options()
198    show_options()
199
200    if opname == "dumpCredential":
201       dumpCredential()
202       sys.exit(0)
203       
204    elif opname == "help":
205       showhelp()
206       sys.exit(0)
207
208    elif (opname == "lookup") or \
209         (opname == "getCredential") or \
210         (opname == "start"):
211       do_remote_op()
212
213    else:
214       report.error("unknown operation: " + opname)
215
216 if __name__=="__main__":
217    main()
218