Clients use $HOME/.config/arvados/settings.conf for configuration. (fixes #1943)
authorTim Pierce <twp@curoverse.com>
Tue, 21 Jan 2014 22:09:00 +0000 (17:09 -0500)
committerTim Pierce <twp@curoverse.com>
Tue, 21 Jan 2014 22:09:00 +0000 (17:09 -0500)
sdk/cli/bin/arv
sdk/perl/lib/Arvados.pm
sdk/python/arvados/__init__.py
sdk/ruby/lib/arvados.rb

index b133a7783d4beb35afa310a1a2c169b323c6834f..3955c945766204696679a64b4577e51fb6beb4b5 100755 (executable)
@@ -12,7 +12,7 @@ end
 
 # read authentication data from ~/.config/arvados if present
 lineno = 0
-config_file = File.expand_path('~/.config/arvados')
+config_file = File.expand_path('~/.config/arvados/settings.conf')
 if File.exist? config_file then
   File.open(config_file, 'r').each do |line|
     lineno = lineno + 1
index 8a643788b64f15ac743732deb8e9c41ea497d748..31258f51723db253f3e2dbc4dbaf266a7f900279 100644 (file)
@@ -82,9 +82,18 @@ sub new
 sub build
 {
     my $self = shift;
-    $self->{'authToken'} ||= $ENV{'ARVADOS_API_TOKEN'};
-    $self->{'apiHost'} ||= $ENV{'ARVADOS_API_HOST'};
-    $self->{'apiProtocolScheme'} ||= $ENV{'ARVADOS_API_PROTOCOL_SCHEME'};
+
+    $config = load_config_file("$ENV{HOME}/.config/arvados/settings.conf");
+
+    $self->{'authToken'} ||= 
+       $ENV{ARVADOS_API_TOKEN} || $config->{ARVADOS_API_TOKEN};
+
+    $self->{'apiHost'} ||=
+       $ENV{ARVADOS_API_HOST} || $config->{ARVADOS_API_HOST};
+
+    $self->{'apiProtocolScheme'} ||=
+       $ENV{ARVADOS_API_PROTOCOL_SCHEME} ||
+       $config->{ARVADOS_API_PROTOCOL_SCHEME};
 
     $self->{'ua'} = new Arvados::Request;
 
@@ -124,4 +133,21 @@ sub new_request
     Arvados::Request->new();
 }
 
+sub load_config_file ($)
+{
+    my $config_file = shift;
+    my %config;
+
+    if (open (CONF, $config_file)) {
+       while (<CONF>) {
+           next if /^\s*#/ || /^\s*$/;  # skip comments and blank lines
+           chomp;
+           my ($key, $val) = split /\s*=\s*/, $_, 2;
+           $config{$key} = $val;
+       }
+    }
+    close CONF;
+    return \%config;
+}
+
 1;
index dacdba851af3a99baaa5cdda21f105cf9354d3ae..1adadd152fff8ff3870c95f20255d5de737c7a71 100644 (file)
@@ -37,7 +37,7 @@ class ArvadosConfig(dict):
                 self[var] = os.environ[var]
 
 
-config = ArvadosConfig(os.environ['HOME'] + '/.config/arvados')
+config = ArvadosConfig(os.environ['HOME'] + '/.config/arvados/settings.conf')
 
 if 'ARVADOS_DEBUG' in config:
     logging.basicConfig(level=logging.DEBUG)
index 0b004635082968e5f6784b2c65d5cf08f89739c4..5be1fd939ea4ac797c1ceeb263d41b77bc709473 100644 (file)
@@ -32,18 +32,20 @@ class Arvados
     @application_version ||= 0.0
     @application_name ||= File.split($0).last
 
+    @config = self.load_config_file
+
     @arvados_api_version = opts[:api_version] ||
-      ENV['ARVADOS_API_VERSION'] ||
+      @config['ARVADOS_API_VERSION'] ||
       'v1'
     @arvados_api_host = opts[:api_host] ||
-      ENV['ARVADOS_API_HOST'] or
+      @config['ARVADOS_API_HOST'] or
       raise "#{$0}: no :api_host or ENV[ARVADOS_API_HOST] provided."
     @arvados_api_token = opts[:api_token] ||
-      ENV['ARVADOS_API_TOKEN'] or
+      @config['ARVADOS_API_TOKEN'] or
       raise "#{$0}: no :api_token or ENV[ARVADOS_API_TOKEN] provided."
 
-    if (opts[:api_host] ? opts[:suppress_ssl_warnings] :
-        ENV['ARVADOS_API_HOST_INSECURE'])
+    if (opts[:suppress_ssl_warnings] or
+        @config['ARVADOS_API_HOST_INSECURE'])
       suppress_warnings do
         OpenSSL::SSL.const_set 'VERIFY_PEER', OpenSSL::SSL::VERIFY_NONE
       end
@@ -132,6 +134,32 @@ class Arvados
     $stderr.puts "#{File.split($0).last} #{$$}: #{message}" if @@debuglevel >= verbosity
   end
 
+  def load_config_file(config_file_path="~/.config/arvados/settings.conf")
+    # Initialize config settings with environment variables.
+    config = {}
+    config['ARVADOS_API_HOST']          = ENV['ARVADOS_API_HOST']
+    config['ARVADOS_API_TOKEN']         = ENV['ARVADOS_API_TOKEN']
+    config['ARVADOS_API_HOST_INSECURE'] = ENV['ARVADOS_API_HOST_INSECURE']
+    config['ARVADOS_API_VERSION']       = ENV['ARVADOS_API_VERSION']
+
+    # Load settings from the config file.
+    lineno = 0
+    File.open(File.expand_path config_file_path).each do |line|
+      lineno = lineno + 1
+      # skip comments and blank lines
+      next if line.match('^\s*#') or not line.match('\S')
+      var, val = line.chomp.split('=', 2)
+      # allow environment settings to override config files.
+      if var and val
+        config[var] ||= val
+      else
+        warn "#{config_file}: #{lineno}: could not parse `#{line}'"
+      end
+    end
+
+    config
+  end
+
   class Model
     def self.arvados_api
       arvados.arvados_api
@@ -147,7 +175,7 @@ class Arvados
     end
     def self.api_exec(method, parameters={})
       parameters = parameters.
-        merge(:api_token => ENV['ARVADOS_API_TOKEN'])
+        merge(:api_token => @config['ARVADOS_API_TOKEN'])
       parameters.each do |k,v|
         parameters[k] = v.to_json if v.is_a? Array or v.is_a? Hash
       end