Class: Bolt::Config
- Inherits:
-
Object
- Object
- Bolt::Config
- Defined in:
- lib/bolt/config.rb
Constant Summary collapse
- TRANSPORT_OPTIONS =
%i[password run-as sudo-password extensions sudo-executable private-key tty tmpdir user connect-timeout disconnect-timeout cacert token-file service-url interpreters file-protocol smb-port realm].freeze
- PUPPETFILE_OPTIONS =
%w[proxy forge].freeze
Instance Attribute Summary collapse
-
#boltdir ⇒ Object
Returns the value of attribute boltdir.
-
#color ⇒ Object
Returns the value of attribute color.
-
#compile_concurrency ⇒ Object
Returns the value of attribute compile_concurrency.
-
#concurrency ⇒ Object
Returns the value of attribute concurrency.
-
#format ⇒ Object
Returns the value of attribute format.
-
#future ⇒ Object
Returns the value of attribute future.
-
#inventoryfile ⇒ Object
Returns the value of attribute inventoryfile.
-
#log ⇒ Object
Returns the value of attribute log.
- #modulepath ⇒ Object
-
#plugin_hooks ⇒ Object
Returns the value of attribute plugin_hooks.
-
#plugins ⇒ Object
Returns the value of attribute plugins.
-
#puppetdb ⇒ Object
Returns the value of attribute puppetdb.
-
#puppetfile_config ⇒ Object
Returns the value of attribute puppetfile_config.
-
#save_rerun ⇒ Object
Returns the value of attribute save_rerun.
-
#trace ⇒ Object
Returns the value of attribute trace.
-
#transport ⇒ Object
Returns the value of attribute transport.
-
#transports ⇒ Object
Returns the value of attribute transports.
-
#trusted_external ⇒ Object
Returns the value of attribute trusted_external.
Class Method Summary collapse
- .default ⇒ Object
- .from_boltdir(boltdir, overrides = {}) ⇒ Object
- .from_file(configfile, overrides = {}) ⇒ Object
Instance Method Summary collapse
- #apply_overrides(options) ⇒ Object
- #casefold(path) ⇒ Object
-
#check_path_case(type, paths) ⇒ Object
Check if there is a case-insensitive match to the path.
- #deep_clone ⇒ Object
- #default_inventoryfile ⇒ Object
- #hiera_config ⇒ Object
-
#initialize(boltdir, config_data, overrides = {}) ⇒ Config
constructor
A new instance of Config.
- #matching_paths(paths) ⇒ Object
- #normalize_interpreters(interpreters) ⇒ Object
- #normalize_log(target) ⇒ Object
- #overwrite_transport_data(transport, transports) ⇒ Object
- #puppetfile ⇒ Object
- #rerunfile ⇒ Object
- #transport_conf ⇒ Object
- #transport_data_get ⇒ Object
- #update_from_inventory(data) ⇒ Object
- #update_logs(logs) ⇒ Object
- #update_transports(data) ⇒ Object
- #validate ⇒ Object
Constructor Details
#initialize(boltdir, config_data, overrides = {}) ⇒ Config
Returns a new instance of Config.
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/bolt/config.rb', line 61 def initialize(boltdir, config_data, overrides = {}) @logger = Logging.logger[self] @boltdir = boltdir @concurrency = 100 @compile_concurrency = Etc.nprocessors @transport = 'ssh' @format = 'human' @puppetdb = {} @color = true @save_rerun = true @puppetfile_config = {} @plugins = {} @plugin_hooks = {} # add an entry for the default console logger @log = { 'console' => {} } @transports = {} TRANSPORTS.each do |key, transport| @transports[key] = transport. end update_from_file(config_data) apply_overrides(overrides) validate end |
Instance Attribute Details
#boltdir ⇒ Object
Returns the value of attribute boltdir.
34 35 36 |
# File 'lib/bolt/config.rb', line 34 def boltdir @boltdir end |
#color ⇒ Object
Returns the value of attribute color.
34 35 36 |
# File 'lib/bolt/config.rb', line 34 def color @color end |
#compile_concurrency ⇒ Object
Returns the value of attribute compile_concurrency.
34 35 36 |
# File 'lib/bolt/config.rb', line 34 def compile_concurrency @compile_concurrency end |
#concurrency ⇒ Object
Returns the value of attribute concurrency.
34 35 36 |
# File 'lib/bolt/config.rb', line 34 def concurrency @concurrency end |
#format ⇒ Object
Returns the value of attribute format.
34 35 36 |
# File 'lib/bolt/config.rb', line 34 def format @format end |
#future ⇒ Object
Returns the value of attribute future.
34 35 36 |
# File 'lib/bolt/config.rb', line 34 def future @future end |
#inventoryfile ⇒ Object
Returns the value of attribute inventoryfile.
34 35 36 |
# File 'lib/bolt/config.rb', line 34 def inventoryfile @inventoryfile end |
#log ⇒ Object
Returns the value of attribute log.
34 35 36 |
# File 'lib/bolt/config.rb', line 34 def log @log end |
#modulepath ⇒ Object
264 265 266 |
# File 'lib/bolt/config.rb', line 264 def modulepath @modulepath || @boltdir.modulepath end |
#plugin_hooks ⇒ Object
Returns the value of attribute plugin_hooks.
34 35 36 |
# File 'lib/bolt/config.rb', line 34 def plugin_hooks @plugin_hooks end |
#plugins ⇒ Object
Returns the value of attribute plugins.
34 35 36 |
# File 'lib/bolt/config.rb', line 34 def plugins @plugins end |
#puppetdb ⇒ Object
Returns the value of attribute puppetdb.
34 35 36 |
# File 'lib/bolt/config.rb', line 34 def puppetdb @puppetdb end |
#puppetfile_config ⇒ Object
Returns the value of attribute puppetfile_config.
34 35 36 |
# File 'lib/bolt/config.rb', line 34 def puppetfile_config @puppetfile_config end |
#save_rerun ⇒ Object
Returns the value of attribute save_rerun.
34 35 36 |
# File 'lib/bolt/config.rb', line 34 def save_rerun @save_rerun end |
#trace ⇒ Object
Returns the value of attribute trace.
34 35 36 |
# File 'lib/bolt/config.rb', line 34 def trace @trace end |
#transport ⇒ Object
Returns the value of attribute transport.
34 35 36 |
# File 'lib/bolt/config.rb', line 34 def transport @transport end |
#transports ⇒ Object
Returns the value of attribute transports.
34 35 36 |
# File 'lib/bolt/config.rb', line 34 def transports @transports end |
#trusted_external ⇒ Object
Returns the value of attribute trusted_external.
34 35 36 |
# File 'lib/bolt/config.rb', line 34 def trusted_external @trusted_external end |
Class Method Details
.default ⇒ Object
45 46 47 |
# File 'lib/bolt/config.rb', line 45 def self.default new(Bolt::Boltdir.new('.'), {}) end |
.from_boltdir(boltdir, overrides = {}) ⇒ Object
49 50 51 52 |
# File 'lib/bolt/config.rb', line 49 def self.from_boltdir(boltdir, overrides = {}) data = Bolt::Util.read_config_file(nil, [boltdir.config_file], 'config') || {} new(boltdir, data, overrides) end |
.from_file(configfile, overrides = {}) ⇒ Object
54 55 56 57 58 59 |
# File 'lib/bolt/config.rb', line 54 def self.from_file(configfile, overrides = {}) boltdir = Bolt::Boltdir.new(Pathname.new(configfile)..dirname) data = Bolt::Util.read_config_file(configfile, [], 'config') || {} new(boltdir, data, overrides) end |
Instance Method Details
#apply_overrides(options) ⇒ Object
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 |
# File 'lib/bolt/config.rb', line 183 def apply_overrides() %i[concurrency transport format trace modulepath inventoryfile color].each do |key| send("#{key}=", [key]) if .key?(key) end @save_rerun = [:'save-rerun'] if .key?(:'save-rerun') if [:debug] @log['console'][:level] = :debug end @compile_concurrency = [:'compile-concurrency'] if [:'compile-concurrency'] TRANSPORTS.each_key do |transport| transport = @transports[transport] TRANSPORT_OPTIONS.each do |key| if [key] transport[key.to_s] = Bolt::Util.walk_keys([key], &:to_s) end end end if .key?(:ssl) # this defaults to true so we need to check the presence of the key @transports[:winrm]['ssl'] = [:ssl] end if .key?(:'ssl-verify') # this defaults to true so we need to check the presence of the key @transports[:winrm]['ssl-verify'] = [:'ssl-verify'] end if .key?(:'host-key-check') # this defaults to true so we need to check the presence of the key @transports[:ssh]['host-key-check'] = [:'host-key-check'] end end |
#casefold(path) ⇒ Object
324 325 326 327 328 |
# File 'lib/bolt/config.rb', line 324 def casefold(path) path.chars.map do |l| l =~ /[A-Za-z]/ ? "[#{l.upcase}#{l.downcase}]" : l end.join end |
#check_path_case(type, paths) ⇒ Object
Check if there is a case-insensitive match to the path
309 310 311 312 313 314 315 316 317 318 |
# File 'lib/bolt/config.rb', line 309 def check_path_case(type, paths) return if paths.nil? matches = matching_paths(paths) if matches.any? msg = "WARNING: Bolt is case sensitive when specifying a #{type}. Did you mean:\n" matches.each { |path| msg += " #{path}\n" } @logger.warn msg end end |
#deep_clone ⇒ Object
100 101 102 |
# File 'lib/bolt/config.rb', line 100 def deep_clone Bolt::Util.deep_clone(self) end |
#default_inventoryfile ⇒ Object
248 249 250 |
# File 'lib/bolt/config.rb', line 248 def default_inventoryfile [@boltdir.inventory_file] end |
#hiera_config ⇒ Object
256 257 258 |
# File 'lib/bolt/config.rb', line 256 def hiera_config @hiera_config || @boltdir.hiera_config end |
#matching_paths(paths) ⇒ Object
320 321 322 |
# File 'lib/bolt/config.rb', line 320 def matching_paths(paths) [*paths].map { |p| Dir.glob([p, casefold(p)]) }.flatten.uniq.reject { |p| [*paths].include?(p) } end |
#normalize_interpreters(interpreters) ⇒ Object
104 105 106 107 108 |
# File 'lib/bolt/config.rb', line 104 def normalize_interpreters(interpreters) Bolt::Util.walk_keys(interpreters) do |key| key.chars[0] == '.' ? key : '.' + key end end |
#normalize_log(target) ⇒ Object
110 111 112 113 114 115 116 117 118 |
# File 'lib/bolt/config.rb', line 110 def normalize_log(target) return target if target == 'console' target = target[5..-1] if target.start_with?('file:') if @future 'file:' + File.(target, @boltdir.path) else 'file:' + File.(target) end end |
#overwrite_transport_data(transport, transports) ⇒ Object
91 92 93 94 |
# File 'lib/bolt/config.rb', line 91 def overwrite_transport_data(transport, transports) @transport = transport @transports = transports end |
#puppetfile ⇒ Object
260 261 262 |
# File 'lib/bolt/config.rb', line 260 def puppetfile @boltdir.puppetfile end |
#rerunfile ⇒ Object
252 253 254 |
# File 'lib/bolt/config.rb', line 252 def rerunfile @boltdir.rerunfile end |
#transport_conf ⇒ Object
243 244 245 246 |
# File 'lib/bolt/config.rb', line 243 def transport_conf { transport: @transport, transports: @transports } end |
#transport_data_get ⇒ Object
96 97 98 |
# File 'lib/bolt/config.rb', line 96 def transport_data_get { transport: @transport, transports: @transports } end |
#update_from_inventory(data) ⇒ Object
218 219 220 |
# File 'lib/bolt/config.rb', line 218 def update_from_inventory(data) update_transports(data) end |
#update_logs(logs) ⇒ Object
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
# File 'lib/bolt/config.rb', line 120 def update_logs(logs) logs.each_pair do |k, v| log_name = normalize_log(k) @log[log_name] ||= {} log = @log[log_name] next unless v.is_a?(Hash) if v.key?('level') log[:level] = v['level'].to_s end if v.key?('append') log[:append] = v['append'] end end end |
#update_transports(data) ⇒ Object
222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 |
# File 'lib/bolt/config.rb', line 222 def update_transports(data) TRANSPORTS.each do |key, impl| if data[key.to_s] selected = impl.(data[key.to_s]) if @future = %w[private-key cacert token-file] & selected.keys .each do |opt| selected[opt] = File.(selected[opt], @boltdir.path) if selected[opt].is_a?(String) end end @transports[key] = Bolt::Util.deep_merge(@transports[key], selected) end if @transports[key]['interpreters'] @transports[key]['interpreters'] = normalize_interpreters(@transports[key]['interpreters']) end end @transport = data['transport'] if data.key?('transport') end |
#validate ⇒ Object
268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 |
# File 'lib/bolt/config.rb', line 268 def validate @log.each_pair do |name, params| if params.key?(:level) && !Bolt::Logger.valid_level?(params[:level]) raise Bolt::ValidationError, "level of log #{name} must be one of: #{Bolt::Logger.levels.join(', ')}; received #{params[:level]}" end if params.key?(:append) && params[:append] != true && params[:append] != false raise Bolt::ValidationError, "append flag of log #{name} must be a Boolean, received #{params[:append]}" end end unless @concurrency.is_a?(Integer) && @concurrency > 0 raise Bolt::ValidationError, 'Concurrency must be a positive integer' end unless @compile_concurrency.is_a?(Integer) && @compile_concurrency > 0 raise Bolt::ValidationError, 'Compile concurrency must be a positive integer' end compile_limit = 2 * Etc.nprocessors unless @compile_concurrency < compile_limit raise Bolt::ValidationError, "Compilation is CPU-intensive, set concurrency less than #{compile_limit}" end unless %w[human json].include? @format raise Bolt::ValidationError, "Unsupported format: '#{@format}'" end Bolt::Util.validate_file('hiera-config', @hiera_config) if @hiera_config Bolt::Util.validate_file('trusted-external-command', @trusted_external) if @trusted_external unless @transport.nil? || Bolt::TRANSPORTS.include?(@transport.to_sym) raise UnknownTransportError, @transport end TRANSPORTS.each do |transport, impl| impl.validate(@transports[transport]) end end |