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