From 19d3db124ea92455efbc60ae43cdbb01914bc68d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tino=20V=C3=A1zquez?= Date: Thu, 30 Jun 2011 15:48:08 +0200 Subject: [PATCH] Feature #687: ACL string syntax for oneacl --- src/cli/etc/oneacl.yaml | 22 +++++++----- src/cli/one_helper/oneacl_helper.rb | 53 ++++++++++++++++++++++++--- src/cli/oneacl | 27 +++----------- src/oca/ruby/OpenNebula/Acl.rb | 55 ++++++++++++----------------- src/oca/ruby/OpenNebula/AclPool.rb | 12 +++---- 5 files changed, 93 insertions(+), 76 deletions(-) diff --git a/src/cli/etc/oneacl.yaml b/src/cli/etc/oneacl.yaml index e53a1bad8e..19402950a1 100644 --- a/src/cli/etc/oneacl.yaml +++ b/src/cli/etc/oneacl.yaml @@ -1,25 +1,31 @@ --- +:ID: + :desc: To which resource owner the rule applies to + :size: 5 + :right: true + :USER: :desc: To which resource owner the rule applies to - :size: 4 + :size: 8 :right: true -:RESOURCE_VHNIUTG: +:RES_VHNIUTG: :desc: Which resource the rule applies to - :size: 16 + :size: 11 :RID: :desc: Resource ID - :size: 4 + :size: 5 :right: true -:OPERATION_CDUMIPpTW: +:OPE_CDUMIPpTW: :desc: Operation to which the rule applies - :size: 19 + :size: 13 :right: true :default: +- :ID - :USER -- :RESOURCE_VHNIUTG +- :RES_VHNIUTG - :RID -- :OPERATION_CDUMIPpTW +- :OPE_CDUMIPpTW diff --git a/src/cli/one_helper/oneacl_helper.rb b/src/cli/one_helper/oneacl_helper.rb index 916d4be256..da721f8d2d 100644 --- a/src/cli/one_helper/oneacl_helper.rb +++ b/src/cli/one_helper/oneacl_helper.rb @@ -24,6 +24,43 @@ class OneAclHelper < OpenNebulaHelper::OneHelper def self.conf_file "oneacl.yaml" end + + def add_rule(options, arg0, arg1=nil, arg2=nil) + aclp = OpenNebula::AclPool.new( OpenNebula::Client.new() ) + + if arg2 + rc = aclp.addrule( arg0, arg1, arg2 ) + else + rc = aclp.addrule_with_str( arg0 ) + end + + if OpenNebula.is_error?(rc) + [-1, rc.message] + else + if !rc + puts "Rule added" if options[:verbose] + return 0 + end + return [-1, rc[:users].message] if OpenNebula.is_error?(rc[:users]) + return [-1, rc[:resources].message] if OpenNebula.is_error?( + rc[:resources]) + return [-1, rc[:rights].message] if OpenNebula.is_error?( + rc[:rights]) + end + end + + def delete_rule(id) + acl = OpenNebula::AclPool.new( OpenNebula::Client.new() ) + + rc = acl.delrule( id ) + + if OpenNebula.is_error?(rc) + [-1, rc.message] + else + puts "Rule deleted" if options[:verbose] + 0 + end + end private @@ -92,27 +129,33 @@ class OneAclHelper < OpenNebulaHelper::OneHelper config_file=self.class.table_conf table=CLIHelper::ShowTable.new(config_file, self) do + column :ID, "Rule Identifier", + :size=>5 do |d| + d['ID'] + end + column :USER, "To which resource owner the rule applies to", - :size=>4 do |d| + :size=>8 do |d| d['STRING'].split(" ")[0] end - column :RESOURCE_VHNIUTG, "Resource to which the rule applies" do |d| + column :RES_VHNIUTG, "Resource to which the rule applies" do |d| OneAclHelper::resource_mask d['STRING'].split(" ")[1] end - column :RID, "Resource ID", :right, :size=>4 do |d| + column :RID, "Resource ID", :right, :size=>8 do |d| d['STRING'].split(" ")[1].split("/")[1] end - column :OPERATION_CDUMIPpTW, "Operation to which the rule applies" do |d| + column :OPE_CDUMIPpTW, "Operation to which the rule applies" do |d| OneAclHelper::right_mask d['STRING'].split(" ")[2] end - default :USER, :RESOURCE_VHNIUTG, :RID, :OPERATION_CDUMIPpTW + default :ID, :USER, :RESOURCE_VHNIUTG, :RID, :OPERATION_CDUMIPpTW end table.show(pool, options) end + end \ No newline at end of file diff --git a/src/cli/oneacl b/src/cli/oneacl index d4001ffac1..d291668361 100755 --- a/src/cli/oneacl +++ b/src/cli/oneacl @@ -54,17 +54,8 @@ cmd = CommandParser::CmdParser.new(ARGV) do Adds a new ACL rule EOT - command :addrule, addrule_desc, :user, :resource, :rights do - acl = OpenNebula::AclPool.new( OpenNebula::Client.new() ) - - rc = acl.addrule( args[0], args[1], args[2] ) - - if OpenNebula.is_error?(rc) - [-1, rc.message] - else - puts "Rule added" if options[:verbose] - 0 - end + command :addrule, addrule_desc, [:user,:rulestr], [:resource, nil], [:rights, nil] do + helper.add_rule(options, args[0], args[1], args[2] ) end delrule_desc = <<-EOT.unindent @@ -72,17 +63,7 @@ cmd = CommandParser::CmdParser.new(ARGV) do EOT command :delrule, delrule_desc, :id do - acl = OpenNebula::Acl.new( OpenNebula::Client.new() ) - - rc = acl.delrule( args[0] ) - - if OpenNebula.is_error?(rc) - [-1, rc.message] - else - puts "Rule deleted" if options[:verbose] - 0 - end - + helper.delete_rule( args[0] ) end list_desc = <<-EOT.unindent @@ -90,6 +71,6 @@ cmd = CommandParser::CmdParser.new(ARGV) do EOT command :list, list_desc,:options=>OpenNebulaHelper::XML do - helper.list_pool(options) + helper.list_pool( options ) end end diff --git a/src/oca/ruby/OpenNebula/Acl.rb b/src/oca/ruby/OpenNebula/Acl.rb index 52698f1d9a..7347ca72fc 100644 --- a/src/oca/ruby/OpenNebula/Acl.rb +++ b/src/oca/ruby/OpenNebula/Acl.rb @@ -72,28 +72,16 @@ module OpenNebula } - def initialize(rule_xml=nil) + def initialize(rule_str=nil) @content = { - :users => 0, - :resources => 0, - :rights => 0 + :users => 0, + :resources => 0, + :rights => 0 } - parse_rule(rule_xml) + parse_rule(rule_str) if rule_str end - def initialize(users,resources,rights, str) - str=str.split(" ") - - @content = { - :users => users, - :resources => resources, - :rights => rights, - :users_str => str.size==3?str[0]:0, - :resources_str => str.size==3?str[1]:0, - :rights_str => str.size==3?str[2]:0 - } - end def set_hex_rule(users,resources,rights) set_hex_users users @@ -114,21 +102,22 @@ module OpenNebula end def set_users(users) - @content[:users] = users.to_s(10) + @content[:users] = users.to_i.to_s(10) end def set_resources(resources) - @content[:resources] = resources.to_s(10) + @content[:resources] = resources.to_i.to_s(10) end def set_rights(rights) - @content[:rights] = rights.to_s(10) - end + @content[:rights] = rights.to_i.to_s(10) + end + def parse_rule(rule_str) begin rule_str = rule_str.split(" ") parse_users(rule_str[0]) - parse_resource(rule_str[1]) + parse_resources(rule_str[1]) parse_rights(rule_str[2]) rescue Exception => e @content[:users] = OpenNebula::Error.new(e.message) @@ -153,15 +142,13 @@ module OpenNebula return end - resources[0].each{ |resource| + resources[0].split("+").each{ |resource| next if !RESOURCES[resource.upcase] - - @content[:resources] = @content[:resources] - + RESOURCES[resource.upcase] + @content[:resources] = @content[:resources] + RESOURCES[resource.upcase].to_i } - + @content[:resources] = @content[:resources] + - calculate_user(resources[1]) + calculate_users(resources[1]).to_i @content[:resources] = @content[:resources].to_s(16) rescue Exception => e @@ -179,7 +166,7 @@ module OpenNebula @content[:rights] = @content[:rights] + RIGHTS[right.upcase] } - @content[:rights] = @content[:rights].to_s(16) + @content[:rights] = @content[:rights].to_i.to_s(16) rescue Exception => e @content[:rights] = OpenNebula::Error.new(e.message) end @@ -187,20 +174,22 @@ module OpenNebula def calculate_users(users_str) - if users == "*" + if users_str == "*" return USERS["ALL"] end - value = 0 + value = 0 - case users[0..0] + case users_str[0..0] when "#" value = USERS["UID"] when "@" value = USERS["GID"] end + + users_value = users_str[1..-1].to_i + value - return value + users[1..-1].to_i + return users_value.to_i.to_s(16) end def users diff --git a/src/oca/ruby/OpenNebula/AclPool.rb b/src/oca/ruby/OpenNebula/AclPool.rb index 8b49b898c5..3f77fa7764 100644 --- a/src/oca/ruby/OpenNebula/AclPool.rb +++ b/src/oca/ruby/OpenNebula/AclPool.rb @@ -68,12 +68,14 @@ module OpenNebula # Adds a new ACL rule. # - # +rule+ Rule class - def addrule_with_class(rule) + # +rule+ Rule tring + def addrule_with_str(rule_str) + rule = Acl.new rule_str + return rule.error if rule.is_error? rc = @client.call( ACL_POOL_METHODS[:addrule], - rule.user, + rule.users, rule.resources, rule.rights ) @@ -98,10 +100,6 @@ module OpenNebula return rc end - ####################################################################### - # Helpers - ####################################################################### - private end