Remove delegate_cred() method
[sfa.git] / sfa / client / sfi.py
index 8c7704c..cfa87c8 100755 (executable)
@@ -9,6 +9,7 @@ import tempfile
 import traceback
 import socket
 import random
+import datetime
 from lxml import etree
 from StringIO import StringIO
 from types import StringTypes, ListType
@@ -49,7 +50,6 @@ def display_list(results):
     for result in results:
         print result
 
-
 def display_records(recordList, dump=False):
     ''' Print all fields in the record'''
     for record in recordList:
@@ -169,27 +169,28 @@ class Sfi:
         parser = OptionParser(usage="sfi [sfi_options] %s [options] %s" \
                                      % (command, cmdargs[command]))
 
-        if command in ("resources"):
-            parser.add_option("-f", "--format", dest="format", type="choice",
-                             help="display format ([xml]|dns|ip)", default="xml",
-                             choices=("xml", "dns", "ip"))
-                                
-        if command in ("resources", "slices", "create", "delete", "start", "stop", "get_ticket"):
+        # user specifies remote aggregate/sm/component                          
+        if command in ("resources", "slices", "create", "delete", "start", "stop", "restart", "get_ticket", "redeem_ticket"):
             parser.add_option("-a", "--aggregate", dest="aggregate",
                              default=None, help="aggregate host")
             parser.add_option("-p", "--port", dest="port",
                              default=AGGREGATE_PORT, help="aggregate port")
-
-        if command in ("start", "stop", "reset", "delete", "slices"):
             parser.add_option("-c", "--component", dest="component", default=None,
                              help="component hrn")
-            
+        
+        # registy filter option    
         if command in ("list", "show", "remove"):
             parser.add_option("-t", "--type", dest="type", type="choice",
-                            help="type filter ([all]|user|slice|sa|ma|node|aggregate)",
-                            choices=("all", "user", "slice", "sa", "ma", "node", "aggregate"),
+                            help="type filter ([all]|user|slice|authority|node|aggregate)",
+                            choices=("all", "user", "slice", "authority", "node", "aggregate"),
                             default="all")
 
+        # display formats
+        if command in ("resources"):
+            parser.add_option("-f", "--format", dest="format", type="choice",
+                             help="display format ([xml]|dns|ip)", default="xml",
+                             choices=("xml", "dns", "ip"))
+
         if command in ("resources", "show", "list"):
            parser.add_option("-o", "--output", dest="file",
                             help="output XML to file", metavar="FILE", default=None)
@@ -380,120 +381,62 @@ class Sfi:
                 print "Writing user gid to", file
             gid.save_to_file(file, save_parents=True)
             return gid       
+
+    def get_cached_credential(self, file):
+        """
+        Return a cached credential only if it hasn't expired.
+        """
+        if (os.path.isfile(file)):
+            credential = Credential(filename=file)
+            # make sure it isnt expired 
+            if not credential.get_lifetime or \
+               datetime.datetime.today() < credential.get_lifetime():
+                return credential
+        return None 
  
     def get_user_cred(self):
         #file = os.path.join(self.options.sfi_dir, get_leaf(self.user) + ".cred")
         file = os.path.join(self.options.sfi_dir, self.user.replace(self.authority + '.', '') + ".cred")
-        if (os.path.isfile(file)):
-            user_cred = Credential(filename=file)
-            return user_cred
-        else:
-            # bootstrap user credential
-            cert_string = self.cert.save_to_string(save_parents=True)
-            user_name = self.user.replace(self.authority + ".", '')
-            if user_name.count(".") > 0:
-                user_name = user_name.replace(".", '_')
-                self.user = self.authority + "." + user_name
+        return self.get_cred(file, 'user', self.user)
 
-            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)
-               if self.options.verbose:
-                    print "Writing user credential to", file
-               return cred
-            else:
-               print "Failed to get user credential"
-               sys.exit(-1)
-  
     def get_auth_cred(self):
         if not self.authority:
             print "no authority specified. Use -a or set SF_AUTH"
             sys.exit(-1)
-    
         file = os.path.join(self.options.sfi_dir, get_leaf("authority") + ".cred")
-        if (os.path.isfile(file)):
-            auth_cred = Credential(filename=file)
-            return auth_cred
-        else:
-            # bootstrap authority credential from user credential
-            user_cred = self.get_user_cred().save_to_string(save_parents=True)
-            auth_cred = self.registry.get_credential(user_cred, "authority", self.authority)
-            if auth_cred:
-                cred = Credential(string=auth_cred)
-                cred.save_to_file(file, save_parents=True)
-                if self.options.verbose:
-                    print "Writing authority credential to", file
-                return cred
-            else:
-                print "Failed to get authority credential"
-                sys.exit(-1)
-    
+        return self.get_cred(file, 'authority', name)
+
     def get_slice_cred(self, name):
         file = os.path.join(self.options.sfi_dir, "slice_" + get_leaf(name) + ".cred")
-        if (os.path.isfile(file)):
-            slice_cred = Credential(filename=file)
-            return slice_cred
-        else:
-            # bootstrap slice credential from user credential
-            user_cred = self.get_user_cred().save_to_string(save_parents=True)
-            arg_list = [user_cred, "slice", name]
-            slice_cred_str = self.registry.get_credential(user_cred, "slice", name)
-            if slice_cred_str:
-                slice_cred = Credential(string=slice_cred_str)
-                slice_cred.save_to_file(file, save_parents=True)
-                if self.options.verbose:
-                    print "Writing slice credential to", file
-                return slice_cred
+        return self.get_cred(file, 'slice', name)
+    def get_cred(self, file, type, hrn):
+        # attempt to load a cached credential 
+        cred = self.get_cached_credential(file)    
+        if not cred:
+            if type in ['user']:
+                cert_string = self.cert.save_to_string(save_parents=True)
+                user_name = self.user.replace(self.authority + ".", '')
+                if user_name.count(".") > 0:
+                    user_name = user_name.replace(".", '_')
+                    self.user = self.authority + "." + user_name
+                cred_str = self.registry.get_self_credential(cert_string, "user", hrn)
             else:
-                print "Failed to get slice credential"
+                # bootstrap slice credential from user credential
+                user_cred = self.get_user_cred().save_to_string(save_parents=True)
+                cred_str = self.registry.get_credential(user_cred, type, hrn)
+            
+            if not cred_str:
+                print "Failed to get %s credential" % (type)
                 sys.exit(-1)
-    
-    def delegate_cred(self, cred, hrn, type='authority'):
-        # the gid and hrn of the object we are delegating
-        user_cred = Credential(string=cred)
-        object_gid = user_cred.get_gid_object()
-        object_hrn = object_gid.get_hrn()
-        #cred.set_delegate(True)
-        #if not cred.get_delegate():
-        #    raise Exception, "Error: Object credential %(object_hrn)s does not have delegate bit set" % locals()
-           
-    
-        records = self.registry.resolve(cred, hrn)
-        records = filter_records(type, records)
-        
-        if not records:
-            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 = SfaRecord(dict=records[0])
-        delegee_gid = record.get_gid_object()
-        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)
-        dcred.set_gid_caller(delegee_gid)
-        dcred.set_gid_object(object_gid)
-        dcred.set_privileges(user_cred.get_privileges())
-        dcred.get_privileges().delegate_all_privileges(True)
-        
+                
+            cred = Credential(string=cred_str)
+            cred.save_to_file(file, save_parents=True)
+            if self.options.verbose:
+                print "Writing %s credential to %s" %(type, file)
 
-        # Save the issuer's gid to a file
-        fname = self.options.sfi_dir + os.sep + "gid_%d" % random.randint(0, 999999999)
-        f = open(fname, "w")
-        f.write(user_cred.get_gid_caller().save_to_string())
-        f.close()
-        dcred.set_issuer_keys(self.get_key_file(), fname)
-        os.remove(fname)
-        
-        dcred.set_parent(user_cred)
-        dcred.encode()
-        dcred.sign()
-    
-        return dcred.save_to_string(save_parents=True)
+        return cred
     
     def get_rspec_file(self, rspec):
        if (os.path.isabs(rspec)):
@@ -550,7 +493,22 @@ class Sfi:
         """
         url = "http://%s:%s" % (host, port)
         return xmlrpcprotocol.get_server(url, keyfile, certfile, debug)
+
+    def get_server_from_opts(self, opts):
+        """
+        Return instance of an xmlrpc connection to a slice manager, aggregate
+        or component server depending on the specified opts
+        """
+        server = self.slicemgr
+        # direct connection to an aggregate
+        if hasattr(opts, 'aggregate') and opts.aggregate:
+            server = self.get_server(opts.aggregate, opts.port, self.key_file, \
+                                     self.cert_file, self.options.debug)
+        # direct connection to the nodes component manager interface
+        if hasattr(opts, 'component') and opts.component:
+            server = self.get_component_server_from_hrn(opts.component)    
  
+        return server
     #==========================================================================
     # Following functions implement the commands
     #
@@ -939,7 +897,7 @@ class Sfi:
     # =====================================================================
 
     def GetVersion(self, opts, args):
-        server = self.geni_am
+        server = self.get_server_from_opts(opts)
         print server.GetVersion()
 
     def ListResources(self, opts, args):