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 +4 -4
- data/CHANGELOG.md +20 -0
- data/lib/legion/settings/agent_loader.rb +13 -1
- data/lib/legion/settings/dns_bootstrap.rb +16 -2
- data/lib/legion/settings/loader.rb +17 -9
- data/lib/legion/settings/resolver.rb +6 -3
- data/lib/legion/settings/version.rb +1 -1
- data/lib/legion/settings.rb +18 -6
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7ba8de24c7ad0a7bea6038f832835b24ee2cfdbb8a8605037dc7b1012ba75dbd
|
|
4
|
+
data.tar.gz: dc401a4a9643bc67d249d58b9491dd0694acd4e62ffa8c2c9c0f5be330319acc
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
|
193
|
-
|
|
194
|
-
|
|
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
|
-
|
|
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
|
|
data/lib/legion/settings.rb
CHANGED
|
@@ -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
|
-
|
|
96
|
+
if errors.empty?
|
|
97
|
+
logger.info('Settings validation passed')
|
|
98
|
+
return
|
|
99
|
+
end
|
|
92
100
|
|
|
93
|
-
|
|
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
|