foreman_maintain 1.6.11 → 1.6.13

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.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/definitions/checks/backup/incremental_parent_type.rb +33 -0
  3. data/definitions/checks/foreman/check_tuning_requirements.rb +2 -2
  4. data/definitions/checks/restore/validate_postgresql_dump_permissions.rb +1 -1
  5. data/definitions/checks/system_registration.rb +1 -1
  6. data/definitions/features/foreman_database.rb +6 -1
  7. data/definitions/procedures/backup/online/candlepin_db.rb +1 -1
  8. data/definitions/procedures/backup/online/foreman_db.rb +1 -1
  9. data/definitions/procedures/backup/online/pulpcore_db.rb +1 -1
  10. data/definitions/procedures/backup/online/safety_confirmation.rb +4 -7
  11. data/definitions/procedures/backup/prepare_directory.rb +1 -2
  12. data/definitions/procedures/foreman_tasks/ui_investigate.rb +1 -1
  13. data/definitions/procedures/knowledge_base_article.rb +1 -1
  14. data/definitions/procedures/packages/update_all_confirmation.rb +1 -1
  15. data/definitions/procedures/sync_plans/disable.rb +0 -1
  16. data/definitions/procedures/sync_plans/enable.rb +0 -2
  17. data/definitions/scenarios/backup.rb +17 -30
  18. data/definitions/scenarios/foreman_upgrade.rb +3 -1
  19. data/definitions/scenarios/restore.rb +1 -1
  20. data/definitions/scenarios/satellite_upgrade.rb +66 -21
  21. data/definitions/scenarios/services.rb +5 -5
  22. data/lib/foreman_maintain/cli/backup_command.rb +1 -3
  23. data/lib/foreman_maintain/cli/upgrade_command.rb +1 -1
  24. data/lib/foreman_maintain/concerns/base_database.rb +1 -1
  25. data/lib/foreman_maintain/concerns/finders.rb +0 -4
  26. data/lib/foreman_maintain/config.rb +5 -0
  27. data/lib/foreman_maintain/core_ext.rb +0 -12
  28. data/lib/foreman_maintain/detector.rb +1 -0
  29. data/lib/foreman_maintain/reporter/cli_reporter.rb +23 -23
  30. data/lib/foreman_maintain/reporter.rb +1 -1
  31. data/lib/foreman_maintain/update_runner.rb +4 -4
  32. data/lib/foreman_maintain/upgrade_runner.rb +7 -7
  33. data/lib/foreman_maintain/utils/backup.rb +7 -0
  34. data/lib/foreman_maintain/utils/service/systemd.rb +1 -5
  35. data/lib/foreman_maintain/version.rb +1 -1
  36. data/lib/foreman_maintain.rb +5 -4
  37. metadata +3 -6
  38. data/definitions/procedures/backup/offline/candlepin_db.rb +0 -53
  39. data/definitions/procedures/backup/offline/foreman_db.rb +0 -73
  40. data/definitions/procedures/backup/offline/pulpcore_db.rb +0 -53
  41. data/definitions/procedures/pulpcore/trim_rpm_changelogs.rb +0 -22
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 251038c33fba4faa2abf9c839937e229a664703c9b3003376b4d88aa7eca7d02
4
- data.tar.gz: 72f4bb7fe9e7a9862df58accbfa190019a3356e99917d884242ad90259743291
3
+ metadata.gz: 75ad50dc1e0bbb3221aad7844236ac97467d5b12c07a17a0ae5f2bb09448d010
4
+ data.tar.gz: 310cbf63bbe5c3fc98efa58219bbcaee680c55580ca27415f9636bea85e637ed
5
5
  SHA512:
6
- metadata.gz: 140782d6ee833f07a64b2310fd94901f42991dc9babb2368cdc48c904fe78122c6e8ae6584bdb7c2818883e6c425035288d9f2859b7983d5957a5366c7c1a13a
7
- data.tar.gz: 127c879d335e5dc46151d31e02d9fb72c4f45bcaff5ffcd83dee2ae1552877952a2b7128b28e45c69cab779df7055025e9bfdfa014bc484ae17ef2ffdd595ad3
6
+ metadata.gz: 2a5036c9138cf2b219366c33e535cdb917e2bfe8fee87d03351a73b2e515cf4b4278d0ab4b34d9f799bb31d5ae01f5903261ada5aa4f7acccac6294b29e63f3d
7
+ data.tar.gz: e965c5451c169bb386d4b3239c3a57cb78e279d49c327ae80de7ab878982783752054ca53032e5d2a67acb6759b7f969e68970a610686232399b95d2f08fc28d
@@ -0,0 +1,33 @@
1
+ module Checks::Backup
2
+ class IncrementalParentType < ForemanMaintain::Check
3
+ metadata do
4
+ description 'Check if the incremental backup has the right type'
5
+ tags :backup
6
+ param :incremental_dir, 'Path to existing backup directory'
7
+ param :online_backup, 'Select for online backup', :flag => true, :default => false
8
+ manual_detection
9
+ end
10
+
11
+ def run
12
+ return unless @incremental_dir
13
+
14
+ backup = ForemanMaintain::Utils::Backup.new(@incremental_dir)
15
+
16
+ existing_type = backup.backup_type
17
+ new_type = if @online_backup
18
+ ForemanMaintain::Utils::Backup::ONLINE_BACKUP
19
+ else
20
+ ForemanMaintain::Utils::Backup::OFFLINE_BACKUP
21
+ end
22
+ msg = "The existing backup is an #{existing_type} backup, "\
23
+ "but an #{new_type} backup was requested."
24
+ assert(existing_type == new_type, msg)
25
+
26
+ unless @online_backup
27
+ msg = "The existing backup has PostgreSQL as a tarball, "\
28
+ "but the new one will have a dump."
29
+ assert(!backup.sql_tar_files_exist?, msg)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -70,8 +70,8 @@ module Checks
70
70
  end
71
71
 
72
72
  def failure_message(tuning_profile)
73
- <<-MESSAGE.strip_heredoc
74
- \nERROR: The installer is configured to use the #{tuning_profile} tuning profile and does not meet the requirements.
73
+ <<~MESSAGE
74
+ \nERROR: The installer is configured to use the #{tuning_profile} tuning profile and does not meet the requirements.
75
75
  MESSAGE
76
76
  end
77
77
  end
@@ -11,7 +11,7 @@ module Checks::Restore
11
11
 
12
12
  def run
13
13
  backup = ForemanMaintain::Utils::Backup.new(@backup_dir)
14
- if feature(:instance).postgresql_local? && backup.online_backup?
14
+ if feature(:instance).postgresql_local?
15
15
  errors = []
16
16
  [:candlepin_dump, :foreman_dump, :pulpcore_dump].each do |dump|
17
17
  next unless backup.file_map[dump][:present]
@@ -5,7 +5,7 @@ class Checks::SystemRegistration < ForemanMaintain::Check
5
5
  tags :default
6
6
 
7
7
  confine do
8
- file_exists?('/etc/rhsm/rhsm.conf') && feature(:instance).downstream
8
+ feature(:instance).downstream
9
9
  end
10
10
  end
11
11
 
@@ -35,7 +35,12 @@ class Features::ForemanDatabase < ForemanMaintain::Feature
35
35
  private
36
36
 
37
37
  def load_configuration
38
- config = YAML.load(File.read(FOREMAN_DB_CONFIG))
38
+ config = if File.exist?('/etc/foreman/database.yml')
39
+ YAML.load(File.read(FOREMAN_DB_CONFIG))
40
+ else
41
+ { 'production' => {} }
42
+ end
43
+
39
44
  @configuration = config['production']
40
45
  @configuration['host'] ||= 'localhost'
41
46
  @configuration
@@ -2,7 +2,7 @@ module Procedures::Backup
2
2
  module Online
3
3
  class CandlepinDB < ForemanMaintain::Procedure
4
4
  metadata do
5
- description 'Backup Candlepin database online'
5
+ description 'Backup Candlepin database'
6
6
  tags :backup
7
7
  label :backup_online_candlepin_db
8
8
  for_feature :candlepin_database
@@ -2,7 +2,7 @@ module Procedures::Backup
2
2
  module Online
3
3
  class ForemanDB < ForemanMaintain::Procedure
4
4
  metadata do
5
- description 'Backup Foreman database online'
5
+ description 'Backup Foreman database'
6
6
  tags :backup
7
7
  label :backup_online_foreman_db
8
8
  for_feature :foreman_database
@@ -2,7 +2,7 @@ module Procedures::Backup
2
2
  module Online
3
3
  class PulpcoreDB < ForemanMaintain::Procedure
4
4
  metadata do
5
- description 'Backup Pulpcore database online'
5
+ description 'Backup Pulpcore database'
6
6
  tags :backup
7
7
  label :backup_online_pulpcore_db
8
8
  for_feature :pulpcore_database
@@ -4,23 +4,20 @@ module Procedures::Backup
4
4
  metadata do
5
5
  description 'Data consistency warning'
6
6
  tags :backup
7
- param :include_db_dumps, 'Are database dumps included in backup', :flag => true,
8
- :default => false
9
7
  end
10
8
 
11
9
  def run
12
- answer = ask_decision(warning_message(@include_db_dumps), actions_msg: 'y(yes), q(quit)')
10
+ answer = ask_decision(warning_message, actions_msg: 'y(yes), q(quit)')
13
11
  abort! unless answer == :yes
14
12
  end
15
13
 
16
- def warning_message(include_db_dumps)
17
- substr = include_db_dumps ? 'database dump' : 'online backup'
18
- "*** WARNING: The #{substr} is intended for making a copy of the data\n" \
14
+ def warning_message
15
+ "*** WARNING: The online backup is intended for making a copy of the data\n" \
19
16
  '*** for debugging purposes only.' \
20
17
  " The backup routine can not ensure 100% consistency while the\n" \
21
18
  "*** backup is taking place as there is a chance there may be data mismatch between\n" \
22
19
  '*** the databases while the services are live.' \
23
- " If you wish to utilize the #{substr}\n" \
20
+ " If you wish to utilize the online backup\n" \
24
21
  '*** for production use you need to ensure that there are' \
25
22
  " no modifications occurring during\n" \
26
23
  "*** your backup run.\n\nDo you want to proceed?"
@@ -6,7 +6,6 @@ module Procedures::Backup
6
6
  param :backup_dir, 'Directory where to backup to', :required => true
7
7
  param :preserve_dir, 'Directory where to backup to', :flag => true
8
8
  param :incremental_dir, 'Changes since specified backup only'
9
- param :online_backup, 'Select for online backup', :flag => true, :default => false
10
9
  end
11
10
 
12
11
  # rubocop:disable Metrics/MethodLength
@@ -17,7 +16,7 @@ module Procedures::Backup
17
16
  FileUtils.mkdir_p @backup_dir
18
17
  FileUtils.chmod_R 0o770, @backup_dir
19
18
 
20
- if feature(:instance).postgresql_local? && @online_backup
19
+ if feature(:instance).postgresql_local?
21
20
  begin
22
21
  FileUtils.chown_R(nil, 'postgres', @backup_dir)
23
22
  rescue Errno::EPERM
@@ -10,7 +10,7 @@ module Procedures::ForemanTasks
10
10
  attr_reader :search_query
11
11
 
12
12
  def run
13
- ask(<<-MESSAGE.strip_heredoc)
13
+ ask(<<~MESSAGE)
14
14
  Go to https://#{hostname}/foreman_tasks/tasks?search=#{CGI.escape(@search_query.to_s)}
15
15
  press ENTER after the tasks are resolved.
16
16
  MESSAGE
@@ -12,7 +12,7 @@ class Procedures::KnowledgeBaseArticle < ForemanMaintain::Procedure
12
12
  end
13
13
 
14
14
  def run
15
- ask(<<-MESSAGE.strip_heredoc)
15
+ ask(<<~MESSAGE)
16
16
  Go to #{kcs_documents[@doc]}
17
17
  please follow steps from above article to resolve this issue
18
18
  press ENTER once done.
@@ -20,7 +20,7 @@ module Procedures::Packages
20
20
  the recommendations?
21
21
  MSG
22
22
 
23
- answer = ask_decision(question, actions_msg: 'y(yes), q(quit)')
23
+ answer = ask_decision(question.strip, actions_msg: 'y(yes), q(quit)')
24
24
  abort! unless answer == :yes
25
25
  end
26
26
  end
@@ -4,7 +4,6 @@ module Procedures::SyncPlans
4
4
  metadata do
5
5
  for_feature :sync_plans
6
6
  description 'disable active sync plans'
7
- tags :pre_migrations, :maintenance_mode_on
8
7
 
9
8
  confine do
10
9
  feature(:katello)
@@ -4,8 +4,6 @@ module Procedures::SyncPlans
4
4
  metadata do
5
5
  for_feature :sync_plans
6
6
  description 're-enable sync plans'
7
- tags :post_migrations, :maintenance_mode_off
8
- before :disk_io
9
7
 
10
8
  confine do
11
9
  feature(:katello)
@@ -8,7 +8,6 @@ module ForemanMaintain::Scenarios
8
8
  param :strategy, 'Backup strategy. One of [:online, :offline]',
9
9
  :required => true
10
10
  param :backup_dir, 'Directory where to backup to', :required => true
11
- param :include_db_dumps, 'Include dumps of local dbs as part of offline'
12
11
  param :preserve_dir, 'Directory where to backup to'
13
12
  param :incremental_dir, 'Changes since specified backup only'
14
13
  param :proxy_features, 'List of proxy features to backup (default: all)', :array => true
@@ -18,10 +17,11 @@ module ForemanMaintain::Scenarios
18
17
 
19
18
  def compose
20
19
  check_valid_strategy
20
+ add_step_with_context(Checks::Backup::IncrementalParentType,
21
+ :online_backup => strategy == :online)
21
22
  safety_confirmation
22
23
  add_step_with_context(Procedures::Backup::AccessibilityConfirmation) if strategy == :offline
23
- add_step_with_context(Procedures::Backup::PrepareDirectory,
24
- :online_backup => strategy == :online)
24
+ add_step_with_context(Procedures::Backup::PrepareDirectory)
25
25
  add_step_with_context(Procedures::Backup::Metadata, :online_backup => strategy == :online)
26
26
 
27
27
  case strategy
@@ -44,13 +44,11 @@ module ForemanMaintain::Scenarios
44
44
  Procedures::Backup::Pulp => :backup_dir,
45
45
  Procedures::Backup::Online::CandlepinDB => :backup_dir,
46
46
  Procedures::Backup::Online::ForemanDB => :backup_dir,
47
- Procedures::Backup::Online::PulpcoreDB => :backup_dir,
48
- Procedures::Backup::Offline::CandlepinDB => :backup_dir,
49
- Procedures::Backup::Offline::ForemanDB => :backup_dir,
50
- Procedures::Backup::Offline::PulpcoreDB => :backup_dir)
47
+ Procedures::Backup::Online::PulpcoreDB => :backup_dir)
51
48
  context.map(:preserve_dir,
52
49
  Procedures::Backup::PrepareDirectory => :preserve_dir)
53
50
  context.map(:incremental_dir,
51
+ Checks::Backup::IncrementalParentType => :incremental_dir,
54
52
  Procedures::Backup::PrepareDirectory => :incremental_dir,
55
53
  Procedures::Backup::Metadata => :incremental_dir)
56
54
  context.map(:proxy_features,
@@ -59,15 +57,13 @@ module ForemanMaintain::Scenarios
59
57
  Procedures::Backup::Pulp => :skip)
60
58
  context.map(:tar_volume_size,
61
59
  Procedures::Backup::Pulp => :tar_volume_size)
62
- context.map(:include_db_dumps,
63
- Procedures::Backup::Online::SafetyConfirmation => :include_db_dumps)
64
60
  end
65
61
  # rubocop:enable Metrics/MethodLength
66
62
 
67
63
  private
68
64
 
69
65
  def safety_confirmation
70
- if strategy == :online || include_db_dumps?
66
+ if strategy == :online
71
67
  add_step_with_context(Procedures::Backup::Online::SafetyConfirmation)
72
68
  end
73
69
  end
@@ -79,35 +75,30 @@ module ForemanMaintain::Scenarios
79
75
  end
80
76
 
81
77
  def add_offline_backup_steps
82
- include_dumps if include_db_dumps?
83
78
  add_step_with_context(Procedures::ForemanProxy::Features, :load_only => true)
84
79
  add_steps_with_context(
85
80
  Procedures::Service::Stop,
86
81
  Procedures::Backup::ConfigFiles,
87
- Procedures::Backup::Pulp,
88
- Procedures::Backup::Offline::CandlepinDB,
89
- Procedures::Backup::Offline::ForemanDB,
90
- Procedures::Backup::Offline::PulpcoreDB,
91
- Procedures::Service::Start
82
+ Procedures::Backup::Pulp
92
83
  )
93
- end
94
84
 
95
- def include_dumps
96
- if feature(:instance).database_local?(:candlepin_database)
97
- add_step_with_context(Procedures::Backup::Online::CandlepinDB)
98
- end
99
- if feature(:instance).database_local?(:foreman_database)
100
- add_step_with_context(Procedures::Backup::Online::ForemanDB)
101
- end
102
- if feature(:instance).database_local?(:pulpcore_database)
103
- add_step_with_context(Procedures::Backup::Online::PulpcoreDB)
85
+ if feature(:instance).postgresql_local?
86
+ add_step(Procedures::Service::Start.new(:only => ['postgresql']))
104
87
  end
88
+
89
+ add_database_backup_steps
90
+
91
+ add_steps_with_context(Procedures::Service::Start)
105
92
  end
106
93
 
107
94
  def add_online_backup_steps
108
95
  add_step_with_context(Procedures::Backup::ConfigFiles, :ignore_changed_files => true,
109
96
  :online_backup => true)
110
97
  add_step_with_context(Procedures::Backup::Pulp, :ensure_unchanged => true)
98
+ add_database_backup_steps
99
+ end
100
+
101
+ def add_database_backup_steps
111
102
  add_steps_with_context(
112
103
  Procedures::Backup::Online::CandlepinDB,
113
104
  Procedures::Backup::Online::ForemanDB,
@@ -118,10 +109,6 @@ module ForemanMaintain::Scenarios
118
109
  def strategy
119
110
  context.get(:strategy)
120
111
  end
121
-
122
- def include_db_dumps?
123
- !!context.get(:include_db_dumps)
124
- end
125
112
  end
126
113
 
127
114
  class BackupRescueCleanup < ForemanMaintain::Scenario
@@ -1,4 +1,4 @@
1
- module Scenarios::ForemanUpgrade
1
+ module Scenarios::Foreman
2
2
  class Abstract < ForemanMaintain::Scenario
3
3
  def self.upgrade_metadata(&block)
4
4
  metadata do
@@ -38,6 +38,7 @@ module Scenarios::ForemanUpgrade
38
38
  Checks::CheckUpstreamRepository,
39
39
  Checks::Disk::AvailableSpace,
40
40
  Checks::Disk::AvailableSpaceCandlepin, # if candlepin
41
+ Checks::Disk::AvailableSpacePostgresql13,
41
42
  Checks::Foreman::ValidateExternalDbVersion, # if external database
42
43
  Checks::Foreman::CheckCorruptedRoles,
43
44
  Checks::Foreman::CheckDuplicatePermissions,
@@ -50,6 +51,7 @@ module Scenarios::ForemanUpgrade
50
51
  Checks::NonRhPackages,
51
52
  Checks::PackageManager::Dnf::ValidateDnfConfig,
52
53
  Checks::Repositories::CheckNonRhRepository,
54
+ Checks::CheckOrganizationContentAccessMode,
53
55
  Checks::Repositories::Validate
54
56
  )
55
57
  end
@@ -14,7 +14,7 @@ module ForemanMaintain::Scenarios
14
14
  def compose
15
15
  backup = ForemanMaintain::Utils::Backup.new(context.get(:backup_dir))
16
16
 
17
- add_steps(find_checks(:root_user))
17
+ add_step(Checks::RootUser)
18
18
  add_steps_with_context(Checks::Restore::ValidateBackup,
19
19
  Checks::Restore::ValidateHostname,
20
20
  Checks::Restore::ValidateInterfaces,
@@ -23,14 +23,41 @@ module Scenarios::Satellite
23
23
  run_strategy :fail_slow
24
24
  end
25
25
 
26
+ # rubocop:disable Metrics/MethodLength
26
27
  def compose
27
- add_steps(find_checks(:default))
28
- add_steps(find_checks(:pre_upgrade))
29
- add_step(Checks::CheckIpv6Disable)
30
- add_step(Checks::Disk::AvailableSpacePostgresql13)
31
- add_step(Checks::Repositories::Validate.new(:version => target_version))
32
- add_step(Checks::CheckOrganizationContentAccessMode)
28
+ add_steps(
29
+ Checks::Foreman::FactsNames, # if Foreman database present
30
+ Checks::ForemanProxy::CheckTftpStorage, # if Satellite with foreman-proxy+tftp
31
+ Checks::ForemanProxy::VerifyDhcpConfigSyntax, # if foreman-proxy+dhcp-isc
32
+ Checks::ForemanTasks::NotPaused, # if foreman-tasks present
33
+ Checks::Puppet::VerifyNoEmptyCacertRequests, # if puppetserver
34
+ Checks::ServerPing,
35
+ Checks::ServicesUp,
36
+ Checks::SystemRegistration,
37
+ Checks::CheckHotfixInstalled,
38
+ Checks::CheckTmout,
39
+ Checks::CheckUpstreamRepository,
40
+ Checks::Disk::AvailableSpace,
41
+ Checks::Disk::AvailableSpaceCandlepin, # if candlepin
42
+ Checks::Foreman::ValidateExternalDbVersion, # if external database
43
+ Checks::Foreman::CheckCorruptedRoles,
44
+ Checks::Foreman::CheckDuplicatePermissions,
45
+ Checks::Foreman::TuningRequirements, # if katello present
46
+ Checks::ForemanOpenscap::InvalidReportAssociations, # if foreman-openscap
47
+ Checks::ForemanTasks::Invalid::CheckOld, # if foreman-tasks
48
+ Checks::ForemanTasks::Invalid::CheckPendingState, # if foreman-tasks
49
+ Checks::ForemanTasks::Invalid::CheckPlanningState, # if foreman-tasks
50
+ Checks::ForemanTasks::NotRunning, # if foreman-tasks
51
+ Checks::NonRhPackages,
52
+ Checks::PackageManager::Dnf::ValidateDnfConfig,
53
+ Checks::Repositories::CheckNonRhRepository,
54
+ Checks::CheckIpv6Disable,
55
+ Checks::Disk::AvailableSpacePostgresql13,
56
+ Checks::CheckOrganizationContentAccessMode,
57
+ Checks::Repositories::Validate.new(:version => target_version),
58
+ )
33
59
  end
60
+ # rubocop:enable Metrics/MethodLength
34
61
  end
35
62
 
36
63
  class PreMigrations < Abstract
@@ -40,7 +67,11 @@ module Scenarios::Satellite
40
67
  end
41
68
 
42
69
  def compose
43
- add_steps(find_procedures(:pre_migrations))
70
+ add_steps(
71
+ Procedures::MaintenanceMode::EnableMaintenanceMode,
72
+ Procedures::Crond::Stop,
73
+ Procedures::SyncPlans::Disable,
74
+ )
44
75
  end
45
76
  end
46
77
 
@@ -63,12 +94,14 @@ module Scenarios::Satellite
63
94
  modules_to_enable = ["#{feature(:instance).downstream.module_name}:#{el_short_name}"]
64
95
  add_step(Procedures::Packages::EnableModules.new(:module_names => modules_to_enable))
65
96
  end
66
- add_step(Procedures::Packages::Update.new(
67
- :assumeyes => true,
68
- :download_only => true
69
- ))
70
- add_step(Procedures::Service::Stop.new)
71
- add_step(Procedures::Packages::Update.new(:assumeyes => true, :clean_cache => false))
97
+ add_steps(
98
+ Procedures::Packages::Update.new(
99
+ :assumeyes => true,
100
+ :download_only => true
101
+ ),
102
+ Procedures::Service::Stop,
103
+ Procedures::Packages::Update.new(:assumeyes => true, :clean_cache => false),
104
+ )
72
105
  add_step_with_context(Procedures::Installer::Run)
73
106
  add_step(Procedures::Installer::UpgradeRakeTask)
74
107
  end
@@ -81,9 +114,13 @@ module Scenarios::Satellite
81
114
  end
82
115
 
83
116
  def compose
84
- add_step(Procedures::RefreshFeatures)
85
- add_step(Procedures::Service::Start.new)
86
- add_steps(find_procedures(:post_migrations))
117
+ add_steps(
118
+ Procedures::RefreshFeatures,
119
+ Procedures::Service::Start,
120
+ Procedures::Crond::Start,
121
+ Procedures::SyncPlans::Enable,
122
+ Procedures::MaintenanceMode::DisableMaintenanceMode,
123
+ )
87
124
  end
88
125
  end
89
126
 
@@ -95,11 +132,19 @@ module Scenarios::Satellite
95
132
  end
96
133
 
97
134
  def compose
98
- add_steps(find_checks(:default))
99
- add_steps(find_checks(:post_upgrade))
100
- add_step(Procedures::Packages::CheckForReboot)
101
- add_step(Procedures::Pulpcore::ContainerHandleImageMetadata)
102
- add_step(Procedures::Repositories::IndexKatelloRepositoriesContainerMetatdata)
135
+ add_steps(
136
+ Checks::Foreman::FactsNames, # if Foreman database present
137
+ Checks::ForemanProxy::CheckTftpStorage, # if Satellite with foreman-proxy+tftp
138
+ Checks::ForemanProxy::VerifyDhcpConfigSyntax, # if foreman-proxy+dhcp-isc
139
+ Checks::ForemanTasks::NotPaused, # if foreman-tasks present
140
+ Checks::Puppet::VerifyNoEmptyCacertRequests, # if puppetserver
141
+ Checks::ServerPing,
142
+ Checks::ServicesUp,
143
+ Checks::SystemRegistration,
144
+ Procedures::Packages::CheckForReboot,
145
+ Procedures::Pulpcore::ContainerHandleImageMetadata,
146
+ Procedures::Repositories::IndexKatelloRepositoriesContainerMetatdata,
147
+ )
103
148
  end
104
149
  end
105
150
  end
@@ -8,7 +8,7 @@ module ForemanMaintain::Scenarios
8
8
  end
9
9
 
10
10
  def compose
11
- add_steps(find_checks(:root_user))
11
+ add_step(Checks::RootUser)
12
12
  add_steps_with_context(Procedures::Service::Restart)
13
13
  end
14
14
 
@@ -33,7 +33,7 @@ module ForemanMaintain::Scenarios
33
33
  end
34
34
 
35
35
  def compose
36
- add_steps(find_checks(:root_user))
36
+ add_step(Checks::RootUser)
37
37
  add_steps_with_context(Procedures::Service::Stop)
38
38
  end
39
39
 
@@ -55,7 +55,7 @@ module ForemanMaintain::Scenarios
55
55
  end
56
56
 
57
57
  def compose
58
- add_steps(find_checks(:root_user))
58
+ add_step(Checks::RootUser)
59
59
  add_steps_with_context(Procedures::Service::Start)
60
60
  end
61
61
 
@@ -98,7 +98,7 @@ module ForemanMaintain::Scenarios
98
98
  end
99
99
 
100
100
  def compose
101
- add_steps(find_checks(:root_user))
101
+ add_step(Checks::RootUser)
102
102
  add_steps_with_context(Procedures::Service::Enable)
103
103
  end
104
104
 
@@ -120,7 +120,7 @@ module ForemanMaintain::Scenarios
120
120
  end
121
121
 
122
122
  def compose
123
- add_steps(find_checks(:root_user))
123
+ add_step(Checks::RootUser)
124
124
  add_steps_with_context(Procedures::Service::Disable)
125
125
  end
126
126
 
@@ -119,11 +119,9 @@ module ForemanMaintain
119
119
  include BackupCommon
120
120
  interactive_option
121
121
  common_backup_options
122
- option '--include-db-dumps', :flag, 'Also dump full database schema before offline backup'
123
122
 
124
123
  def execute
125
- perform_backup(:offline,
126
- :include_db_dumps => include_db_dumps?)
124
+ perform_backup(:offline)
127
125
  end
128
126
  end
129
127
 
@@ -30,7 +30,7 @@ module ForemanMaintain
30
30
  else
31
31
  '--target-version not specified'
32
32
  end
33
- message = <<-MESSAGE.strip_heredoc
33
+ message = <<~MESSAGE
34
34
  #{message_start}
35
35
  Possible target versions are:
36
36
  MESSAGE
@@ -42,7 +42,7 @@ module ForemanMaintain
42
42
  end
43
43
 
44
44
  def local?(config = configuration)
45
- ['localhost', '127.0.0.1', `hostname`.strip].include? config['host']
45
+ ['localhost', '127.0.0.1', `hostname`.strip].include?(config['host'])
46
46
  end
47
47
 
48
48
  def query(sql, config = configuration)
@@ -13,10 +13,6 @@ module ForemanMaintain
13
13
  ensure_one_object(:check, label)
14
14
  end
15
15
 
16
- def find_checks(conditions)
17
- detector.available_checks(conditions)
18
- end
19
-
20
16
  def procedure(label)
21
17
  ensure_one_object(:procedure, label)
22
18
  end
@@ -25,6 +25,11 @@ module ForemanMaintain
25
25
  @foreman_port = @options.fetch(:foreman_port, 443)
26
26
  end
27
27
 
28
+ def use_color?
29
+ ENV['TERM'] && ENV.fetch('NO_COLOR', '') == '' && \
30
+ system('command -v tput', out: File.open('/dev/null')) && `tput colors`.to_i > 0
31
+ end
32
+
28
33
  private
29
34
 
30
35
  def load_log_configs
@@ -1,17 +1,5 @@
1
1
  module ForemanMaintain
2
2
  module CoreExt
3
- module StripHeredoc
4
- def strip_heredoc
5
- indent = 0
6
- indented_lines = scan(/^[ \t]+(?=\S)/)
7
- unless indented_lines.empty?
8
- indent = indented_lines.min.size
9
- end
10
- gsub(/^[ \t]{#{indent}}/, '')
11
- end
12
- end
13
- String.include StripHeredoc
14
-
15
3
  module ValidateOptions
16
4
  def validate_options!(*valid_keys)
17
5
  valid_keys.flatten!
@@ -24,6 +24,7 @@ module ForemanMaintain
24
24
  @all_features_scanned = false
25
25
  @available_checks = nil
26
26
  @available_scenarios = nil
27
+ @available_procedures = nil
27
28
  @scenarios ||= Scenario.all_sub_classes.select(&:autodetect?)
28
29
  end
29
30
 
@@ -301,17 +301,17 @@ module ForemanMaintain
301
301
  return if scenario.passed? && !scenario.warning?
302
302
 
303
303
  message = []
304
- message << <<-MESSAGE.strip_heredoc
304
+ message << <<~MESSAGE
305
305
  Scenario [#{scenario.description}] failed.
306
306
  MESSAGE
307
307
  recommend = []
308
308
 
309
309
  steps_with_abort = scenario.steps_with_abort(:whitelisted => false)
310
310
  unless steps_with_abort.empty?
311
- message << format(<<-MESSAGE.strip_heredoc, format_steps(steps_with_abort, "\n", 2))
312
- The processing was aborted by user during the following steps:
311
+ message << format(<<~MESSAGE, format_steps(steps_with_abort, "\n", 2))
312
+ The processing was aborted by user during the following steps:
313
313
 
314
- %s
314
+ %s
315
315
  MESSAGE
316
316
  end
317
317
 
@@ -323,28 +323,28 @@ module ForemanMaintain
323
323
 
324
324
  steps_to_whitelist = steps_with_error + steps_with_skipped - not_skippable_steps
325
325
  unless steps_with_error.empty?
326
- message << format(<<-MESSAGE.strip_heredoc, format_steps(steps_with_error, "\n", 2))
327
- The following steps ended up in failing state:
326
+ message << format(<<~MESSAGE, format_steps(steps_with_error, "\n", 2))
327
+ The following steps ended up in failing state:
328
328
 
329
- %s
329
+ %s
330
330
  MESSAGE
331
331
  whitelist_labels = steps_to_whitelist.map(&:label_dashed).join(',')
332
332
  unless whitelist_labels.empty?
333
333
  recommend << if scenario.detector.feature(:instance).downstream
334
- format(<<-MESSAGE.strip_heredoc)
335
- Resolve the failed steps and rerun the command.
334
+ format(<<~MESSAGE)
335
+ Resolve the failed steps and rerun the command.
336
336
 
337
- If the situation persists and, you are unclear what to do next,
338
- contact #{scenario.detector.feature(:instance).project_support_entity}.
337
+ If the situation persists and, you are unclear what to do next,
338
+ contact #{scenario.detector.feature(:instance).project_support_entity}.
339
339
 
340
- In case the failures are false positives, use
341
- --whitelist="#{whitelist_labels}"
340
+ In case the failures are false positives, use
341
+ --whitelist="#{whitelist_labels}"
342
342
  MESSAGE
343
343
  else
344
- format(<<-MESSAGE.strip_heredoc)
345
- Resolve the failed steps and rerun the command.
346
- In case the failures are false positives, use
347
- --whitelist="#{whitelist_labels}"
344
+ format(<<~MESSAGE)
345
+ Resolve the failed steps and rerun the command.
346
+ In case the failures are false positives, use
347
+ --whitelist="#{whitelist_labels}"
348
348
  MESSAGE
349
349
  end
350
350
  end
@@ -352,15 +352,15 @@ module ForemanMaintain
352
352
 
353
353
  steps_with_warning = scenario.steps_with_warning(:whitelisted => false)
354
354
  unless steps_with_warning.empty?
355
- message << format(<<-MESSAGE.strip_heredoc, format_steps(steps_with_warning, "\n", 2))
356
- The following steps ended up in warning state:
355
+ message << format(<<~MESSAGE, format_steps(steps_with_warning, "\n", 2))
356
+ The following steps ended up in warning state:
357
357
 
358
- %s
358
+ %s
359
359
  MESSAGE
360
360
 
361
- recommend << <<-MESSAGE.strip_heredoc
362
- The steps in warning state itself might not mean there is an error,
363
- but it should be reviewed to ensure the behavior is expected
361
+ recommend << <<~MESSAGE
362
+ The steps in warning state itself might not mean there is an error,
363
+ but it should be reviewed to ensure the behavior is expected
364
364
  MESSAGE
365
365
  end
366
366
  puts((message + recommend).join("\n"))
@@ -67,7 +67,7 @@ module ForemanMaintain
67
67
  end
68
68
 
69
69
  until_valid_decision do
70
- filter_decision(ask("#{message}, [#{actions_msg}]"))
70
+ filter_decision(ask("#{message}\n[#{actions_msg}]"))
71
71
  end
72
72
  end
73
73
  # rubocop:enable Metrics/LineLength
@@ -133,10 +133,10 @@ module ForemanMaintain
133
133
  decision = super(scenario)
134
134
  # we have not asked the user already about next steps
135
135
  if decision.nil? && @ask_to_confirm_update
136
- response = reporter.ask_decision(<<-MESSAGE.strip_heredoc.strip)
137
- The pre-update checks indicate that the system is ready for update.
138
- It's recommended to perform a backup at this stage.
139
- Confirm to continue with the modification part of the update
136
+ response = reporter.ask_decision(<<~MESSAGE.strip)
137
+ The pre-update checks indicate that the system is ready for update.
138
+ It's recommended to perform a backup at this stage.
139
+ Confirm to continue with the modification part of the update
140
140
  MESSAGE
141
141
  if [:no, :quit].include?(response)
142
142
  ask_to_quit
@@ -94,7 +94,7 @@ module ForemanMaintain
94
94
  def finish_upgrade
95
95
  @finished = true
96
96
  @reporter.hline
97
- @reporter.puts <<-MESSAGE.strip_heredoc
97
+ @reporter.puts <<~MESSAGE
98
98
  Upgrade finished.
99
99
  MESSAGE
100
100
  end
@@ -136,7 +136,7 @@ module ForemanMaintain
136
136
  def skip_phase(skipped_phase)
137
137
  with_non_empty_scenario(skipped_phase) do |scenario|
138
138
  @reporter.before_scenario_starts(scenario)
139
- @reporter.puts <<-MESSAGE.strip_heredoc
139
+ @reporter.puts <<~MESSAGE
140
140
  Skipping #{skipped_phase} phase as it was already run before.
141
141
  To enforce to run the phase, use `upgrade run --phase #{skipped_phase}`
142
142
  MESSAGE
@@ -164,7 +164,7 @@ module ForemanMaintain
164
164
  end
165
165
  end
166
166
  self.phase = :pre_upgrade_checks # rollback finished
167
- @reporter.puts <<-MESSAGE.strip_heredoc
167
+ @reporter.puts <<~MESSAGE
168
168
  The upgrade failed and system was restored to pre-upgrade state.
169
169
  MESSAGE
170
170
  end
@@ -199,10 +199,10 @@ module ForemanMaintain
199
199
  decision = super(scenario)
200
200
  # we have not asked the user already about next steps
201
201
  if decision.nil? && @ask_to_confirm_upgrade
202
- response = reporter.ask_decision(<<-MESSAGE.strip_heredoc.strip)
203
- The pre-upgrade checks indicate that the system is ready for upgrade.
204
- It's recommended to perform a backup at this stage.
205
- Confirm to continue with the modification part of the upgrade
202
+ response = reporter.ask_decision(<<~MESSAGE.strip)
203
+ The pre-upgrade checks indicate that the system is ready for upgrade.
204
+ It's recommended to perform a backup at this stage.
205
+ Confirm to continue with the modification part of the upgrade
206
206
  MESSAGE
207
207
  if [:no, :quit].include?(response)
208
208
  ask_to_quit
@@ -11,6 +11,9 @@ module ForemanMaintain
11
11
  :foreman_online_files, :foreman_offline_files, :fpc_offline_files,
12
12
  :fpc_online_files
13
13
 
14
+ ONLINE_BACKUP = 'online'.freeze
15
+ OFFLINE_BACKUP = 'offline'.freeze
16
+
14
17
  def initialize(backup_dir)
15
18
  # fpc stands for foreman proxy w/ content
16
19
  @backup_dir = backup_dir
@@ -260,6 +263,10 @@ module ForemanMaintain
260
263
  def different_source_os?
261
264
  source_os_version != "#{os_name} #{os_version}"
262
265
  end
266
+
267
+ def backup_type
268
+ online_backup? ? ONLINE_BACKUP : OFFLINE_BACKUP
269
+ end
263
270
  end
264
271
  end
265
272
  end
@@ -50,11 +50,7 @@ module ForemanMaintain::Utils
50
50
  end
51
51
 
52
52
  def exist?
53
- if @sys.systemd_installed?
54
- ['enabled', 'disabled'].include?(service_enabled_status)
55
- else
56
- File.exist?("/etc/init.d/#{@name}")
57
- end
53
+ ['enabled', 'disabled'].include?(service_enabled_status)
58
54
  end
59
55
 
60
56
  def enabled?
@@ -1,3 +1,3 @@
1
1
  module ForemanMaintain
2
- VERSION = '1.6.11'.freeze
2
+ VERSION = '1.6.13'.freeze
3
3
  end
@@ -1,7 +1,3 @@
1
- if RUBY_VERSION <= '1.8.7'
2
- require 'rubygems'
3
- end
4
-
5
1
  require 'forwardable'
6
2
  require 'json'
7
3
  require 'logger'
@@ -68,6 +64,7 @@ module ForemanMaintain
68
64
 
69
65
  # using a queue, we can log the messages which are generated before initializing logger
70
66
  self.config = Config.new(options)
67
+ configure_highline
71
68
  load_definitions
72
69
  init_logger
73
70
  update_path
@@ -102,6 +99,10 @@ module ForemanMaintain
102
99
  end
103
100
  end
104
101
 
102
+ def configure_highline
103
+ HighLine.use_color = config.use_color?
104
+ end
105
+
105
106
  def cache
106
107
  ObjectCache.instance
107
108
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_maintain
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.11
4
+ version: 1.6.13
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: 2024-06-26 00:00:00.000000000 Z
11
+ date: 2024-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: clamp
@@ -158,6 +158,7 @@ files:
158
158
  - config/foreman_maintain.yml.packaging
159
159
  - config/hammer.yml.example
160
160
  - definitions/checks/backup/certs_tar_exist.rb
161
+ - definitions/checks/backup/incremental_parent_type.rb
161
162
  - definitions/checks/candlepin/db_up.rb
162
163
  - definitions/checks/check_hotfix_installed.rb
163
164
  - definitions/checks/check_ipv6_disable.rb
@@ -234,9 +235,6 @@ files:
234
235
  - definitions/procedures/backup/compress_data.rb
235
236
  - definitions/procedures/backup/config_files.rb
236
237
  - definitions/procedures/backup/metadata.rb
237
- - definitions/procedures/backup/offline/candlepin_db.rb
238
- - definitions/procedures/backup/offline/foreman_db.rb
239
- - definitions/procedures/backup/offline/pulpcore_db.rb
240
238
  - definitions/procedures/backup/online/candlepin_db.rb
241
239
  - definitions/procedures/backup/online/foreman_db.rb
242
240
  - definitions/procedures/backup/online/pulpcore_db.rb
@@ -275,7 +273,6 @@ files:
275
273
  - definitions/procedures/packages/update.rb
276
274
  - definitions/procedures/packages/update_all_confirmation.rb
277
275
  - definitions/procedures/pulpcore/container_handle_image_metadata.rb
278
- - definitions/procedures/pulpcore/trim_rpm_changelogs.rb
279
276
  - definitions/procedures/puppet/delete_empty_ca_cert_request_files.rb
280
277
  - definitions/procedures/puppet/remove_puppet.rb
281
278
  - definitions/procedures/puppet/remove_puppet_data.rb
@@ -1,53 +0,0 @@
1
- module Procedures::Backup
2
- module Offline
3
- class CandlepinDB < ForemanMaintain::Procedure
4
- metadata do
5
- description 'Backup Candlepin DB offline'
6
- tags :backup
7
- label :backup_offline_candlepin_db
8
- for_feature :candlepin_database
9
- preparation_steps { Checks::Candlepin::DBUp.new unless feature(:candlepin_database).local? }
10
- param :backup_dir, 'Directory where to backup to', :required => true
11
- param :tar_volume_size, 'Size of tar volume (indicates splitting)'
12
- end
13
-
14
- def run
15
- if feature(:candlepin_database).local?
16
- if File.exist?(pg_backup_file)
17
- puts 'Already done'
18
- else
19
- local_backup
20
- end
21
- else
22
- puts "Backup of #{pg_data_dir} is not supported for remote databases." \
23
- ' Doing postgres dump instead...'
24
- with_spinner('Getting Candlepin DB dump') do
25
- feature(:candlepin_database).dump_db(File.join(@backup_dir, 'candlepin.dump'))
26
- end
27
- end
28
- end
29
-
30
- private
31
-
32
- def local_backup
33
- with_spinner("Collecting data from #{pg_data_dir}") do
34
- feature(:candlepin_database).backup_local(
35
- pg_backup_file,
36
- :listed_incremental => File.join(@backup_dir, '.postgres.snar'),
37
- :volume_size => @tar_volume_size,
38
- :data_dir => pg_data_dir,
39
- :restore_dir => feature(:candlepin_database).data_dir
40
- )
41
- end
42
- end
43
-
44
- def pg_backup_file
45
- File.join(@backup_dir, 'pgsql_data.tar')
46
- end
47
-
48
- def pg_data_dir
49
- feature(:candlepin_database).data_dir
50
- end
51
- end
52
- end
53
- end
@@ -1,73 +0,0 @@
1
- module Procedures::Backup
2
- module Offline
3
- class ForemanDB < ForemanMaintain::Procedure
4
- metadata do
5
- description 'Backup Foreman DB offline'
6
- tags :backup
7
- label :backup_offline_foreman_db
8
- for_feature :foreman_database
9
- preparation_steps { Checks::Foreman::DBUp.new unless feature(:foreman_database).local? }
10
- param :backup_dir, 'Directory where to backup to', :required => true
11
- param :tar_volume_size, 'Size of tar volume (indicates splitting)'
12
- end
13
-
14
- def run
15
- if feature(:foreman_database).local?
16
- if File.exist?(pg_backup_file)
17
- puts 'Already done'
18
- else
19
- local_backup
20
- end
21
- else
22
- puts "Backup of #{pg_data_dirs.join(',')} is not supported for remote databases." \
23
- ' Doing postgres dump instead...'
24
- with_spinner('Getting Foreman DB dump') do
25
- feature(:foreman_database).dump_db(File.join(@backup_dir, 'foreman.dump'))
26
- end
27
- end
28
- end
29
-
30
- private
31
-
32
- def local_backup
33
- with_spinner("Collecting data from #{pg_data_dirs.join(',')}") do
34
- pg_data_dirs.each_with_index do |pg_dir, index|
35
- do_backup(pg_dir, (index == 0) ? 'create' : 'append')
36
- end
37
- end
38
- end
39
-
40
- def do_backup(pg_dir, cmd)
41
- restore_dir = el? ? feature(:foreman_database).data_dir : pg_dir
42
- feature(:foreman_database).backup_local(
43
- pg_backup_file,
44
- :listed_incremental => File.join(@backup_dir, '.postgres.snar'),
45
- :volume_size => @tar_volume_size,
46
- :data_dir => pg_dir,
47
- :restore_dir => restore_dir,
48
- :command => cmd
49
- )
50
- end
51
-
52
- def pg_backup_file
53
- File.join(@backup_dir, 'pgsql_data.tar')
54
- end
55
-
56
- def pg_data_dirs
57
- el? ? [pg_data_dir_el] : pg_data_dirs_deb
58
- end
59
-
60
- def pg_data_dirs_deb
61
- # The Debian based OSes support multiple installations of Postgresql
62
- # There could be situations where Foreman db is either of these versions
63
- # To be sure we backup the system correctly without missing anything
64
- # we backup all of the Postgresql dirs
65
- feature(:foreman_database).data_dir
66
- end
67
-
68
- def pg_data_dir_el
69
- feature(:foreman_database).data_dir
70
- end
71
- end
72
- end
73
- end
@@ -1,53 +0,0 @@
1
- module Procedures::Backup
2
- module Offline
3
- class PulpcoreDB < ForemanMaintain::Procedure
4
- metadata do
5
- description 'Backup Pulpcore DB offline'
6
- tags :backup
7
- label :backup_offline_pulpcore_db
8
- for_feature :pulpcore_database
9
- preparation_steps { Checks::Pulpcore::DBUp.new unless feature(:pulpcore_database).local? }
10
- param :backup_dir, 'Directory where to backup to', :required => true
11
- param :tar_volume_size, 'Size of tar volume (indicates splitting)'
12
- end
13
-
14
- def run
15
- if feature(:pulpcore_database).local?
16
- if File.exist?(pg_backup_file)
17
- puts 'Already done'
18
- else
19
- local_backup
20
- end
21
- else
22
- puts "Backup of #{pg_data_dir} is not supported for remote databases." \
23
- ' Doing postgres dump instead...'
24
- with_spinner('Getting Pulpcore DB dump') do
25
- feature(:pulpcore_database).dump_db(File.join(@backup_dir, 'pulpcore.dump'))
26
- end
27
- end
28
- end
29
-
30
- private
31
-
32
- def local_backup
33
- with_spinner("Collecting data from #{pg_data_dir}") do
34
- feature(:pulpcore_database).backup_local(
35
- pg_backup_file,
36
- :listed_incremental => File.join(@backup_dir, '.postgres.snar'),
37
- :volume_size => @tar_volume_size,
38
- :data_dir => pg_data_dir,
39
- :restore_dir => feature(:pulpcore_database).data_dir
40
- )
41
- end
42
- end
43
-
44
- def pg_backup_file
45
- File.join(@backup_dir, 'pgsql_data.tar')
46
- end
47
-
48
- def pg_data_dir
49
- feature(:pulpcore_database).data_dir
50
- end
51
- end
52
- end
53
- end
@@ -1,22 +0,0 @@
1
- module Procedures::Pulpcore
2
- class TrimRpmChangelogs < ForemanMaintain::Procedure
3
- include ForemanMaintain::Concerns::SystemService
4
- include ForemanMaintain::Concerns::PulpCommon
5
-
6
- metadata do
7
- description 'Trim RPM changelogs in the pulpcore db'
8
- for_feature :pulpcore
9
- end
10
-
11
- def run
12
- with_spinner('Trimming RPM changelogs in the pulpcore db') do |spinner|
13
- necessary_services = feature(:pulpcore_database).services
14
-
15
- feature(:service).handle_services(spinner, 'start', :only => necessary_services)
16
-
17
- spinner.update('Trimming RPM changelogs')
18
- execute!(pulpcore_manager('rpm-trim-changelogs'))
19
- end
20
- end
21
- end
22
- end