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