From 5ad7d82109d3e96db43a98317a8883f3d01c9623 Mon Sep 17 00:00:00 2001 From: Javi Fontan Date: Thu, 20 Feb 2014 16:24:08 +0100 Subject: [PATCH] bug #2723: fix use of --user with --cluster in the cli --cluster param needs to create a client to search for the cluster. This happens while the parameters are being parsed so it fails if there is no ONE_AUTH. To make it work the parameters user, password and endpoint are saved as OneHelper class variables as soon as they are parsed. This way they can be used to create the XMLRPC client before all parameters are parsed. --- src/cli/one_helper.rb | 61 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 50 insertions(+), 11 deletions(-) diff --git a/src/cli/one_helper.rb b/src/cli/one_helper.rb index 43fbc34a9a..34440291f7 100644 --- a/src/cli/one_helper.rb +++ b/src/cli/one_helper.rb @@ -100,19 +100,31 @@ EOT :name => 'user', :large => '--user name', :description => 'User name used to connect to OpenNebula', - :format => String + :format => String, + :proc => lambda do |o, options| + OneHelper.set_user(o) + [0, o] + end }, { :name => 'password', :large => '--password password', :description => 'Password to authenticate with OpenNebula', - :format => String + :format => String, + :proc => lambda do |o, options| + OneHelper.set_password(o) + [0, o] + end }, { :name => 'endpoint', :large => '--endpoint endpoint', :description => 'URL of OpenNebula xmlrpc frontend', - :format => String + :format => String, + :proc => lambda do |o, options| + OneHelper.set_endpoint(o) + [0, o] + end } ] @@ -340,18 +352,31 @@ EOT class OneHelper attr_accessor :client - def self.get_client(options) - if defined?(@@client) + def self.get_client(options={}, force=false) + if !force && defined?(@@client) @@client else + secret=nil - user=options[:user] + password=nil + + if defined?(@@user) + user=@@user + password=@@password if defined?(@@password) + else + user=options[:user] + end + if user - password=options[:password]||self.get_password + password=password||options[:password]||self.get_password secret="#{user}:#{password}" end - endpoint=options[:endpoint] + if defined?(@@endpoint) + endpoint=@@endpoint + else + endpoint=options[:endpoint] + end @@client=OpenNebula::Client.new(secret, endpoint) end @@ -361,10 +386,22 @@ EOT if defined?(@@client) @@client else - self.get_client({}) + self.get_client end end + def self.set_user(user) + @@user=user + end + + def self.set_password(password) + @@password=password + end + + def self.set_endpoint(endpoint) + @@endpoint=endpoint + end + if RUBY_VERSION>="1.9.3" require 'io/console' def self.get_password @@ -374,6 +411,7 @@ EOT puts pass.chop! if pass + @@password=pass pass end else @@ -381,8 +419,9 @@ EOT def self.get_password print "Password: " system("stty", "-echo") + @@password=gets.chop begin - return gets.chop + return @@password ensure system("stty", "echo") print "\n" @@ -397,7 +436,7 @@ EOT end def set_client(options) - @client=OpenNebulaHelper::OneHelper.get_client(options) + @client=OpenNebulaHelper::OneHelper.get_client(options, true) end def create_resource(options, &block)