use self.get_auth_info
[sfa.git] / geni / client / genidump.py
1 #! /usr/bin/env python
2 from __future__ import with_statement
3
4 import sys
5 import os, os.path
6 import tempfile
7 import xmlrpclib
8 from types import StringTypes, ListType
9 from optparse import OptionParser
10
11 from geni.trust.certificate import Certificate
12 from geni.trust.credential import Credential
13 from geni.trust.gid import create_uuid
14
15 from geni.util.geniclient import GeniClient, ServerException
16 from geni.util.record import GeniRecord
17 from geni.util.rspec import Rspec
18
19 def determine_geni_filekind(fn):
20     cert = Certificate(filename = fn)
21
22     data = cert.get_data()
23     if data:
24         dict = xmlrpclib.loads(data)[0][0]
25     else:
26         dict = {}
27
28     if "gidCaller" in dict:
29         return "credential"
30
31     if "uuid" in dict:
32         return "gid"
33
34     return "unknown"
35
36 def save_gid(gid):
37    hrn = gid.get_hrn()
38    lastpart = hrn.split(".")[-1]
39    filename = lastpart + ".gid"
40
41    if os.path.exists(filename):
42        print filename, ": already exists... skipping"
43        return
44
45    print filename, ": extracting gid of", hrn
46
47    gid.save_to_file(filename, save_parents = True)
48
49 def extract_gids(cred, extract_parents):
50    gidCaller = cred.get_gid_caller()
51    if gidCaller:
52        save_gid(gidCaller)
53
54    gidObject = cred.get_gid_object()
55    if gidObject and ((gidCaller == None) or (gidCaller.get_hrn() != gidObject.get_hrn())):
56        save_gid(gidObject)
57
58    if extract_parents:
59        parent = cred.get_parent()
60        if parent:
61            extract_gids(parent, extract_parents)
62
63 def create_parser():
64    # Generate command line parser
65    parser = OptionParser(usage="genidump [options] filename")
66
67    parser.add_option("-e", "--extractgids", action="store_true", dest="extract_gids", default=False, help="Extract GIDs from credentials")
68    parser.add_option("-p", "--dumpparents", action="store_true", dest="dump_parents", default=False, help="Show parents")
69
70    return parser
71
72 def main():
73    parser = create_parser()
74    (options, args) = parser.parse_args()
75
76    if len(args) <= 0:
77         print "No filename given. Use -h for help."
78         return -1
79
80    filename = args[0]
81    kind = determine_geni_filekind(filename)
82
83    if kind=="credential":
84        cred = Credential(filename = filename)
85        cred.dump(dump_parents = options.dump_parents)
86        if options.extract_gids:
87            extract_gids(cred, extract_parents = options.dump_parents)
88    elif kind=="gid":
89        gid = Gid(filename = filename)
90        gid.dump(dump_parents = options.dump_parents)
91    else:
92        print "unknown filekind", kind
93
94 if __name__=="__main__":
95    main()