saving rspec output to file
[sfa.git] / cmdline / sfi.py
index db716f5..9b0bed7 100755 (executable)
@@ -183,6 +183,42 @@ def get_slice_cred(name):
          print "Failed to get slice credential"
          sys.exit(-1)
 
+def delegate_cred(cred, hrn, type = 'authority'):
+    # the gid and hrn of the object we are delegating
+    object_gid = 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 = 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
+    delegee_gid = records[0].get_gid_object()
+    delegee_hrn = delegee_gid.get_hrn()
+    
+    # the key and hrn of the user who will be delegating
+    user_key = Keypair(filename = get_key_file())
+    user_hrn = 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(cred.get_privileges())
+    dcred.set_delegate(True)
+    dcred.set_pubkey(object_gid.get_pubkey())
+    dcred.set_issuer(user_key, user_hrn)
+    dcred.set_parent(cred)
+    dcred.encode()
+    dcred.sign()
+
+    return dcred
+
 def get_rspec_file(rspec):
    if (os.path.isabs(rspec)):
       file = rspec
@@ -390,7 +426,7 @@ def delegate(opts, args):
    records = filter_records("user", records)
 
    if not records:
-       print "Error: Didn't find a user record for", delegee_name
+       print "Error: Didn't find a user record for", args[0]
        return
 
    # the gid of the user who will be delegated too
@@ -521,7 +557,7 @@ def resources(opts, args):
    format = opts.format      
    display_rspec(result, format)
    if (opts.file is not None):
-      save_rspec_to_file(opts.file, result)
+      save_rspec_to_file(result, opts.file)
    return
 
 # created named slice with given rspec