foreman_maintain 0.4.5 → 0.4.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: c4ff15bf113b8dc5c9bc105d245fae484cac3e93
4
- data.tar.gz: c62005960774cf6df93fa6f8d5acf0b16fa3750b
2
+ SHA256:
3
+ metadata.gz: 0ec1d3cb6c78f4404fb0983479df446a46a5814428842c630f9723be36e58863
4
+ data.tar.gz: b156422372ca41f5ebec896fe24c929c96cef1577576f4abf768938b6776d910
5
5
  SHA512:
6
- metadata.gz: 0e9f94074cd0fd7bbcbaaf2f8664a0922a9018088b283e7aca1d104fb8771bed8c7ca8d21eb3f59743832135d4ec0e731229169b01df1eca787e4b938e0c77cc
7
- data.tar.gz: 781471467f7530d25e051d6e5c838cb3a369df87b35a13931ffe2bea8aa146595eb5e1c26c7be9a7a919d79a0c7fdfaa4b6a64a418f7f1d644593a45697f6a0e
6
+ metadata.gz: 2df8afaa92f8871b3f3b59db30ec321af277059f0631a3ad2a54f064bf5067463160a209b7d7c1bc6fb15b83b30ac15015977fdf96621200b0eec87d690bcfd1
7
+ data.tar.gz: c30552fdc8e0c3ae64625d5504bbf894b134c50f77be98d3c42c3cfb751c61104f4ad391d88e4dc63b2b86163cb2b2a3e610e636d6be43d33253e463145e93dd
@@ -0,0 +1,42 @@
1
+ module Checks
2
+ module Foreman
3
+ class CheckDuplicateRoles < ForemanMaintain::Check
4
+ metadata do
5
+ label :duplicate_roles
6
+ for_feature :foreman_database
7
+ description 'Check for duplicate roles from DB'
8
+ tags :pre_upgrade
9
+ confine do
10
+ check_max_version('foreman', '1.20')
11
+ end
12
+ end
13
+
14
+ def run
15
+ duplicate_roles = find_duplicate_roles
16
+ roles_names = duplicate_roles.map { |r| r['name'] }.uniq
17
+ assert(
18
+ duplicate_roles.empty?,
19
+ "Duplicate entries found for role(s) - #{roles_names.join(', ')} in your DB",
20
+ :next_steps => [
21
+ Procedures::Foreman::RemoveDuplicateObsoleteRoles.new,
22
+ Procedures::KnowledgeBaseArticle.new(
23
+ :doc => 'fix_db_migrate_failure_on_duplicate_roles'
24
+ )
25
+ ]
26
+ )
27
+ end
28
+
29
+ def find_duplicate_roles
30
+ feature(:foreman_database).query(self.class.query_to_get_duplicate_roles)
31
+ end
32
+
33
+ def self.query_to_get_duplicate_roles
34
+ <<-SQL
35
+ SELECT r.id, r.name FROM roles r JOIN (
36
+ SELECT name, COUNT(*) FROM roles GROUP BY name HAVING count(*) > 1
37
+ ) dr ON r.name = dr.name ORDER BY r.name
38
+ SQL
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,22 @@
1
+ class Checks::OriginalAssets < ForemanMaintain::Check
2
+ metadata do
3
+ description 'Check if only installed assets are present on the system'
4
+ tags :post_upgrade
5
+ end
6
+
7
+ ASSETS_DIR = '/var/lib/foreman/public/assets'.freeze
8
+
9
+ def run
10
+ custom_assets = []
11
+ product_name = feature(:instance).product_name
12
+ with_spinner('Checking for presence of non-original assets...') do
13
+ custom_assets = feature(:package_manager).files_not_owned_by_package(ASSETS_DIR)
14
+ logger.info("Non-original assets detected:\n" + custom_assets.join("\n"))
15
+ end
16
+ remove_files = Procedures::Files::Remove.new(:files => custom_assets, :assumeyes => true)
17
+ assert(custom_assets.empty?,
18
+ "Some assets not owned by #{product_name} were detected on the system.\n" \
19
+ 'Possible conflicting versions can affect operation of the Web UI.',
20
+ :next_steps => remove_files)
21
+ end
22
+ end
@@ -73,6 +73,10 @@ class Features::ForemanProxy < ForemanMaintain::Feature
73
73
  configs
74
74
  end
75
75
 
76
+ def config_files_to_exclude(_for_features = ['all'])
77
+ []
78
+ end
79
+
76
80
  def content_module
77
81
  return @content_module if @content_module_detected
78
82
  @content_module_detected = true
@@ -35,6 +35,12 @@ module ForemanMaintain
35
35
  '/var/lib/foreman'
36
36
  ]
37
37
  end
38
+
39
+ def config_files_to_exclude
40
+ [
41
+ '/var/lib/foreman/public/assets'
42
+ ]
43
+ end
38
44
  end
39
45
  end
40
46
  end
@@ -28,7 +28,7 @@ class Features::Hammer < ForemanMaintain::Feature
28
28
  def setup_admin_access
29
29
  return true if check_connection
30
30
  logger.info('Hammer setup is not valid. Fixing configuration.')
31
- custom_config = { :foreman => { :username => 'admin' } }
31
+ custom_config = { :foreman => { :username => username } }
32
32
  custom_config = on_invalid_host(custom_config)
33
33
  custom_config = on_missing_password(custom_config) # get password from answers
34
34
  custom_config = on_invalid_password(custom_config) # get password from answers
@@ -82,10 +82,11 @@ class Features::Hammer < ForemanMaintain::Feature
82
82
  end
83
83
 
84
84
  def on_invalid_password(custom_config)
85
- if !ready? && custom_config[:foreman][:password].nil?
85
+ admin_password = password_from_answers(custom_config[:foreman][:username])
86
+ if !ready? && custom_config[:foreman][:password] != admin_password
86
87
  msg = 'Invalid admin password was found in hammer configs. Looking into installer answers'
87
88
  logger.info(msg)
88
- custom_config[:foreman][:password] = password_from_answers
89
+ custom_config[:foreman][:password] = admin_password
89
90
  save_config_and_check(custom_config)
90
91
  end
91
92
  custom_config
@@ -99,7 +100,8 @@ class Features::Hammer < ForemanMaintain::Feature
99
100
 
100
101
  def config_error
101
102
  raise ForemanMaintain::HammerConfigurationError, 'Hammer configuration failed: '\
102
- "Is the admin password correct? (it was stored in #{custom_config_file})" \
103
+ 'Is the admin credential from the file' \
104
+ " #{custom_config_file} correct?\n" \
103
105
  'Is the server down?'
104
106
  end
105
107
 
@@ -107,7 +109,7 @@ class Features::Hammer < ForemanMaintain::Feature
107
109
  if admin_password_missing?
108
110
  msg = 'Admin password was not found in hammer configs. Looking into installer answers'
109
111
  logger.info(msg)
110
- custom_config[:foreman][:password] = password_from_answers
112
+ custom_config[:foreman][:password] = password_from_answers(custom_config[:foreman][:username])
111
113
  end
112
114
  save_config_and_check(custom_config)
113
115
  custom_config
@@ -116,7 +118,7 @@ class Features::Hammer < ForemanMaintain::Feature
116
118
  def admin_password_missing?
117
119
  configuration[:foreman][:password].nil? ||
118
120
  configuration[:foreman][:password].empty? ||
119
- configuration[:foreman][:username] != 'admin'
121
+ configuration[:foreman][:username] != username
120
122
  end
121
123
 
122
124
  def exec_hammer_cmd(cmd, required_json = false)
@@ -148,9 +150,15 @@ class Features::Hammer < ForemanMaintain::Feature
148
150
  end
149
151
  end
150
152
 
151
- def password_from_answers
153
+ def username
154
+ return 'admin' unless feature(:installer)
155
+ feature(:installer).initial_admin_username
156
+ end
157
+
158
+ def password_from_answers(config_username)
152
159
  return nil unless feature(:installer)
153
- feature(:installer).answers['foreman']['admin_password']
160
+ return nil unless config_username == feature(:installer).initial_admin_username
161
+ feature(:installer).initial_admin_password
154
162
  end
155
163
 
156
164
  def save_config_and_check(config)
@@ -93,6 +93,16 @@ class Features::Installer < ForemanMaintain::Feature
93
93
  run(arguments, exec_options)
94
94
  end
95
95
 
96
+ def initial_admin_username
97
+ feature(:installer).answers['foreman']['initial_admin_username'] ||
98
+ feature(:installer).answers['foreman']['admin_username']
99
+ end
100
+
101
+ def initial_admin_password
102
+ feature(:installer).answers['foreman']['initial_admin_password'] ||
103
+ feature(:installer).answers['foreman']['admin_password']
104
+ end
105
+
96
106
  private
97
107
 
98
108
  def load_answers(config)
@@ -8,7 +8,7 @@ class Features::PackageManager < ForemanMaintain::Feature
8
8
  :installed?, :find_installed_package, :install, :update,
9
9
  :version_locking_enabled?, :configure_version_locking,
10
10
  :foreman_related_packages, :version_locking_packages,
11
- :versions_locked?, :clean_cache, :remove
11
+ :versions_locked?, :clean_cache, :remove, :files_not_owned_by_package
12
12
 
13
13
  def self.type
14
14
  @type ||= %w[dnf yum apt].find { |manager| command_present?(manager) }
@@ -18,7 +18,10 @@ class Features::Tar < ForemanMaintain::Feature
18
18
  # @option options [Boolean] :multi_volume create/list/extract multi-volume archive
19
19
  # @option options [Boolean] :overwrite overwrite existing files when extracting
20
20
  # @option options [Boolean] :gzip filter the archive through gzip
21
+ # @option options [Boolean] :ignore_failed_read do not fail on missing files
22
+ # @option options [Boolean] :allow_changing_files do not fail on changing files
21
23
  # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
24
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
22
25
  def run(options = {})
23
26
  volume_size = options.fetch(:volume_size, nil)
24
27
  validate_volume_size(volume_size) unless volume_size.nil?
@@ -51,15 +54,19 @@ class Features::Tar < ForemanMaintain::Feature
51
54
  tar_command << '-M' if options[:multi_volume]
52
55
  tar_command << "--directory=#{options[:directory]}" if options[:directory]
53
56
 
57
+ tar_command << '--ignore-failed-read' if options[:ignore_failed_read]
58
+
54
59
  if options[:files]
55
60
  tar_command << '-S'
56
61
  tar_command << options.fetch(:files, '*')
57
62
  end
58
63
 
59
- logger.debug("Invoking tar from #{FileUtils.pwd}")
60
- execute!(tar_command.join(' '))
64
+ logger.debug("Invoking tar from #{options[:directory] || FileUtils.pwd}")
65
+ statuses = options[:allow_changing_files] ? [0, 1] : [0]
66
+ execute!(tar_command.join(' '), :valid_exit_statuses => statuses)
61
67
  end
62
68
  # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
69
+ # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
63
70
 
64
71
  def validate_volume_size(size)
65
72
  if size.nil? || size !~ /^\d+[bBcGKkMPTw]?$/
@@ -19,21 +19,36 @@ module Procedures::Backup
19
19
  tarball = File.join(@backup_dir, 'config_files.tar.gz')
20
20
  increments = File.join(@backup_dir, '.config.snar')
21
21
  with_spinner('Collecting config files to backup') do
22
- configs = config_files.join(' ')
23
- statuses = @ignore_changed_files ? [0, 1] : [0]
24
- execute!("tar --selinux --create --gzip --file=#{tarball} " \
25
- "--listed-incremental=#{increments} --ignore-failed-read " \
26
- "#{configs}", :valid_exit_statuses => statuses)
22
+ configs, to_exclude = config_files
23
+ feature(:tar).run(
24
+ :command => 'create', :gzip => true, :archive => tarball,
25
+ :listed_incremental => increments, :ignore_failed_read => true,
26
+ :exclude => to_exclude, :allow_changing_files => @ignore_changed_files,
27
+ :files => configs.join(' ')
28
+ )
27
29
  end
28
30
  end
29
31
 
32
+ # rubocop:disable Metrics/AbcSize
30
33
  def config_files
31
34
  configs = []
32
- # exclude proxy as it has special handling later
33
- features = ForemanMaintain.available_features - [feature(:foreman_proxy)]
34
- configs += features.inject([]) { |files, feature| files + feature.config_files }
35
- configs += feature(:foreman_proxy).config_files(@proxy_features) if feature(:foreman_proxy)
35
+ exclude_configs = []
36
+ ForemanMaintain.available_features.each do |feature|
37
+ # exclude proxy as it has special handling later
38
+ next if feature == feature(:foreman_proxy)
39
+ configs += feature.config_files
40
+ exclude_configs += feature.config_files_to_exclude
41
+ end
42
+
43
+ if feature(:foreman_proxy)
44
+ configs += feature(:foreman_proxy).config_files(@proxy_features)
45
+ exclude_configs += feature(:foreman_proxy).config_files_to_exclude(@proxy_features)
46
+ end
47
+
36
48
  configs.compact.select { |path| Dir.glob(path).any? }
49
+ exclude_configs.compact.select { |path| Dir.glob(path).any? }
50
+ [configs, exclude_configs]
37
51
  end
52
+ # rubocop:enable Metrics/AbcSize
38
53
  end
39
54
  end
@@ -0,0 +1,13 @@
1
+ module Procedures::Files
2
+ class Remove < ForemanMaintain::Procedure
3
+ metadata do
4
+ description 'Remove the files'
5
+ param :files, 'Files to remove', :array => true
6
+ param :assumeyes, 'Do not ask for confirmation', :default => false
7
+ end
8
+
9
+ def run
10
+ FileUtils.rm_r(@files, :force => @assumeyes, :secure => true)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,64 @@
1
+ module Procedures::Foreman
2
+ class RemoveDuplicateObsoleteRoles < ForemanMaintain::Procedure
3
+ metadata do
4
+ for_feature :foreman_database
5
+ description 'Remove duplicate obsolete roles from DB'
6
+ confine do
7
+ check_max_version('foreman', '1.20')
8
+ end
9
+ end
10
+
11
+ def run
12
+ duplicate_roles = feature(:foreman_database).query(
13
+ Checks::Foreman::CheckDuplicateRoles.query_to_get_duplicate_roles
14
+ )
15
+ roles_hash = duplicate_roles.each_with_object({}) do |role_rec, new_obj|
16
+ r_name = role_rec['name']
17
+ new_obj[r_name] = [] unless new_obj.key?(r_name)
18
+ new_obj[r_name] << role_rec['id'].to_i
19
+ end
20
+ duplicate_role_ids = filter_consumed_roles(roles_hash)
21
+ remove_obsolete_role_records(duplicate_role_ids) unless duplicate_role_ids.empty?
22
+ end
23
+
24
+ private
25
+
26
+ def filter_consumed_roles(roles_hash)
27
+ consumed_role_ids = find_consumed_role_ids
28
+ roles_hash.values.map do |ids|
29
+ consumed_ids = ids & consumed_role_ids
30
+ if consumed_ids.count == 1
31
+ ids -= consumed_ids
32
+ elsif consumed_ids.count > 1
33
+ ids -= consumed_ids
34
+ update_duplicate_consumed_roles(consumed_ids)
35
+ elsif ids.length > 1
36
+ ids.delete(ids.min)
37
+ end
38
+ ids
39
+ end.flatten
40
+ end
41
+
42
+ def find_consumed_role_ids
43
+ feature(:foreman_database).query(<<-SQL).map { |r| r['role_id'].to_i }
44
+ select DISTINCT(role_id) role_id from user_roles
45
+ SQL
46
+ end
47
+
48
+ def update_duplicate_consumed_roles(role_ids)
49
+ logger.info("Updating name of duplicate consumed roles using id(s): #{role_ids.join(', ')}")
50
+
51
+ feature(:foreman_database).psql(<<-SQL)
52
+ UPDATE roles set name = concat(name, ' - ', id) where id in (#{role_ids.join(', ')})
53
+ SQL
54
+ end
55
+
56
+ def remove_obsolete_role_records(role_ids)
57
+ feature(:foreman_database).psql(<<-SQL)
58
+ BEGIN;
59
+ DELETE from roles r where r.id IN (#{role_ids.join(', ')});
60
+ COMMIT;
61
+ SQL
62
+ end
63
+ end
64
+ end
@@ -24,6 +24,7 @@ class Procedures::KnowledgeBaseArticle < ForemanMaintain::Procedure
24
24
  def kcs_documents
25
25
  {
26
26
  'fix_cpdb_validate_failure' => 'https://access.redhat.com/solutions/3362821',
27
+ 'fix_db_migrate_failure_on_duplicate_roles' => 'https://access.redhat.com/solutions/3998941',
27
28
  'upgrade_puppet_guide_for_sat63' => 'https://access.redhat.com/documentation/en-us/red_hat_satellite/6.3/html/upgrading_and_updating_red_hat_satellite/upgrading_puppet-1'
28
29
  }
29
30
  end
@@ -19,13 +19,17 @@ module Procedures::Restore
19
19
  end
20
20
 
21
21
  def restore_configs(backup)
22
+ exclude = ForemanMaintain.available_features.each_with_object([]) do |feat, cfgs|
23
+ feat.config_files_to_exclude.each { |f| cfgs << f.gsub(%r{^/}, '') }
24
+ end
22
25
  tar_options = {
23
26
  :overwrite => true,
24
27
  :listed_incremental => '/dev/null',
25
28
  :command => 'extract',
26
29
  :directory => '/',
27
30
  :archive => backup.file_map[:config_files][:path],
28
- :gzip => true
31
+ :gzip => true,
32
+ :exclude => exclude
29
33
  }
30
34
 
31
35
  feature(:tar).run(tar_options)
@@ -35,5 +35,11 @@ module ForemanMaintain
35
35
  def config_files
36
36
  []
37
37
  end
38
+
39
+ # list of config files to be excluded from the list of config files.
40
+ # Can be used to exclude subdir from whole config directory
41
+ def config_files_to_exclude
42
+ []
43
+ end
38
44
  end
39
45
  end
@@ -66,6 +66,11 @@ module ForemanMaintain::PackageManager
66
66
  raise NotImplementedError
67
67
  end
68
68
 
69
+ # list all files not owned by installed package
70
+ def files_not_owned_by_package(directory)
71
+ raise NotImplementedError
72
+ end
73
+
69
74
  private
70
75
 
71
76
  def sys
@@ -102,6 +102,11 @@ module ForemanMaintain::PackageManager
102
102
  yum_action('clean', 'all')
103
103
  end
104
104
 
105
+ def files_not_owned_by_package(directory)
106
+ find_cmd = "find #{directory} -exec /bin/sh -c 'rpm -qf {} &> /dev/null || echo {}' \\;"
107
+ sys.execute(find_cmd).split("\n")
108
+ end
109
+
105
110
  private
106
111
 
107
112
  def versionlock_config
@@ -31,6 +31,7 @@ module ForemanMaintain
31
31
  @scenarios.each do |scenario|
32
32
  run_scenario(scenario)
33
33
  next unless @quit
34
+
34
35
  if @rescue_scenario
35
36
  logger.debug('=== Rescue scenario found. Executing ===')
36
37
  execute_scenario_steps(@rescue_scenario, true)
@@ -60,6 +61,7 @@ module ForemanMaintain
60
61
 
61
62
  def confirm_scenario(scenario)
62
63
  return unless @last_scenario
64
+
63
65
  decision = if @last_scenario.steps_with_error(:whitelisted => false).any? ||
64
66
  @last_scenario.steps_with_abort(:whitelisted => false).any?
65
67
  :quit
@@ -92,8 +94,9 @@ module ForemanMaintain
92
94
 
93
95
  def execute_scenario_steps(scenario, force = false)
94
96
  scenario.before_scenarios.flatten.each { |before_scenario| run_scenario(before_scenario) }
95
- confirm_scenario(scenario)
97
+ confirm_scenario(scenario) if @rescue_scenario
96
98
  return if !force && quit? # the before scenarios caused the stop of the execution
99
+
97
100
  @reporter.before_scenario_starts(scenario)
98
101
  run_steps(scenario, scenario.steps)
99
102
  @reporter.after_scenario_finishes(scenario)
@@ -1,3 +1,3 @@
1
1
  module ForemanMaintain
2
- VERSION = '0.4.5'.freeze
2
+ VERSION = '0.4.6'.freeze
3
3
  end
metadata CHANGED
@@ -1,97 +1,97 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_maintain
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.5
4
+ version: 0.4.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Nečas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-07-11 00:00:00.000000000 Z
11
+ date: 2019-08-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: clamp
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: highline
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '1.3'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.3'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: minitest
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: mocha
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '>='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rake
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - <
87
+ - - "<"
88
88
  - !ruby/object:Gem::Version
89
89
  version: 11.0.0
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - <
94
+ - - "<"
95
95
  - !ruby/object:Gem::Version
96
96
  version: 11.0.0
97
97
  description: Provides various features that helps keeping the Foreman/Satellite up
@@ -107,101 +107,41 @@ extra_rdoc_files:
107
107
  - LICENSE
108
108
  - README.md
109
109
  files:
110
+ - LICENSE
111
+ - README.md
110
112
  - bin/foreman-maintain
111
113
  - bin/foreman-maintain-complete
112
114
  - bin/foreman-maintain-rotate-tar
113
115
  - bin/passenger-recycler
114
- - lib/foreman_maintain/check.rb
115
- - lib/foreman_maintain/cli/advanced/procedure/abstract_by_tag_command.rb
116
- - lib/foreman_maintain/cli/advanced/procedure/abstract_procedure_command.rb
117
- - lib/foreman_maintain/cli/advanced/procedure/by_tag_command.rb
118
- - lib/foreman_maintain/cli/advanced/procedure/run_command.rb
119
- - lib/foreman_maintain/cli/advanced/procedure_command.rb
120
- - lib/foreman_maintain/cli/advanced/prebuild_bash_completion.rb
121
- - lib/foreman_maintain/cli/health_command.rb
122
- - lib/foreman_maintain/cli/upgrade_command.rb
123
- - lib/foreman_maintain/cli/advanced_command.rb
124
- - lib/foreman_maintain/cli/restore_command.rb
125
- - lib/foreman_maintain/cli/transform_clamp_options.rb
126
- - lib/foreman_maintain/cli/base.rb
127
- - lib/foreman_maintain/cli/maintenance_mode_command.rb
128
- - lib/foreman_maintain/cli/packages_command.rb
129
- - lib/foreman_maintain/cli/backup_command.rb
130
- - lib/foreman_maintain/cli/service_command.rb
131
- - lib/foreman_maintain/concerns/logger.rb
132
- - lib/foreman_maintain/concerns/scenario_metadata.rb
133
- - lib/foreman_maintain/concerns/hammer.rb
134
- - lib/foreman_maintain/concerns/reporter.rb
135
- - lib/foreman_maintain/concerns/base_database.rb
136
- - lib/foreman_maintain/concerns/finders.rb
137
- - lib/foreman_maintain/concerns/directory_marker.rb
138
- - lib/foreman_maintain/concerns/system_service.rb
139
- - lib/foreman_maintain/concerns/metadata.rb
140
- - lib/foreman_maintain/concerns/system_helpers.rb
141
- - lib/foreman_maintain/csv_parser.rb
142
- - lib/foreman_maintain/dependency_graph.rb
143
- - lib/foreman_maintain/procedure.rb
144
- - lib/foreman_maintain/reporter/cli_reporter.rb
145
- - lib/foreman_maintain/runner/stored_execution.rb
146
- - lib/foreman_maintain/runner/execution.rb
147
- - lib/foreman_maintain/top_level_modules.rb
148
- - lib/foreman_maintain/utils/curl_response.rb
149
- - lib/foreman_maintain/utils/disk/nil_device.rb
150
- - lib/foreman_maintain/utils/disk/stats.rb
151
- - lib/foreman_maintain/utils/disk/device.rb
152
- - lib/foreman_maintain/utils/disk/io_device.rb
153
- - lib/foreman_maintain/utils/backup.rb
154
- - lib/foreman_maintain/utils/bash.rb
155
- - lib/foreman_maintain/utils/disk.rb
156
- - lib/foreman_maintain/utils/facter.rb
157
- - lib/foreman_maintain/utils/hash_tools.rb
158
- - lib/foreman_maintain/utils/mongo_core.rb
159
- - lib/foreman_maintain/utils/service/abstract.rb
160
- - lib/foreman_maintain/utils/service/remote_db.rb
161
- - lib/foreman_maintain/utils/service/systemd.rb
162
- - lib/foreman_maintain/utils/system_helpers.rb
163
- - lib/foreman_maintain/utils/command_runner.rb
164
- - lib/foreman_maintain/utils/service.rb
165
- - lib/foreman_maintain/utils/response.rb
166
- - lib/foreman_maintain/yaml_storage.rb
167
- - lib/foreman_maintain/context.rb
168
- - lib/foreman_maintain/error.rb
169
- - lib/foreman_maintain/executable.rb
170
- - lib/foreman_maintain/feature.rb
171
- - lib/foreman_maintain/upgrade_runner.rb
172
- - lib/foreman_maintain/detector.rb
173
- - lib/foreman_maintain/core_ext.rb
174
- - lib/foreman_maintain/reporter.rb
175
- - lib/foreman_maintain/runner.rb
176
- - lib/foreman_maintain/scenario.rb
177
- - lib/foreman_maintain/cli.rb
178
- - lib/foreman_maintain/package_manager.rb
179
- - lib/foreman_maintain/package_manager/dnf.rb
180
- - lib/foreman_maintain/package_manager/base.rb
181
- - lib/foreman_maintain/package_manager/yum.rb
182
- - lib/foreman_maintain/param.rb
183
- - lib/foreman_maintain/version.rb
184
- - lib/foreman_maintain/config.rb
185
- - lib/foreman_maintain/utils.rb
186
- - lib/foreman_maintain.rb
187
- - definitions/checks/disk/available_space.rb
188
- - definitions/checks/disk/performance.rb
189
- - definitions/checks/foreman_proxy/verify_dhcp_config_syntax.rb
190
- - definitions/checks/foreman_tasks/invalid/check_old.rb
191
- - definitions/checks/foreman_tasks/invalid/check_pending_state.rb
192
- - definitions/checks/foreman_tasks/invalid/check_planning_state.rb
193
- - definitions/checks/foreman_tasks/not_running.rb
194
- - definitions/checks/foreman_tasks/not_paused.rb
116
+ - config/foreman-maintain.completion
117
+ - config/foreman_maintain.yml.example
118
+ - config/foreman_maintain.yml.packaging
119
+ - config/hammer.yml.example
120
+ - config/passenger-recycler.yaml
195
121
  - definitions/checks/backup/certs_tar_exist.rb
196
122
  - definitions/checks/backup/directory_ready.rb
197
123
  - definitions/checks/candlepin/db_up.rb
198
124
  - definitions/checks/candlepin/validate_db.rb
125
+ - definitions/checks/check_epel_repository.rb
126
+ - definitions/checks/check_hotfix_installed.rb
127
+ - definitions/checks/check_tmout.rb
128
+ - definitions/checks/disk/available_space.rb
129
+ - definitions/checks/disk/performance.rb
130
+ - definitions/checks/foreman/check_corrupted_roles.rb
131
+ - definitions/checks/foreman/check_duplicate_roles.rb
199
132
  - definitions/checks/foreman/db_up.rb
200
133
  - definitions/checks/foreman/puppet_class_duplicates.rb
201
- - definitions/checks/foreman/check_corrupted_roles.rb
202
134
  - definitions/checks/foreman_openscap/invalid_report_associations.rb
135
+ - definitions/checks/foreman_proxy/verify_dhcp_config_syntax.rb
136
+ - definitions/checks/foreman_tasks/invalid/check_old.rb
137
+ - definitions/checks/foreman_tasks/invalid/check_pending_state.rb
138
+ - definitions/checks/foreman_tasks/invalid/check_planning_state.rb
139
+ - definitions/checks/foreman_tasks/not_paused.rb
140
+ - definitions/checks/foreman_tasks/not_running.rb
141
+ - definitions/checks/maintenance_mode/check_consistency.rb
203
142
  - definitions/checks/mongo/db_up.rb
204
143
  - definitions/checks/mongo/tools_installed.rb
144
+ - definitions/checks/original_assets.rb
205
145
  - definitions/checks/puppet/provide_upgrade_guide.rb
206
146
  - definitions/checks/puppet/verify_no_empty_cacert_requests.rb
207
147
  - definitions/checks/remote_execution/verify_settings_file_already_exists.rb
@@ -209,67 +149,42 @@ files:
209
149
  - definitions/checks/repositories/validate.rb
210
150
  - definitions/checks/restore/validate_backup.rb
211
151
  - definitions/checks/restore/validate_hostname.rb
212
- - definitions/checks/system_registration.rb
213
152
  - definitions/checks/root_user.rb
214
- - definitions/checks/check_epel_repository.rb
215
- - definitions/checks/check_hotfix_installed.rb
216
- - definitions/checks/check_tmout.rb
217
- - definitions/checks/maintenance_mode/check_consistency.rb
218
- - definitions/checks/version_locking_enabled.rb
219
- - definitions/checks/yum_exclude.rb
220
153
  - definitions/checks/server_ping.rb
221
154
  - definitions/checks/services_up.rb
222
- - definitions/features/foreman_1_11_x.rb
155
+ - definitions/checks/system_registration.rb
156
+ - definitions/checks/version_locking_enabled.rb
157
+ - definitions/checks/yum_exclude.rb
158
+ - definitions/features/candlepin.rb
159
+ - definitions/features/candlepin_database.rb
160
+ - definitions/features/cron.rb
223
161
  - definitions/features/downstream.rb
224
- - definitions/features/upstream.rb
162
+ - definitions/features/foreman_1_11_x.rb
163
+ - definitions/features/foreman_1_7_x.rb
225
164
  - definitions/features/foreman_database.rb
226
- - definitions/features/foreman_proxy.rb
227
- - definitions/features/cron.rb
228
- - definitions/features/pulp.rb
229
- - definitions/features/candlepin.rb
230
165
  - definitions/features/foreman_openscap.rb
166
+ - definitions/features/foreman_proxy.rb
231
167
  - definitions/features/foreman_server.rb
232
168
  - definitions/features/foreman_tasks.rb
233
169
  - definitions/features/gofer.rb
170
+ - definitions/features/hammer.rb
234
171
  - definitions/features/installer.rb
235
- - definitions/features/katello.rb
236
- - definitions/features/candlepin_database.rb
237
- - definitions/features/foreman_1_7_x.rb
172
+ - definitions/features/instance.rb
238
173
  - definitions/features/iptables.rb
174
+ - definitions/features/katello.rb
239
175
  - definitions/features/mongo.rb
176
+ - definitions/features/package_manager.rb
177
+ - definitions/features/pulp.rb
240
178
  - definitions/features/puppet_server.rb
241
179
  - definitions/features/service.rb
242
- - definitions/features/tar.rb
243
- - definitions/features/package_manager.rb
244
180
  - definitions/features/sync_plans.rb
245
- - definitions/features/hammer.rb
246
- - definitions/features/instance.rb
247
181
  - definitions/features/system_repos.rb
248
- - definitions/procedures/foreman_tasks/ui_investigate.rb
249
- - definitions/procedures/foreman_tasks/fetch_tasks_status.rb
250
- - definitions/procedures/foreman_tasks/resume.rb
251
- - definitions/procedures/foreman_tasks/delete.rb
252
- - definitions/procedures/installer/upgrade.rb
253
- - definitions/procedures/packages/install.rb
254
- - definitions/procedures/packages/enable_version_locking.rb
255
- - definitions/procedures/packages/lock_versions.rb
256
- - definitions/procedures/packages/locking_status.rb
257
- - definitions/procedures/packages/unlock_versions.rb
258
- - definitions/procedures/packages/update.rb
259
- - definitions/procedures/repositories/setup.rb
260
- - definitions/procedures/repositories/disable.rb
261
- - definitions/procedures/sync_plans/disable.rb
262
- - definitions/procedures/sync_plans/enable.rb
263
- - definitions/procedures/crond/start.rb
264
- - definitions/procedures/crond/stop.rb
265
- - definitions/procedures/iptables/add_maintenance_mode_chain.rb
266
- - definitions/procedures/iptables/remove_maintenance_mode_chain.rb
267
- - definitions/procedures/passenger_recycler.rb
268
- - definitions/procedures/foreman_docker/remove_foreman_docker.rb
269
- - definitions/procedures/knowledge_base_article.rb
182
+ - definitions/features/tar.rb
183
+ - definitions/features/upstream.rb
270
184
  - definitions/procedures/backup/accessibility_confirmation.rb
271
185
  - definitions/procedures/backup/clean.rb
272
186
  - definitions/procedures/backup/compress_data.rb
187
+ - definitions/procedures/backup/config_files.rb
273
188
  - definitions/procedures/backup/metadata.rb
274
189
  - definitions/procedures/backup/offline/candlepin_db.rb
275
190
  - definitions/procedures/backup/offline/foreman_db.rb
@@ -277,55 +192,77 @@ files:
277
192
  - definitions/procedures/backup/online/candlepin_db.rb
278
193
  - definitions/procedures/backup/online/foreman_db.rb
279
194
  - definitions/procedures/backup/online/mongo.rb
280
- - definitions/procedures/backup/online/safety_confirmation.rb
281
195
  - definitions/procedures/backup/online/pg_global_objects.rb
196
+ - definitions/procedures/backup/online/safety_confirmation.rb
282
197
  - definitions/procedures/backup/prepare_directory.rb
198
+ - definitions/procedures/backup/pulp.rb
283
199
  - definitions/procedures/backup/snapshot/clean_mount.rb
200
+ - definitions/procedures/backup/snapshot/logical_volume_confirmation.rb
284
201
  - definitions/procedures/backup/snapshot/mount_base.rb
285
202
  - definitions/procedures/backup/snapshot/mount_candlepin_db.rb
286
203
  - definitions/procedures/backup/snapshot/mount_foreman_db.rb
287
- - definitions/procedures/backup/snapshot/prepare_mount.rb
288
- - definitions/procedures/backup/snapshot/logical_volume_confirmation.rb
289
204
  - definitions/procedures/backup/snapshot/mount_mongo.rb
290
205
  - definitions/procedures/backup/snapshot/mount_pulp.rb
291
- - definitions/procedures/backup/config_files.rb
292
- - definitions/procedures/backup/pulp.rb
206
+ - definitions/procedures/backup/snapshot/prepare_mount.rb
293
207
  - definitions/procedures/candlepin/delete_orphaned_records_from_env_content.rb
208
+ - definitions/procedures/crond/start.rb
209
+ - definitions/procedures/crond/stop.rb
210
+ - definitions/procedures/files/remove.rb
211
+ - definitions/procedures/foreman/apipie_cache.rb
212
+ - definitions/procedures/foreman/fix_corrupted_roles.rb
213
+ - definitions/procedures/foreman/remove_duplicate_obsolete_roles.rb
214
+ - definitions/procedures/foreman_docker/remove_foreman_docker.rb
294
215
  - definitions/procedures/foreman_openscap/invalid_report_associations.rb
216
+ - definitions/procedures/foreman_proxy/features.rb
217
+ - definitions/procedures/foreman_tasks/delete.rb
218
+ - definitions/procedures/foreman_tasks/fetch_tasks_status.rb
219
+ - definitions/procedures/foreman_tasks/resume.rb
220
+ - definitions/procedures/foreman_tasks/ui_investigate.rb
295
221
  - definitions/procedures/hammer_setup.rb
222
+ - definitions/procedures/installer/upgrade.rb
223
+ - definitions/procedures/iptables/add_maintenance_mode_chain.rb
224
+ - definitions/procedures/iptables/remove_maintenance_mode_chain.rb
225
+ - definitions/procedures/knowledge_base_article.rb
226
+ - definitions/procedures/maintenance_mode/is_enabled.rb
227
+ - definitions/procedures/packages/enable_version_locking.rb
228
+ - definitions/procedures/packages/install.rb
229
+ - definitions/procedures/packages/lock_versions.rb
230
+ - definitions/procedures/packages/locking_status.rb
231
+ - definitions/procedures/packages/unlock_versions.rb
232
+ - definitions/procedures/packages/update.rb
233
+ - definitions/procedures/passenger_recycler.rb
296
234
  - definitions/procedures/pulp/migrate.rb
235
+ - definitions/procedures/puppet/delete_empty_ca_cert_request_files.rb
297
236
  - definitions/procedures/remote_execution/remove_existing_settingsd.rb
237
+ - definitions/procedures/repositories/disable.rb
238
+ - definitions/procedures/repositories/setup.rb
298
239
  - definitions/procedures/restore/candlepin_dump.rb
240
+ - definitions/procedures/restore/configs.rb
299
241
  - definitions/procedures/restore/confirmation.rb
300
242
  - definitions/procedures/restore/drop_databases.rb
243
+ - definitions/procedures/restore/ensure_mongo_engine_matches.rb
301
244
  - definitions/procedures/restore/extract_files.rb
302
245
  - definitions/procedures/restore/foreman_dump.rb
246
+ - definitions/procedures/restore/installer_reset.rb
303
247
  - definitions/procedures/restore/mongo_dump.rb
304
248
  - definitions/procedures/restore/pg_global_objects.rb
305
249
  - definitions/procedures/restore/postgres_owner.rb
306
- - definitions/procedures/restore/configs.rb
307
- - definitions/procedures/restore/ensure_mongo_engine_matches.rb
308
- - definitions/procedures/restore/installer_reset.rb
309
250
  - definitions/procedures/selinux/set_file_security.rb
251
+ - definitions/procedures/service/base.rb
310
252
  - definitions/procedures/service/daemon_reload.rb
311
253
  - definitions/procedures/service/disable.rb
312
254
  - definitions/procedures/service/enable.rb
313
255
  - definitions/procedures/service/list.rb
256
+ - definitions/procedures/service/restart.rb
314
257
  - definitions/procedures/service/start.rb
315
- - definitions/procedures/service/stop.rb
316
258
  - definitions/procedures/service/status.rb
317
- - definitions/procedures/service/base.rb
318
- - definitions/procedures/service/restart.rb
319
- - definitions/procedures/foreman/fix_corrupted_roles.rb
320
- - definitions/procedures/foreman/apipie_cache.rb
321
- - definitions/procedures/maintenance_mode/is_enabled.rb
322
- - definitions/procedures/puppet/delete_empty_ca_cert_request_files.rb
323
- - definitions/procedures/foreman_proxy/features.rb
259
+ - definitions/procedures/service/stop.rb
260
+ - definitions/procedures/sync_plans/disable.rb
261
+ - definitions/procedures/sync_plans/enable.rb
262
+ - definitions/scenarios/backup.rb
263
+ - definitions/scenarios/maintenance_mode.rb
324
264
  - definitions/scenarios/restore.rb
325
265
  - definitions/scenarios/services.rb
326
- - definitions/scenarios/upgrade_to_satellite_6_6_z.rb
327
- - definitions/scenarios/maintenance_mode.rb
328
- - definitions/scenarios/version_locking.rb
329
266
  - definitions/scenarios/upgrade_to_satellite_6_2.rb
330
267
  - definitions/scenarios/upgrade_to_satellite_6_2_z.rb
331
268
  - definitions/scenarios/upgrade_to_satellite_6_3.rb
@@ -334,15 +271,82 @@ files:
334
271
  - definitions/scenarios/upgrade_to_satellite_6_4_z.rb
335
272
  - definitions/scenarios/upgrade_to_satellite_6_5.rb
336
273
  - definitions/scenarios/upgrade_to_satellite_6_5_z.rb
337
- - definitions/scenarios/backup.rb
338
274
  - definitions/scenarios/upgrade_to_satellite_6_6.rb
339
- - config/foreman-maintain.completion
340
- - config/foreman_maintain.yml.example
341
- - config/foreman_maintain.yml.packaging
342
- - config/hammer.yml.example
343
- - config/passenger-recycler.yaml
344
- - LICENSE
345
- - README.md
275
+ - definitions/scenarios/upgrade_to_satellite_6_6_z.rb
276
+ - definitions/scenarios/version_locking.rb
277
+ - lib/foreman_maintain.rb
278
+ - lib/foreman_maintain/check.rb
279
+ - lib/foreman_maintain/cli.rb
280
+ - lib/foreman_maintain/cli/advanced/prebuild_bash_completion.rb
281
+ - lib/foreman_maintain/cli/advanced/procedure/abstract_by_tag_command.rb
282
+ - lib/foreman_maintain/cli/advanced/procedure/abstract_procedure_command.rb
283
+ - lib/foreman_maintain/cli/advanced/procedure/by_tag_command.rb
284
+ - lib/foreman_maintain/cli/advanced/procedure/run_command.rb
285
+ - lib/foreman_maintain/cli/advanced/procedure_command.rb
286
+ - lib/foreman_maintain/cli/advanced_command.rb
287
+ - lib/foreman_maintain/cli/backup_command.rb
288
+ - lib/foreman_maintain/cli/base.rb
289
+ - lib/foreman_maintain/cli/health_command.rb
290
+ - lib/foreman_maintain/cli/maintenance_mode_command.rb
291
+ - lib/foreman_maintain/cli/packages_command.rb
292
+ - lib/foreman_maintain/cli/restore_command.rb
293
+ - lib/foreman_maintain/cli/service_command.rb
294
+ - lib/foreman_maintain/cli/transform_clamp_options.rb
295
+ - lib/foreman_maintain/cli/upgrade_command.rb
296
+ - lib/foreman_maintain/concerns/base_database.rb
297
+ - lib/foreman_maintain/concerns/directory_marker.rb
298
+ - lib/foreman_maintain/concerns/finders.rb
299
+ - lib/foreman_maintain/concerns/hammer.rb
300
+ - lib/foreman_maintain/concerns/logger.rb
301
+ - lib/foreman_maintain/concerns/metadata.rb
302
+ - lib/foreman_maintain/concerns/reporter.rb
303
+ - lib/foreman_maintain/concerns/scenario_metadata.rb
304
+ - lib/foreman_maintain/concerns/system_helpers.rb
305
+ - lib/foreman_maintain/concerns/system_service.rb
306
+ - lib/foreman_maintain/config.rb
307
+ - lib/foreman_maintain/context.rb
308
+ - lib/foreman_maintain/core_ext.rb
309
+ - lib/foreman_maintain/csv_parser.rb
310
+ - lib/foreman_maintain/dependency_graph.rb
311
+ - lib/foreman_maintain/detector.rb
312
+ - lib/foreman_maintain/error.rb
313
+ - lib/foreman_maintain/executable.rb
314
+ - lib/foreman_maintain/feature.rb
315
+ - lib/foreman_maintain/package_manager.rb
316
+ - lib/foreman_maintain/package_manager/base.rb
317
+ - lib/foreman_maintain/package_manager/dnf.rb
318
+ - lib/foreman_maintain/package_manager/yum.rb
319
+ - lib/foreman_maintain/param.rb
320
+ - lib/foreman_maintain/procedure.rb
321
+ - lib/foreman_maintain/reporter.rb
322
+ - lib/foreman_maintain/reporter/cli_reporter.rb
323
+ - lib/foreman_maintain/runner.rb
324
+ - lib/foreman_maintain/runner/execution.rb
325
+ - lib/foreman_maintain/runner/stored_execution.rb
326
+ - lib/foreman_maintain/scenario.rb
327
+ - lib/foreman_maintain/top_level_modules.rb
328
+ - lib/foreman_maintain/upgrade_runner.rb
329
+ - lib/foreman_maintain/utils.rb
330
+ - lib/foreman_maintain/utils/backup.rb
331
+ - lib/foreman_maintain/utils/bash.rb
332
+ - lib/foreman_maintain/utils/command_runner.rb
333
+ - lib/foreman_maintain/utils/curl_response.rb
334
+ - lib/foreman_maintain/utils/disk.rb
335
+ - lib/foreman_maintain/utils/disk/device.rb
336
+ - lib/foreman_maintain/utils/disk/io_device.rb
337
+ - lib/foreman_maintain/utils/disk/nil_device.rb
338
+ - lib/foreman_maintain/utils/disk/stats.rb
339
+ - lib/foreman_maintain/utils/facter.rb
340
+ - lib/foreman_maintain/utils/hash_tools.rb
341
+ - lib/foreman_maintain/utils/mongo_core.rb
342
+ - lib/foreman_maintain/utils/response.rb
343
+ - lib/foreman_maintain/utils/service.rb
344
+ - lib/foreman_maintain/utils/service/abstract.rb
345
+ - lib/foreman_maintain/utils/service/remote_db.rb
346
+ - lib/foreman_maintain/utils/service/systemd.rb
347
+ - lib/foreman_maintain/utils/system_helpers.rb
348
+ - lib/foreman_maintain/version.rb
349
+ - lib/foreman_maintain/yaml_storage.rb
346
350
  homepage: https://github.com/theforeman/foreman_maintain
347
351
  licenses:
348
352
  - GPL-3.0
@@ -353,17 +357,17 @@ require_paths:
353
357
  - lib
354
358
  required_ruby_version: !ruby/object:Gem::Requirement
355
359
  requirements:
356
- - - '>='
360
+ - - ">="
357
361
  - !ruby/object:Gem::Version
358
362
  version: '0'
359
363
  required_rubygems_version: !ruby/object:Gem::Requirement
360
364
  requirements:
361
- - - '>='
365
+ - - ">="
362
366
  - !ruby/object:Gem::Version
363
367
  version: '0'
364
368
  requirements: []
365
369
  rubyforge_project:
366
- rubygems_version: 2.0.14.1
370
+ rubygems_version: 2.7.10
367
371
  signing_key:
368
372
  specification_version: 4
369
373
  summary: Foreman maintenance tool belt