config_skeleton 0.3.1 → 0.4.0

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: 6a58d74e2627a2f4f0ac79fa05c9ce07d2b17b8500af7e38d59fd7a33ac22fe7
4
- data.tar.gz: 8b1d8531cc3fcc1183d14c465b886833b97130326d891b9da00ef05780b36a2c
3
+ metadata.gz: 065e0e44c1b485dc5b32c9466cb68bd9f3c8c3af8704489a0f747951b714347c
4
+ data.tar.gz: 48518976b9d43abc868a0f1f8b6cb1a2ecefca7274f11d0be6578f035e7e1400
5
5
  SHA512:
6
- metadata.gz: 351a846e41802b033bb217d3a574a5a8a18633cc51845313d15ef41220c036a92d068a6959fde5eea4fb25b8586974baf6e02ea62369342d911de5023bcc0863
7
- data.tar.gz: ebbf67d572a03b463b40e0e359446fd1e76d64ad4a0200556ffb78a425130aebf0876c23b0090e9770c9b6921a0e370d22d9e11520ad875b12b59d95671d4e2b
6
+ metadata.gz: 7985e2e04988415a4435d25b233d4515256ca7c352fe9a2df9038d912e8448f1bc26ac582de28f7d39400936165856b31c4a914e7a872ea999dd53ed5debf1dc
7
+ data.tar.gz: 5a684bf24de1bcc0a8d2fc85b34a335c33c997f747787b02d870b8b5b0b19b87200d362d804752865377b75ec21352a8bd4fc655bf95d95e5d6f16628fb22e05
@@ -1,14 +1,14 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "config_skeleton"
3
3
 
4
- s.version = "0.3.1"
4
+ s.version = "0.4.0"
5
5
 
6
6
  s.platform = Gem::Platform::RUBY
7
7
 
8
8
  s.summary = "Dynamically generate configs and reload servers"
9
9
 
10
- s.authors = ["Matt Palmer"]
11
- s.email = ["matt.palmer@discourse.org"]
10
+ s.authors = ["Matt Palmer", "Discourse Team"]
11
+ s.email = ["matt.palmer@discourse.org", "team@discourse.org"]
12
12
  s.homepage = "https://github.com/discourse/config_skeleton"
13
13
 
14
14
  s.files = `git ls-files -z`.split("\0").reject { |f| f =~ /^(G|spec|Rakefile)/ }
@@ -5,6 +5,7 @@ require 'logger'
5
5
  require 'rb-inotify'
6
6
  require 'service_skeleton'
7
7
  require 'tempfile'
8
+ require 'digest/md5'
8
9
 
9
10
  # Framework for creating config generation systems.
10
11
  #
@@ -23,8 +24,7 @@ require 'tempfile'
23
24
  #
24
25
  # 1. Implement service-specific config generation and reloading code, by
25
26
  # overriding the private methods #config_file, #config_data, and #reload_server
26
- # (and also potentially #config_ok?, #sleep_duration, #before_regenerate_config, and
27
- # #after_regenerate_config).
27
+ # (and also potentially #config_ok?, #sleep_duration, #before_regenerate_config, and #after_regenerate_config).
28
28
  # See the documentation for those methods for what they need to do.
29
29
  #
30
30
  # 1. Setup any file watchers you want with .watch and #watch.
@@ -366,16 +366,23 @@ class ConfigSkeleton < ServiceSkeleton
366
366
  # Run code before the config is regenerated and the config_file
367
367
  # is written.
368
368
  #
369
+ # @param force_reload [Boolean] Whether the regenerate_config was called with force_reload
370
+ # @param existing_config_hash [String] MD5 hash of the config file before regeneration.
371
+ #
369
372
  # @note this can optionally be implemented by subclasses.
370
373
  #
371
- def before_regenerate_config(force_reload); end
374
+ def before_regenerate_config(force_reload:, existing_config_hash:); end
372
375
 
373
- # Run code after the config is regenerated and if the regeneration
374
- # was forced the new config has been cycled in.
376
+ # Run code after the config is regenerated and potentially a new file is written.
377
+ #
378
+ # @param force_reload [Boolean] Whether the regenerate_config was called with force_reload
379
+ # @param config_was_different [Boolean] Whether the diff of the old and new config was different.
380
+ # @param config_was_cycled [Boolean] Whether a new config file was cycled in.
381
+ # @param new_config_hash [String] MD5 hash of the new config file after write.
375
382
  #
376
383
  # @note this can optionally be implemented by subclasses.
377
384
  #
378
- def after_regenerate_config(force_reload); end
385
+ def after_regenerate_config(force_reload:, config_was_different:, config_was_cycled:, new_config_hash:); end
379
386
 
380
387
  # Verify that the currently running config is acceptable.
381
388
  #
@@ -458,7 +465,8 @@ class ConfigSkeleton < ServiceSkeleton
458
465
  # @return [void]
459
466
  #
460
467
  def regenerate_config(force_reload: false)
461
- before_regenerate_config(force_reload)
468
+ existing_config_hash = Digest::MD5.hexdigest(File.read(config_file))
469
+ before_regenerate_config(force_reload: force_reload, existing_config_hash: existing_config_hash)
462
470
 
463
471
  logger.debug(logloc) { "force? #{force_reload.inspect}" }
464
472
  tmpfile = Tempfile.new(service_name, File.dirname(config_file))
@@ -466,25 +474,38 @@ class ConfigSkeleton < ServiceSkeleton
466
474
  unless (new_config = instrumented_config_data).nil?
467
475
  File.write(tmpfile.path, new_config)
468
476
  tmpfile.close
469
- logger.debug(logloc) { require 'digest/md5'; "Existing config hash: #{Digest::MD5.hexdigest(File.read(config_file))}, new config hash: #{Digest::MD5.hexdigest(File.read(tmpfile.path))}" }
477
+
478
+ new_config_hash = Digest::MD5.hexdigest(File.read(tmpfile.path))
479
+ logger.debug(logloc) do
480
+ "Existing config hash: #{existing_config_hash}, new config hash: #{new_config_hash}"
481
+ end
470
482
 
471
483
  match_perms(config_file, tmpfile.path)
472
484
 
473
- diff = Diffy::Diff.new(config_file, tmpfile.path, source: 'files', context: 3, include_diff_info: true)
474
- if diff.to_s != ""
475
- logger.info(logloc) { "Config has changed. Diff:\n#{diff.to_s}" }
485
+ diff = Diffy::Diff.new(config_file, tmpfile.path, source: 'files', context: 3, include_diff_info: true).to_s
486
+ config_was_different = diff != ""
487
+
488
+ if config_was_different
489
+ logger.info(logloc) { "Config has changed. Diff:\n#{diff}" }
476
490
  end
477
491
 
478
492
  if force_reload
479
493
  logger.debug(logloc) { "Forcing config reload because force_reload == true" }
480
494
  end
481
495
 
482
- if force_reload || diff.to_s != ""
496
+ config_was_cycled = false
497
+ if force_reload || config_was_different
483
498
  cycle_config(tmpfile.path)
499
+ config_was_cycled = true
484
500
  end
485
501
  end
486
502
 
487
- after_regenerate_config(force_reload)
503
+ after_regenerate_config(
504
+ force_reload: force_reload,
505
+ config_was_different: config_was_different,
506
+ config_was_cycled: config_was_cycled,
507
+ new_config_hash: new_config_hash
508
+ )
488
509
  ensure
489
510
  metrics.last_change_timestamp.set({}, File.stat(config_file).mtime.to_f)
490
511
  tmpfile.close rescue nil
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: config_skeleton
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Palmer
8
+ - Discourse Team
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2020-11-27 00:00:00.000000000 Z
12
+ date: 2020-12-01 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: diffy
@@ -195,6 +196,7 @@ dependencies:
195
196
  description:
196
197
  email:
197
198
  - matt.palmer@discourse.org
199
+ - team@discourse.org
198
200
  executables: []
199
201
  extensions: []
200
202
  extra_rdoc_files: []