#!/usr/bin/env python import sys from datetime import datetime from federation.fedid import fedid, generate_fedid from federation.remote_service import service_caller from federation.proof import proof from federation.client_lib import client_opts, exit_with_fault, RPCException, \ wrangle_standard_options, do_rpc, get_experiment_names, \ save_certfile, get_abac_certs, log_authentication class new_opts(client_opts): def __init__(self): client_opts.__init__(self) self.add_option("--experiment_cert", dest="out_certfile", action='callback', callback=self.expand_file, type='str', help="output certificate file") self.add_option("--experiment_name", dest="exp_name", type="string", help="Suggested experiment name") self.add_option('--gen_cert', action='store_true', dest='gen_cert', default=False, help='generate a cert to which to delegate rights') parser = new_opts() (opts, args) = parser.parse_args() try: cert, fid, url = wrangle_standard_options(opts) acerts = get_abac_certs(opts.abac_dir) except EnvironmentError, e: sys.exit('%s: %s' % (e.filename, e.strerror)) except RuntimeError, e: sys.exit("%s" %e) out_certfile = opts.out_certfile msg = { } if opts.gen_cert: expid, expcert = generate_fedid(opts.exp_name or 'dummy') msg['experimentAccess'] = { 'X509': expcert } else: expcert = None if opts.exp_name: msg['experimentID'] = { 'localname': opts.exp_name } if acerts: msg['credential'] = acerts if opts.debug > 1: print >>sys.stderr, msg try: resp_dict = do_rpc(msg, url, opts.transport, cert, opts.trusted, serialize_only=opts.serialize_only, tracefile=opts.tracefile, caller=service_caller("New"), responseBody='NewResponseBody') except RPCException, e: exit_with_fault(e, 'New', opts) except RuntimeError, e: sys.exit("Error processing RPC: %s" % e) if opts.debug > 1: print >>sys.stderr, resp_dict try: save_certfile(opts.out_certfile, resp_dict.get('experimentAccess', None), expcert) except EnvironmentError, e: sys.exit('Could not write to %s:' % (e.strerror, e.filename)) except CertificateMismatchError: printf >>sys.stderr, "Fedid of created experiment does not match generated" e_fedid, e_local = get_experiment_names(resp_dict.get('experimentID', None)) st = resp_dict.get('experimentStatus', None) proof = proof.from_dict(resp_dict.get('proof', {})) if e_local: print "localname: %s" % e_local if e_fedid: print "fedid: %s" % e_fedid if st: print "status: %s" % st if proof and opts.auth_log: log_authentication(opts.auth_log, 'New', 'succeeded', proof)