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