#! /usr/bin/env python from __future__ import with_statement import sys import os, os.path import tempfile import xmlrpclib from optparse import OptionParser from geni.util.cert import Keypair, Certificate from geni.util.credential import Credential from geni.util.geniclient import GeniClient, ServerException from geni.util.gid import create_uuid from geni.util.record import GeniRecord from geni.util.rspec import Rspec from types import StringTypes, ListType def determine_geni_filekind(fn): from geni.util.cert import Certificate cert = Certificate(filename = fn) data = cert.get_data() if data: dict = xmlrpclib.loads(data)[0][0] else: dict = {} if "gidCaller" in dict: return "credential" if "uuid" in dict: return "gid" return "unknown" def save_gid(gid): hrn = gid.get_hrn() lastpart = hrn.split(".")[-1] filename = lastpart + ".gid" if os.path.exists(filename): print filename, ": already exists... skipping" return print filename, ": extracting gid of", hrn gid.save_to_file(filename, save_parents = True) def extract_gids(cred, extract_parents): gidCaller = cred.get_gid_caller() if gidCaller: save_gid(gidCaller) gidObject = cred.get_gid_object() if gidObject and ((gidCaller == None) or (gidCaller.get_hrn() != gidObject.get_hrn())): save_gid(gidObject) if extract_parents: parent = cred.get_parent() if parent: extract_gids(parent, extract_parents) def create_parser(): # Generate command line parser parser = OptionParser(usage="genidump [options] filename") parser.add_option("-e", "--extractgids", action="store_true", dest="extract_gids", default=False, help="Extract GIDs from credentials") parser.add_option("-p", "--dumpparents", action="store_true", dest="dump_parents", default=False, help="Show parents") return parser def main(): parser = create_parser() (options, args) = parser.parse_args() if len(args) <= 0: print "No filename given. Use -h for help." return -1 filename = args[0] kind = determine_geni_filekind(filename) if kind=="credential": cred = Credential(filename = filename) cred.dump(dump_parents = options.dump_parents) if options.extract_gids: extract_gids(cred, extract_parents = options.dump_parents) elif kind=="gid": gid = Gid(filename = filename) gid.dump(dump_parents = options.dump_parents) else: print "unknown filekind", kind if __name__=="__main__": main()