add --debug option to see xml-rpc dialog.
[sfa.git] / sfa / client / sfi.py
index ca61463..c1207ac 100755 (executable)
@@ -12,7 +12,6 @@ from types import StringTypes, ListType
 from optparse import OptionParser
 from sfa.trust.certificate import Keypair, Certificate
 from sfa.trust.credential import Credential
-from sfa.util.geniclient import GeniClient
 from sfa.util.sfaticket import SfaTicket
 from sfa.util.record import *
 from sfa.util.namespace import *
@@ -107,7 +106,7 @@ def save_record_to_file(filename, record):
     elif record['type'] in ['authority', 'ma', 'sa']:
         record = AuthorityRecord(dict = record)
     else:
-        record = GeniRecord(dict = record)
+        record = SfaRecord(dict = record)
     str = record.save_to_string()
     file(filename, "w").write(str)
     return
@@ -116,7 +115,7 @@ def save_record_to_file(filename, record):
 # load methods
 def load_record_from_file(filename):
     str = file(filename, "r").read()
-    record = GeniRecord(string=str)
+    record = SfaRecord(string=str)
     return record
 
 
@@ -225,6 +224,9 @@ class Sfi:
         parser.add_option("-v", "--verbose",
                          action="store_true", dest="verbose", default=False,
                          help="verbose mode")
+        parser.add_option("-D", "--debug",
+                          action="store_true", dest="debug", default=False,
+                          help="Debug (xml-rpc) protocol messages")
         parser.add_option("-p", "--protocol",
                          dest="protocol", default="xmlrpc",
                          help="RPC protocol (xmlrpc or soap)")
@@ -304,10 +306,8 @@ class Sfi:
        self.cert_file = cert_file
        self.cert = Certificate(filename=cert_file) 
        # Establish connection to server(s)
-       #self.slicemgr = GeniClient(sm_url, key_file, cert_file, self.options.protocol)
-       #self.registry = GeniClient(reg_url, key_file, cert_file, self.options.protocol)
-       self.registry = xmlrpcprotocol.get_server(reg_url, key_file, cert_file)  
-       self.slicemgr = xmlrpcprotocol.get_server(sm_url, key_file, cert_file)  
+       self.registry = xmlrpcprotocol.get_server(reg_url, key_file, cert_file, self.options.debug)  
+       self.slicemgr = xmlrpcprotocol.get_server(sm_url, key_file, cert_file, self.options.debug)  
        return
     
     #
@@ -375,13 +375,12 @@ class Sfi:
         else:
             # bootstrap user credential
             cert_string = self.cert.save_to_string(save_parents=True)
-            request_hash = self.key.compute_hash([cert_string, "user", self.user])
             user_name=self.user.replace(self.authority+".", '')
             if user_name.count(".") > 0:
                 user_name = user_name.replace(".", '_')
                 self.user=self.authority + "." + user_name
 
-            user_cred = self.registry.get_self_credential(cert_string, "user", self.user, request_hash)
+            user_cred = self.registry.get_self_credential(cert_string, "user", self.user)
             if user_cred:
                cred = Credential(string=user_cred)
                cred.save_to_file(file, save_parents=True)
@@ -452,7 +451,7 @@ class Sfi:
             raise Exception, "Error: Didn't find a %(type)s record for %(hrn)s" % locals()
     
         # the gid of the user who will be delegated too
-        record = GeniRecord(dict=records[0])
+        record = SfaRecord(dict=records[0])
         delegee_gid = record.get_gid_object()
         delegee_hrn = delegee_gid.get_hrn()
         
@@ -520,7 +519,7 @@ class Sfi:
         record = records[0]
         cm_port = "12346"
         url = "https://%s:%s" % (record['hostname'], cm_port)
-        return xmlrpcprotocol.get_server(url, self.key_file, self.cert_file)
+        return xmlrpcprotocol.get_server(url, self.key_file, self.cert_file, self.options.debug)
     
     #
     # Following functions implement the commands
@@ -575,7 +574,7 @@ class Sfi:
             elif record['type'] in ['authority', 'ma', 'sa']:
                 record = AuthorityRecord(dict = record)
             else:
-                record = GeniRecord(dict = record)
+                record = SfaRecord(dict = record)
             if (opts.format=="text"): 
                 record.dump()  
             else:
@@ -606,7 +605,7 @@ class Sfi:
            print "Error: Object credential", object_hrn, "does not have delegate bit set"
            return
     
-       records = self.registry.resolve(user_cred, args[0])
+       records = self.registry.resolve(user_cred.save_to_string(save_parents=True), args[0])
        records = filter_records("user", records)
     
        if not records:
@@ -614,14 +613,14 @@ class Sfi:
            return
     
        # the gid of the user who will be delegated too
-       delegee_gid = records[0].get_gid_object()
+       delegee_gid = GID(string=records[0]['gid'])
        delegee_hrn = delegee_gid.get_hrn()
-    
+   
        # the key and hrn of the user who will be delegating
        user_key = Keypair(filename = self.get_key_file())
        user_hrn = user_cred.get_gid_caller().get_hrn()
-    
-       dcred = Credential(subject=object_hrn + " delegated to " + delegee_hrn)
+       subject_string = "%s delegated to %s" % (object_hrn, delegee_hrn)
+       dcred = Credential(subject=subject_string)
        dcred.set_gid_caller(delegee_gid)
        dcred.set_gid_object(object_gid)
        dcred.set_privileges(object_cred.get_privileges())
@@ -753,7 +752,7 @@ class Sfi:
                 raise Exception, "No such aggregate %s" % agg_hrn
             aggregate = aggregates[0]
             url = "http://%s:%s" % (aggregate['addr'], aggregate['port'])     
-            server = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file)
+            server = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file, self.options.debug)
         if args:
             cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True)
             hrn = args[0]
@@ -786,7 +785,7 @@ class Sfi:
                 raise Exception, "No such aggregate %s" % opts.aggregate
             aggregate = aggregates[0]
             url = "http://%s:%s" % (aggregate['addr'], aggregate['port'])
-            server = GeniClient(url, self.key_file, self.cert_file, self.options.protocol)
+            server = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file, self.options.debug)
         return server.create_slice(slice_cred, slice_hrn, rspec)
 
     # get a ticket for the specified slice
@@ -803,7 +802,7 @@ class Sfi:
                 raise Exception, "No such aggregate %s" % opts.aggregate
             aggregate = aggregates[0]
             url = "http://%s:%s" % (aggregate['addr'], aggregate['port'])
-            server = GeniClient(url, self.key_file, self.cert_file, self.options.protocol)
+            server = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file, self.options.debug)
         ticket_string = server.get_ticket(slice_cred, slice_hrn, rspec)
         file = os.path.join(self.options.sfi_dir, get_leaf(slice_hrn) + ".ticket")
         print "writing ticket to ", file        
@@ -817,7 +816,8 @@ class Sfi:
         # use this to get the right slice credential 
         ticket = SfaTicket(filename=ticket_file)
         ticket.decode()
-        slice_hrn = ticket.attributes['slivers'][0]['hrn']
+       slice_hrn=ticket.gidObject.get_hrn()
+        #slice_hrn = ticket.attributes['slivers'][0]['hrn']
         user_cred = self.get_user_cred()
         slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True)
         
@@ -834,8 +834,8 @@ class Sfi:
             try:
                 cm_port = "12346" 
                 url = "https://%(hostname)s:%(cm_port)s" % locals() 
-                print "Calling get_ticket at %(url)s " % locals(),  
-                cm = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file)
+                print "Calling redeem_ticket at %(url)s " % locals(),  
+                cm = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file, self.options.debug)
                 cm.redeem_ticket(slice_cred, ticket.save_to_string(save_parents=True))
                 print "Success"
             except socket.gaierror: