legion-settings 1.3.10 → 1.3.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 30b9b4ed904f547eb9da80ede6133c372d136629c598d00ca768eaf8f4c92b4a
4
- data.tar.gz: 3f69fd7e055f4d5622c269daa1e2e47b853b04fab48496fb326217940cbca200
3
+ metadata.gz: 7ba8de24c7ad0a7bea6038f832835b24ee2cfdbb8a8605037dc7b1012ba75dbd
4
+ data.tar.gz: dc401a4a9643bc67d249d58b9491dd0694acd4e62ffa8c2c9c0f5be330319acc
5
5
  SHA512:
6
- metadata.gz: 3a6a57cbcdde3dc142e45b609f4559ac5a666adc19e8dc11a9eb93eb4bb53d78eddb202202e124e86f81d2b488a50a41935a9431b220484570ad112546c1207f
7
- data.tar.gz: 41e2b8cd7b1d3d4ca9e3f521ec58f9e2d06bbc946f45990b16e98c2ced2e5503f0ad295f3fcf02374107731d0cc0ec3c61c863f1bba3e211314d11f27699f726
6
+ metadata.gz: 97da463ddff3dd862e067c7ebde862816bec5458eae8a26b641a3880b6632fc91a8e38ad8622345246082a79fa43a35a1a949c0cb865e3bc5442e5bbfe80f1a9
7
+ data.tar.gz: 22389f94ef4afd6ef46883e9af3909be68f8f4e0ecc3921711734bd10c0477be893ea58dca0d88835b7db68547561101611ba39cfe851aa13a96c2d9eb32d001
data/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # Legion::Settings Changelog
2
2
 
3
+ ## [1.3.12] - 2026-03-22
4
+
5
+ ### Changed
6
+ - Added logging to all silent rescue blocks in settings.rb, loader.rb, resolver.rb, and dns_bootstrap.rb
7
+
8
+ ## [1.3.11] - 2026-03-22
9
+
10
+ ### Added
11
+ - `loader.rb`: debug logging on `load_directory` (file count), `load_module_settings`, and `load_module_default` (module name)
12
+ - `loader.rb`: warn logging in `start_dns_background_refresh`, `read_resolv_config`, and `detect_fqdn` rescue blocks
13
+ - `settings.rb`: info logging on successful load (file count), validate! success, and debug on resolve_secrets! completion
14
+ - `settings.rb`: warn logging before raising `ValidationError` in production mode
15
+ - `dns_bootstrap.rb`: warn on HTTP fetch failure, debug on cache hit, warn when corrupt cache is deleted
16
+ - `agent_loader.rb`: warn on file parse failure, debug on agent loaded
17
+
18
+ ## [1.3.10] - 2026-03-22
19
+
20
+ ### Added
21
+ - `extensions.parallel_pool_size` setting (default: 24) to control thread pool size for parallel extension loading
22
+
3
23
  ## [1.3.9] - 2026-03-21
4
24
 
5
25
  ### Added
@@ -17,6 +17,7 @@ module Legion
17
17
  definition = load_file(path)
18
18
  next unless definition && valid?(definition)
19
19
 
20
+ log_debug("Agent loaded: #{definition[:name]} (#{path})")
20
21
  definition.merge(_source_path: path, _source_mtime: File.mtime(path))
21
22
  end
22
23
  end
@@ -27,7 +28,8 @@ module Legion
27
28
  when '.yaml', '.yml' then YAML.safe_load(content, symbolize_names: true)
28
29
  when '.json' then ::JSON.parse(content, symbolize_names: true)
29
30
  end
30
- rescue StandardError
31
+ rescue StandardError => e
32
+ log_warn("Failed to parse agent file #{path}: #{e.message}")
31
33
  nil
32
34
  end
33
35
 
@@ -39,6 +41,16 @@ module Legion
39
41
 
40
42
  true
41
43
  end
44
+
45
+ private
46
+
47
+ def log_debug(message)
48
+ Legion::Logging.debug(message) if defined?(Legion::Logging)
49
+ end
50
+
51
+ def log_warn(message)
52
+ defined?(Legion::Logging) ? Legion::Logging.warn(message) : warn(message)
53
+ end
42
54
  end
43
55
  end
44
56
  end
@@ -27,7 +27,8 @@ module Legion
27
27
  def resolve?
28
28
  Resolv.getaddress(@hostname)
29
29
  true
30
- rescue Resolv::ResolvError, Resolv::ResolvTimeout
30
+ rescue Resolv::ResolvError, Resolv::ResolvTimeout => e
31
+ log_debug("Legion::Settings::DnsBootstrap#resolve? could not resolve #{@hostname}: #{e.message}")
31
32
  false
32
33
  end
33
34
 
@@ -43,7 +44,8 @@ module Legion
43
44
  return nil unless response.is_a?(Net::HTTPSuccess)
44
45
 
45
46
  ::JSON.parse(response.body, symbolize_names: true)
46
- rescue StandardError
47
+ rescue StandardError => e
48
+ log_warn("DNS bootstrap fetch failed for #{@url}: #{e.message}")
47
49
  nil
48
50
  end
49
51
 
@@ -65,9 +67,11 @@ module Legion
65
67
  return nil unless File.exist?(@cache_path)
66
68
 
67
69
  raw = ::JSON.parse(File.read(@cache_path), symbolize_names: true)
70
+ log_debug("DNS bootstrap cache hit: #{@cache_path}")
68
71
  raw.delete(:_dns_bootstrap_meta)
69
72
  raw
70
73
  rescue ::JSON::ParserError
74
+ log_warn("DNS bootstrap cache corrupt, deleting: #{@cache_path}")
71
75
  FileUtils.rm_f(@cache_path)
72
76
  nil
73
77
  end
@@ -75,6 +79,16 @@ module Legion
75
79
  def cache_exists?
76
80
  File.exist?(@cache_path)
77
81
  end
82
+
83
+ private
84
+
85
+ def log_debug(message)
86
+ Legion::Logging.debug(message) if defined?(Legion::Logging)
87
+ end
88
+
89
+ def log_warn(message)
90
+ defined?(Legion::Logging) ? Legion::Logging.warn(message) : warn(message)
91
+ end
78
92
  end
79
93
  end
80
94
  end
@@ -157,10 +157,14 @@ module Legion
157
157
  end
158
158
 
159
159
  def load_module_settings(config)
160
+ mod_name = config.keys.first
161
+ log_debug("Loading module settings: #{mod_name}")
160
162
  @settings = deep_merge(config, @settings)
161
163
  end
162
164
 
163
165
  def load_module_default(config)
166
+ mod_name = config.keys.first
167
+ log_debug("Loading module defaults: #{mod_name}")
164
168
  merged = deep_merge(@settings, config)
165
169
  deep_diff(@settings, merged) unless @loaded_files.empty?
166
170
  @settings = merged
@@ -189,9 +193,9 @@ module Legion
189
193
  def load_directory(directory)
190
194
  path = directory.gsub(/\\(?=\S)/, '/')
191
195
  if File.readable?(path) && File.executable?(path)
192
- Dir.glob(File.join(path, '**{,/*/**}/*.json')).uniq.each do |file|
193
- load_file(file)
194
- end
196
+ files = Dir.glob(File.join(path, '**{,/*/**}/*.json')).uniq
197
+ files.each { |file| load_file(file) }
198
+ log_debug("Loaded directory #{path}: #{files.size} files")
195
199
  else
196
200
  load_error('insufficient permissions for loading', directory: directory)
197
201
  end
@@ -252,8 +256,8 @@ module Legion
252
256
  Thread.new do
253
257
  fresh = bootstrap.fetch
254
258
  bootstrap.write_cache(fresh) if fresh
255
- rescue StandardError
256
- # Background refresh is best-effort
259
+ rescue StandardError => e
260
+ log_warn("DNS background refresh failed: #{e.message}")
257
261
  end
258
262
  end
259
263
 
@@ -355,7 +359,8 @@ module Legion
355
359
 
356
360
  def system_hostname
357
361
  Socket.gethostname
358
- rescue StandardError
362
+ rescue StandardError => e
363
+ Legion::Logging.debug("Legion::Settings::Loader#system_hostname failed: #{e.message}") if defined?(Legion::Logging)
359
364
  'unknown'
360
365
  end
361
366
 
@@ -363,7 +368,8 @@ module Legion
363
368
  Socket.ip_address_list.find do |address|
364
369
  address.ipv4? && !address.ipv4_loopback?
365
370
  end.ip_address
366
- rescue StandardError
371
+ rescue StandardError => e
372
+ Legion::Logging.debug("Legion::Settings::Loader#system_address failed: #{e.message}") if defined?(Legion::Logging)
367
373
  'unknown'
368
374
  end
369
375
 
@@ -400,7 +406,8 @@ module Legion
400
406
  search_domains: config[:search]&.map(&:to_s)&.uniq,
401
407
  nameservers: config[:nameserver]&.map(&:to_s)&.uniq
402
408
  }
403
- rescue StandardError
409
+ rescue StandardError => e
410
+ log_warn("Failed to read resolv config: #{e.message}")
404
411
  { search_domains: [], nameservers: [] }
405
412
  end
406
413
 
@@ -409,7 +416,8 @@ module Legion
409
416
  return nil if fqdn.nil?
410
417
 
411
418
  fqdn.include?('.') ? fqdn : nil
412
- rescue StandardError
419
+ rescue StandardError => e
420
+ log_warn("Failed to detect FQDN: #{e.message}")
413
421
  nil
414
422
  end
415
423
  end
@@ -98,7 +98,8 @@ module Legion
98
98
  return false unless defined?(Legion::Settings)
99
99
 
100
100
  Legion::Settings[:crypt][:vault][:connected] == true
101
- rescue StandardError
101
+ rescue StandardError => e
102
+ log_debug("Legion::Settings::Resolver#vault_connected? failed: #{e.message}")
102
103
  false
103
104
  end
104
105
 
@@ -164,7 +165,8 @@ module Legion
164
165
 
165
166
  def lease_manager_available?
166
167
  defined?(Legion::Crypt::LeaseManager)
167
- rescue StandardError
168
+ rescue StandardError => e
169
+ log_debug("Legion::Settings::Resolver#lease_manager_available? failed: #{e.message}")
168
170
  false
169
171
  end
170
172
 
@@ -180,7 +182,8 @@ module Legion
180
182
 
181
183
  path_parts = path_string.split('.').map(&:to_sym)
182
184
  Legion::Crypt::LeaseManager.instance.register_ref(m[1], m[2], path_parts)
183
- rescue StandardError
185
+ rescue StandardError => e
186
+ log_debug("Legion::Settings::Resolver#register_lease_ref failed for #{path_string}: #{e.message}")
184
187
  nil
185
188
  end
186
189
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Legion
4
4
  module Settings
5
- VERSION = '1.3.10'
5
+ VERSION = '1.3.12'
6
6
  end
7
7
  end
@@ -23,6 +23,7 @@ module Legion
23
23
  options[:config_dirs]&.each do |directory|
24
24
  @loader.load_directory(directory)
25
25
  end
26
+ logger.info("Settings loaded from #{@loader.loaded_files.size} files")
26
27
  @loader
27
28
  end
28
29
 
@@ -34,14 +35,16 @@ module Legion
34
35
  logger.info('Legion::Settings was not loading, auto loading now!') if @loader.nil?
35
36
  @loader = load if @loader.nil?
36
37
  @loader[key]
37
- rescue NoMethodError, TypeError
38
+ rescue NoMethodError, TypeError => e
39
+ Legion::Logging.debug("Legion::Settings#[] key=#{key} failed: #{e.message}") if defined?(Legion::Logging)
38
40
  nil
39
41
  end
40
42
 
41
43
  def dig(*keys)
42
44
  @loader = load if @loader.nil?
43
45
  @loader.dig(*keys)
44
- rescue NoMethodError, TypeError
46
+ rescue NoMethodError, TypeError => e
47
+ Legion::Logging.debug("Legion::Settings#dig keys=#{keys.inspect} failed: #{e.message}") if defined?(Legion::Logging)
45
48
  nil
46
49
  end
47
50
 
@@ -71,7 +74,8 @@ module Legion
71
74
  return true if ENV['LEGION_DEV'] == 'true'
72
75
 
73
76
  Legion::Settings[:dev] ? true : false
74
- rescue StandardError
77
+ rescue StandardError => e
78
+ Legion::Logging.debug("Legion::Settings#dev_mode? failed: #{e.message}") if defined?(Legion::Logging)
75
79
  false
76
80
  end
77
81
 
@@ -79,7 +83,8 @@ module Legion
79
83
  return true if ENV['LEGION_ENTERPRISE_PRIVACY'] == 'true'
80
84
 
81
85
  Legion::Settings[:enterprise_data_privacy] ? true : false
82
- rescue StandardError
86
+ rescue StandardError => e
87
+ Legion::Logging.debug("Legion::Settings#enterprise_privacy? failed: #{e.message}") if defined?(Legion::Logging)
83
88
  false
84
89
  end
85
90
 
@@ -88,9 +93,15 @@ module Legion
88
93
  revalidate_all_modules
89
94
  run_cross_validations
90
95
  detect_unknown_keys
91
- return if errors.empty?
96
+ if errors.empty?
97
+ logger.info('Settings validation passed')
98
+ return
99
+ end
92
100
 
93
- raise ValidationError, errors unless dev_mode?
101
+ unless dev_mode?
102
+ logger.warn("Settings validation failed with #{errors.size} error(s)")
103
+ raise ValidationError, errors
104
+ end
94
105
 
95
106
  warn_validation_errors(errors)
96
107
  end
@@ -99,6 +110,7 @@ module Legion
99
110
  @loader = load if @loader.nil?
100
111
  require 'legion/settings/resolver'
101
112
  Resolver.resolve_secrets!(@loader.to_hash)
113
+ logger.debug('Secret resolution complete')
102
114
  end
103
115
 
104
116
  def schema
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: legion-settings
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.10
4
+ version: 1.3.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Esity