1 # command line interface
7 from geniclient import *
8 from geniticket import *
10 long_opts = ["keyfile=", "help", "outfile=", "credfile=", "ticketfile=",
11 "username=", "email=", "ip=", "dns=", "dump_parents", "server=",
14 # default command line options
38 server_url = "https://localhost:12345/"
41 parts = hrn.split(".")
\r
45 print "syntax: cli <options> command <args>"
47 print " --username ... username (or hrn) of user making call"
48 print " --outfile ... save response to a file"
49 print " --credfile ... credential of user making call (or 'None')"
50 print " --keyfile ... private key file of user making call"
51 print " --ticketfile ... filename of ticket (for redeemticket)"
52 print " --email ... email address (for registering users)"
53 print " --ip ... IP address (for registering nodes)"
54 print " --dns ... DNS address (for registering nodes)"
55 print " --dump_parents ... dump parents"
56 print " --server ... geni server (registry/component) to connect to"
57 print " --filter <type> ... filter the results of a list operation (user | slice | node ...)"
58 print " --short ... list records in short format (name only)"
60 print " resolve <hrn>"
61 print " dumpCredential"
62 print " getCredential <type> <hrn>"
65 print " createKey <filename>"
66 print " createGid <hrn> <uuid|None> <pubkey_fn>"
67 print " register <type> <hrn> <gid_filename>"
68 print " remove <type> <hrn>"
69 print " update <type> <hrn>"
74 def process_options():
78 global cert_file, cred_file
79 global key_file, out_file, ticket_file
80 global uuid, pkey_fn, gid_fn, email, gid_pkey_fn, ip, dns
86 (options, args) = getopt.getopt(sys.argv[1:], '', long_opts)
94 elif name == "--username":
96 elif name == "--outfile":
98 elif name == "--credfile":
100 elif name == "--certfile":
102 elif name == "--keyfile":
104 elif name == "--ticketfile":
106 elif name == "--email":
110 elif name == "--dns":
112 elif name == "--dump_parents":
114 elif name == "--server":
116 elif name == "--filter":
118 elif name == "--short":
122 print "no operation specified"
127 if opname == "resolve":
129 print "syntax: resolve <hrn>"
133 elif opname == "getCredential":
135 print "syntax: getcredential <type> <hrn>"
140 elif opname == "list":
142 print "syntax: list <hrn>"
147 elif opname == "createGid":
149 print "syntax: createGid <hrn> <uuid|None> <pubkey_fn>"
155 gid_pkey_fn = args[3]
157 elif opname == "register":
159 print "syntax: register <type> <hrn> <gid_filename>"
164 elif opname == "remove":
166 print "syntax: remove <type> <hrn>"
170 elif opname == "update":
172 print "syntax: update <type> <hrn>"
176 elif opname == "getTicket":
178 print "syntax: getTicket <hrn>"
182 leaf_name = get_leaf(username)
184 if cert_file == None:
185 cert_file = leaf_name + ".cert"
188 key_file = leaf_name + ".pkey"
190 if cred_file == None:
191 cred_file = leaf_name + ".cred"
194 print " server:", server_url
195 print " username:", username
196 print "cert_file:", cert_file
197 print " key_file:", key_file
198 print "cred_file:", cred_file
199 print "operation:", opname
202 print " out_file:", out_file
204 def get_authority(x):
206 return ".".join(parts[:3])
208 def dumpCredential():
211 # creates a self-signed certificate and private key
213 k = Keypair(create=True)
220 ik = Keypair(create=True)
223 print "writing private key to", key_file
224 k.save_to_file(key_file)
226 #cert = Certificate(subject=username)
228 #cert.set_issuer(ik, iname)
230 #print "writing self-signed cert to", cert_file
231 #cert.save_to_file(cert_file)
233 def load_publickey_string(fn):
235 key_string = f.read()
237 # if the filename is a private key file, then extract the public key
238 if "PRIVATE KEY" in key_string:
239 outfn = tempfile.mktemp()
240 cmd = "openssl rsa -in " + fn + " -pubout -outform PEM -out " + outfn
243 key_string = f.read()
254 # if the operation is not a local operation, then create a geniclient to
256 if (opname != "dumpCredential") and (opname != "help") and (opname != "createKey"):
257 if not os.path.exists(key_file):
258 print "key file", key_file, "does not exist"
260 if not os.path.exists(cert_file):
261 k = Keypair(filename = key_file)
262 cert = Certificate(subject=username)
264 cert.set_issuer(k, username)
266 print "writing self-signed cert to", cert_file
267 cert.save_to_file(cert_file)
268 client = GeniClient(server_url, key_file, cert_file)
270 # if a cred_file was specified, then load the credential
271 if (cred_file=="None") or (opname == "help") or (opname == "createKey") or \
272 (opname == "redeemTicket"):
275 cred = Credential(filename = cred_file)
277 if opname == "dumpCredential":
280 elif opname == "help":
283 elif opname == "createKey":
286 elif (opname == "resolve"):
287 result = client.resolve(cred, hrn)
289 for record in result:
291 record.dump(dump_parents=dump_parents)
295 elif (opname == "getCredential"):
296 result = client.get_credential(cred, type, hrn)
299 result.dump(dump_parents=dump_parents)
301 file(out_file, "w").write(result.save_to_string(save_parents=True))
305 elif (opname == "list"):
306 result = client.list(cred, hrn)
309 result = [r for r in result if r.type==filter]
311 for record in result:
313 print " ", record.get_name()
315 record.dump(dump_parents=dump_parents)
319 elif (opname == "createGid"):
320 # try loading it from a private or a public key file
321 pkey_string = load_publickey_string(gid_pkey_fn)
323 gid = client.create_gid(cred, hrn, uuid, pkey_string)
326 gid.dump(dump_parents=dump_parents)
328 file(out_file,"w").write(gid.save_to_string(save_parents=True))
332 elif (opname == "register"):
336 print "ERROR: must specify --email <addr> when registering users"
337 geni_info['email'] = email
341 print "ERROR: must specify --ip <addr> when registering nodes"
344 print "ERROR: must specify --dns <addr> when registering nodes"
345 geni_info['dns'] = dns
347 gid = GID(filename=gid_fn)
348 record = GeniRecord(name=hrn, gid=gid, type=type, pointer=-1)
349 record.set_geni_info(geni_info)
351 result = client.register(cred, record)
353 elif (opname == "remove"):
354 client.remove(cred, type, hrn)
356 elif (opname == "update"):
357 record_list = client.resolve(cred, hrn)
359 print "no records match hrn"
361 matching_records = []
362 for record in record_list:
363 if record.get_type() == type:
364 matching_records.append(record)
366 if not matching_records:
367 print "records match hrn, but no records match type"
369 for record in matching_records:
370 geni_info = record.get_geni_info()
373 geni_info['email'] = email
377 geni_info['dns'] = dns
379 client.update(cred, record)
381 elif (opname == "stopSlice"):
382 client.stop_slice(cred)
384 elif (opname == "startSlice"):
385 client.start_slice(cred)
387 elif (opname == "resetSlice"):
388 client.reset_slice(cred)
390 elif (opname == "deleteSlice"):
391 client.delete_slice(cred)
393 elif (opname == "listSlices"):
394 result = client.list_slices(cred)
396 print "\n".join(result)
398 file(out_file,"w").write("\n".join(result))
400 elif (opname == "getTicket"):
401 result = client.get_ticket(cred, hrn, {})
404 result.dump(dump_parents=dump_parents)
406 file(out_file,"w").write(result.save_to_string(save_parents=True))
410 elif (opname == "redeemTicket"):
411 ticket = Ticket(filename = ticket_file)
412 result = client.redeem_ticket(ticket)
415 print "unknown operation: " + opname
417 if __name__=="__main__":