Class: Bolt::PuppetDB::Config

Inherits:
Object
  • Object
show all
Defined in:
lib/bolt/puppetdb/config.rb

Constant Summary collapse

DEFAULT_TOKEN =
File.expand_path('~/.puppetlabs/token')
DEFAULT_CONFIG =
{ user: File.expand_path('~/.puppetlabs/client-tools/puppetdb.conf'),
global: '/etc/puppetlabs/client-tools/puppetdb.conf' }.freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config:, project: nil, load_defaults: false) ⇒ Config

Returns a new instance of Config.



20
21
22
23
24
25
26
27
28
# File 'lib/bolt/puppetdb/config.rb', line 20

def initialize(config:, project: nil, load_defaults: false)
  @settings = if load_defaults
                self.class.default_config.merge(config)
              else
                config
              end

  expand_paths(project)
end

Class Method Details

.default_configHash

Loads default configuration from the puppetdb.conf file on system. If the file is not present, defaults to an empty hash.

Returns:

  • (Hash)


43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/bolt/puppetdb/config.rb', line 43

def self.default_config
  config = {}
  global_path = Bolt::Util.windows? ? default_windows_config : DEFAULT_CONFIG[:global]

  if File.exist?(DEFAULT_CONFIG[:user])
    filepath = DEFAULT_CONFIG[:user]
  elsif File.exist?(global_path)
    filepath = global_path
  end

  begin
    config = JSON.parse(File.read(filepath)) if filepath
  rescue StandardError => e
    Bolt::Logger.logger(self).error("Could not load puppetdb.conf from #{filepath}: #{e.message}")
  end

  config.fetch('puppetdb', {})
end

.default_windows_configString

Returns the path to the puppetdb.conf file on Windows.

Returns:

  • (String)


34
35
36
# File 'lib/bolt/puppetdb/config.rb', line 34

def self.default_windows_config
  File.expand_path(File.join(ENV['ALLUSERSPROFILE'], 'PuppetLabs/client-tools/puppetdb.conf'))
end

Instance Method Details

#cacertObject



128
129
130
131
132
133
134
# File 'lib/bolt/puppetdb/config.rb', line 128

def cacert
  if @settings['cacert'] && validate_file_exists('cacert')
    @settings['cacert']
  else
    raise Bolt::PuppetDBError, "cacert must be specified"
  end
end

#certObject



136
137
138
139
140
# File 'lib/bolt/puppetdb/config.rb', line 136

def cert
  validate_cert_and_key
  validate_file_exists('cert')
  @settings['cert']
end

#connect_timeoutObject



155
156
157
158
# File 'lib/bolt/puppetdb/config.rb', line 155

def connect_timeout
  validate_timeout('connect_timeout')
  @settings['connect_timeout']
end

#expand_paths(project_path) ⇒ Object



81
82
83
84
85
86
# File 'lib/bolt/puppetdb/config.rb', line 81

def expand_paths(project_path)
  %w[cacert cert key token].each do |file|
    next unless @settings[file]
    @settings[file] = File.expand_path(@settings[file], project_path)
  end
end

#keyObject



142
143
144
145
146
# File 'lib/bolt/puppetdb/config.rb', line 142

def key
  validate_cert_and_key
  validate_file_exists('key')
  @settings['key']
end

#read_timeoutObject



160
161
162
163
# File 'lib/bolt/puppetdb/config.rb', line 160

def read_timeout
  validate_timeout('read_timeout')
  @settings['read_timeout']
end

#server_urlsObject



95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/bolt/puppetdb/config.rb', line 95

def server_urls
  case @settings['server_urls']
  when String
    [@settings['server_urls']]
  when Array
    @settings['server_urls']
  when nil
    raise Bolt::PuppetDBError, "server_urls must be specified"
  else
    raise Bolt::PuppetDBError, "server_urls must be a string or array"
  end
end

#to_hashObject



171
172
173
# File 'lib/bolt/puppetdb/config.rb', line 171

def to_hash
  @settings.dup
end

#tokenObject



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/bolt/puppetdb/config.rb', line 62

def token
  return @token if @token_computed
  # Allow nil in config to skip loading a token
  if @settings.include?('token')
    if @settings['token']
      @token = File.read(@settings['token'])
    end
  elsif File.exist?(DEFAULT_TOKEN)
    @token = File.read(DEFAULT_TOKEN)
  end
  # Only use cert based auth in the case token and cert are both configured
  if @token && cert
    Bolt::Logger.logger(self).debug("Both cert and token based auth configured, using cert only")
    @token = nil
  end
  @token_computed = true
  @token = @token.strip if @token
end

#uriObject



108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/bolt/puppetdb/config.rb', line 108

def uri
  return @uri if @uri
  require 'addressable/uri'

  uri = case @settings['server_urls']
        when String
          @settings['server_urls']
        when Array
          @settings['server_urls'].first
        when nil
          raise Bolt::PuppetDBError, "server_urls must be specified"
        else
          raise Bolt::PuppetDBError, "server_urls must be a string or array"
        end

  @uri = Addressable::URI.parse(uri)
  @uri.port ||= 8081
  @uri
end

#validate_cert_and_keyObject



148
149
150
151
152
153
# File 'lib/bolt/puppetdb/config.rb', line 148

def validate_cert_and_key
  if (@settings['cert'] && !@settings['key']) ||
     (!@settings['cert'] && @settings['key'])
    raise Bolt::PuppetDBError, "cert and key must be specified together"
  end
end

#validate_file_exists(file) ⇒ Object



88
89
90
91
92
93
# File 'lib/bolt/puppetdb/config.rb', line 88

def validate_file_exists(file)
  if @settings[file] && !File.exist?(@settings[file])
    raise Bolt::PuppetDBError, "#{file} file #{@settings[file]} does not exist"
  end
  true
end

#validate_timeout(timeout) ⇒ Object



165
166
167
168
169
# File 'lib/bolt/puppetdb/config.rb', line 165

def validate_timeout(timeout)
  unless @settings[timeout].nil? || (@settings[timeout].is_a?(Integer) && @settings[timeout] > 0)
    raise Bolt::PuppetDBError, "#{timeout} must be a positive integer, received #{@settings[timeout]}"
  end
end