Removing GeniClient
[sfa.git] / sfa / client / sfadump.py
1 #! /usr/bin/env python
2 # $Id$
3 # $URL$
4 from __future__ import with_statement
5
6 import sys
7 import os, os.path
8 import tempfile
9 import xmlrpclib
10 from types import StringTypes, ListType
11 from optparse import OptionParser
12
13 from sfa.trust.certificate import Certificate
14 from sfa.trust.credential import Credential
15 from sfa.util.record import SfaRecord
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="%prog [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()