foreman_openscap 7.1.1 → 8.0.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.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/foreman_openscap/locale/cs_CZ/foreman_openscap.js +517 -421
  3. data/app/assets/javascripts/foreman_openscap/locale/de/foreman_openscap.js +907 -814
  4. data/app/assets/javascripts/foreman_openscap/locale/en/foreman_openscap.js +517 -421
  5. data/app/assets/javascripts/foreman_openscap/locale/en_GB/foreman_openscap.js +549 -453
  6. data/app/assets/javascripts/foreman_openscap/locale/es/foreman_openscap.js +911 -818
  7. data/app/assets/javascripts/foreman_openscap/locale/fr/foreman_openscap.js +911 -818
  8. data/app/assets/javascripts/foreman_openscap/locale/gl/foreman_openscap.js +556 -460
  9. data/app/assets/javascripts/foreman_openscap/locale/it/foreman_openscap.js +601 -505
  10. data/app/assets/javascripts/foreman_openscap/locale/ja/foreman_openscap.js +909 -816
  11. data/app/assets/javascripts/foreman_openscap/locale/ka/foreman_openscap.js +96 -0
  12. data/app/assets/javascripts/foreman_openscap/locale/ko/foreman_openscap.js +704 -611
  13. data/app/assets/javascripts/foreman_openscap/locale/pt_BR/foreman_openscap.js +911 -818
  14. data/app/assets/javascripts/foreman_openscap/locale/ru/foreman_openscap.js +706 -613
  15. data/app/assets/javascripts/foreman_openscap/locale/sv_SE/foreman_openscap.js +556 -460
  16. data/app/assets/javascripts/foreman_openscap/locale/zh_CN/foreman_openscap.js +909 -816
  17. data/app/assets/javascripts/foreman_openscap/locale/zh_TW/foreman_openscap.js +704 -611
  18. data/app/assets/javascripts/foreman_openscap/reports.js +5 -0
  19. data/app/controllers/arf_reports_controller.rb +23 -2
  20. data/app/helpers/arf_reports_helper.rb +17 -4
  21. data/app/models/foreman_openscap/arf_report.rb +11 -2
  22. data/app/views/arf_reports/_output.html.erb +5 -1
  23. data/app/views/job_templates/run_openscap_remediation_-_ansible_default.erb +27 -0
  24. data/app/views/job_templates/run_openscap_remediation_-_script_default.erb +24 -0
  25. data/config/routes.rb +1 -0
  26. data/db/migrate/20230912122310_add_fixes_to_message.rb +5 -0
  27. data/lib/foreman_openscap/engine.rb +18 -2
  28. data/lib/foreman_openscap/version.rb +1 -1
  29. data/lib/tasks/foreman_openscap_tasks.rake +5 -16
  30. data/locale/cs_CZ/foreman_openscap.edit.po +145 -17
  31. data/locale/cs_CZ/foreman_openscap.po +96 -0
  32. data/locale/de/foreman_openscap.edit.po +248 -282
  33. data/locale/de/foreman_openscap.po +96 -0
  34. data/locale/en/foreman_openscap.edit.po +145 -17
  35. data/locale/en/foreman_openscap.po +96 -0
  36. data/locale/en_GB/foreman_openscap.edit.po +145 -17
  37. data/locale/en_GB/foreman_openscap.po +96 -0
  38. data/locale/es/foreman_openscap.edit.po +241 -279
  39. data/locale/es/foreman_openscap.po +96 -0
  40. data/locale/foreman_openscap.pot +164 -12
  41. data/locale/fr/foreman_openscap.edit.po +330 -363
  42. data/locale/fr/foreman_openscap.po +96 -0
  43. data/locale/gl/foreman_openscap.edit.po +145 -17
  44. data/locale/gl/foreman_openscap.po +96 -0
  45. data/locale/it/foreman_openscap.edit.po +145 -17
  46. data/locale/it/foreman_openscap.po +96 -0
  47. data/locale/ja/foreman_openscap.edit.po +314 -347
  48. data/locale/ja/foreman_openscap.po +96 -0
  49. data/locale/ka/foreman_openscap.edit.po +289 -328
  50. data/locale/ka/foreman_openscap.po +96 -0
  51. data/locale/ka/foreman_openscap.po.time_stamp +0 -0
  52. data/locale/ko/foreman_openscap.edit.po +146 -18
  53. data/locale/ko/foreman_openscap.po +96 -0
  54. data/locale/pt_BR/foreman_openscap.edit.po +247 -279
  55. data/locale/pt_BR/foreman_openscap.po +96 -0
  56. data/locale/ru/foreman_openscap.edit.po +146 -18
  57. data/locale/ru/foreman_openscap.po +96 -0
  58. data/locale/sv_SE/foreman_openscap.edit.po +145 -17
  59. data/locale/sv_SE/foreman_openscap.po +96 -0
  60. data/locale/zh_CN/foreman_openscap.edit.po +314 -347
  61. data/locale/zh_CN/foreman_openscap.po +96 -0
  62. data/locale/zh_TW/foreman_openscap.edit.po +146 -18
  63. data/locale/zh_TW/foreman_openscap.po +96 -0
  64. data/webpack/components/EmptyState.js +6 -2
  65. data/webpack/components/OpenscapRemediationWizard/OpenscapRemediationSelectors.js +16 -0
  66. data/webpack/components/OpenscapRemediationWizard/OpenscapRemediationWizardContext.js +4 -0
  67. data/webpack/components/OpenscapRemediationWizard/ViewSelectedHostsLink.js +38 -0
  68. data/webpack/components/OpenscapRemediationWizard/WizardHeader.js +43 -0
  69. data/webpack/components/OpenscapRemediationWizard/constants.js +14 -0
  70. data/webpack/components/OpenscapRemediationWizard/helpers.js +33 -0
  71. data/webpack/components/OpenscapRemediationWizard/index.js +160 -0
  72. data/webpack/components/OpenscapRemediationWizard/steps/Finish.js +131 -0
  73. data/webpack/components/OpenscapRemediationWizard/steps/ReviewHosts.js +217 -0
  74. data/webpack/components/OpenscapRemediationWizard/steps/ReviewRemediation.js +176 -0
  75. data/webpack/components/OpenscapRemediationWizard/steps/ReviewRemediation.scss +4 -0
  76. data/webpack/components/OpenscapRemediationWizard/steps/SnippetSelect.js +160 -0
  77. data/webpack/components/OpenscapRemediationWizard/steps/index.js +4 -0
  78. data/webpack/index.js +8 -3
  79. data/webpack/testHelper.js +6 -5
  80. metadata +20 -3
@@ -4,3 +4,8 @@ function showReportDetails(log_id, event) {
4
4
  showDetails.is(':visible') ? $(event).find('span').attr('class', 'glyphicon glyphicon-collapse-up') : $(event).find('span').attr('class', 'glyphicon glyphicon-collapse-down');
5
5
  }
6
6
 
7
+ function showRemediationWizard(log_id) {
8
+ var wizard_button = $('#openscapRemediationWizardButton');
9
+ wizard_button.attr('data-log-id', log_id);
10
+ wizard_button.click();
11
+ }
@@ -2,7 +2,7 @@ class ArfReportsController < ApplicationController
2
2
  include Foreman::Controller::AutoCompleteSearch
3
3
  include ForemanOpenscap::ArfReportsControllerCommonExtensions
4
4
 
5
- before_action :find_arf_report, :only => %i[show show_html destroy parse_html parse_bzip download_html]
5
+ before_action :find_arf_report, :only => %i[show show_html destroy parse_html parse_bzip download_html show_log]
6
6
  before_action :find_multiple, :only => %i[delete_multiple submit_delete_multiple]
7
7
 
8
8
  def model_of_controller
@@ -72,6 +72,27 @@ class ArfReportsController < ApplicationController
72
72
  end
73
73
  end
74
74
 
75
+ def show_log
76
+ return not_found unless @arf_report # TODO: use Message/Log model directly instead?
77
+
78
+ log = @arf_report.logs.find(params[:log_id])
79
+ return not_found unless log
80
+
81
+ respond_to do |format|
82
+ format.json do
83
+ render json: {
84
+ log: {
85
+ source: log.source,
86
+ message: {
87
+ value: log.message.value,
88
+ fixes: log.message.fixes,
89
+ }
90
+ },
91
+ }, status: :ok
92
+ end
93
+ end
94
+ end
95
+
75
96
  private
76
97
 
77
98
  def find_arf_report
@@ -99,7 +120,7 @@ class ArfReportsController < ApplicationController
99
120
 
100
121
  def action_permission
101
122
  case params[:action]
102
- when 'show_html', 'parse_html', 'parse_bzip', 'download_html'
123
+ when 'show_html', 'parse_html', 'parse_bzip', 'download_html', 'show_log'
103
124
  :view
104
125
  when 'delete_multiple', 'submit_delete_multiple'
105
126
  :destroy
@@ -62,9 +62,22 @@ module ArfReportsHelper
62
62
  msg.html_safe
63
63
  end
64
64
 
65
- def host_search_by_rule_result_buttons(source)
66
- action_buttons(display_link_if_authorized(_('Hosts failing this rule'), hash_for_hosts_path(:search => "fails_xccdf_rule = #{source}")),
67
- display_link_if_authorized(_('Hosts passing this rule'), hash_for_hosts_path(:search => "passes_xccdf_rule = #{source}")),
68
- display_link_if_authorized(_('Hosts othering this rule'), hash_for_hosts_path(:search => "others_xccdf_rule = #{source}")))
65
+ def host_search_by_rule_result_buttons(log)
66
+ buttons = [
67
+ display_link_if_authorized(_('Hosts failing this rule'), hash_for_hosts_path(:search => "fails_xccdf_rule = #{log.source}")),
68
+ display_link_if_authorized(_('Hosts passing this rule'), hash_for_hosts_path(:search => "passes_xccdf_rule = #{log.source}")),
69
+ display_link_if_authorized(_('Hosts othering this rule'), hash_for_hosts_path(:search => "others_xccdf_rule = #{log.source}")),
70
+ ]
71
+ if log.result == 'fail' && log.message.fixes.present?
72
+ buttons << link_to_function_if_authorized(_('Remediation'), "showRemediationWizard(#{log.id})", hash_for_show_log_arf_report_path(id: log.report.id))
73
+ end
74
+ action_buttons(buttons)
75
+ end
76
+
77
+ def supported_remediation_snippets
78
+ snippets = []
79
+ snippets << 'urn:xccdf:fix:script:sh' if ForemanOpenscap.with_remote_execution?
80
+ snippets << 'urn:xccdf:fix:script:ansible' if ForemanOpenscap.with_ansible?
81
+ snippets
69
82
  end
70
83
  end
@@ -131,14 +131,16 @@ module ForemanOpenscap
131
131
  :severity => log[:severity],
132
132
  :description => newline_to_space(log[:description]),
133
133
  :rationale => newline_to_space(log[:rationale]),
134
- :scap_references => references_links(log[:references])
134
+ :scap_references => references_links(log[:references]),
135
+ :fixes => fixes(log[:fixes])
135
136
  }
136
137
  else
137
138
  msg = Message.new(:value => N_(log[:title]),
138
139
  :severity => log[:severity],
139
140
  :description => newline_to_space(log[:description]),
140
141
  :rationale => newline_to_space(log[:rationale]),
141
- :scap_references => references_links(log[:references]))
142
+ :scap_references => references_links(log[:references]),
143
+ :fixes => fixes(log[:fixes]))
142
144
  end
143
145
  msg.save!
144
146
  end
@@ -222,12 +224,19 @@ module ForemanOpenscap
222
224
  html_links.join(', ')
223
225
  end
224
226
 
227
+ def self.fixes(raw_fixes)
228
+ return if raw_fixes.empty?
229
+
230
+ JSON.fast_generate(raw_fixes)
231
+ end
232
+
225
233
  def self.update_msg_with_changes(msg, incoming_data)
226
234
  msg.severity = incoming_data['severity']
227
235
  msg.description = incoming_data['description']
228
236
  msg.rationale = incoming_data['rationale']
229
237
  msg.scap_references = incoming_data['references']
230
238
  msg.value = incoming_data['title']
239
+ msg.fixes = fixes(incoming_data['fixes'])
231
240
 
232
241
  return unless msg.changed?
233
242
  msg.save
@@ -25,7 +25,7 @@
25
25
  </td>
26
26
  <td><%= log.source %></td>
27
27
  <td><%= react_component 'RuleSeverity', { :severity => log.message.severity.downcase } %></td>
28
- <td><%= host_search_by_rule_result_buttons(log.source) %></td>
28
+ <td><%= host_search_by_rule_result_buttons(log) %></td>
29
29
  </tr>
30
30
  <% end %>
31
31
  <tr id='ntsh' <%= "style='display: none;'".html_safe if logs.size > 0%>>
@@ -35,3 +35,7 @@
35
35
  </tr>
36
36
  </tbody>
37
37
  </table>
38
+ <%= react_component 'OpenscapRemediationWizard',
39
+ { report_id: @arf_report.id,
40
+ host: { name: @arf_report.host.name, id: @arf_report.host.id },
41
+ supported_remediation_snippets: supported_remediation_snippets } %>
@@ -0,0 +1,27 @@
1
+ <%#
2
+ name: Run OpenSCAP remediation - Ansible Default
3
+ job_category: OpenSCAP Ansible Commands
4
+ description_format: Run OpenSCAP remediation on given host. Please note, it is not meant to be used directly.
5
+ snippet: false
6
+ provider_type: Ansible
7
+ kind: job_template
8
+ model: JobTemplate
9
+ feature: ansible_run_openscap_remediation
10
+ template_inputs:
11
+ - name: tasks
12
+ description: Tasks to run on the host
13
+ input_type: user
14
+ required: true
15
+ - name: reboot
16
+ description: Indicate wether the host should be rebooted after all the remediation
17
+ input_type: user
18
+ required: false
19
+ %>
20
+ ---
21
+ - hosts: all
22
+ tasks:
23
+ <%= indent(4) { input('tasks') } -%>
24
+ <% if truthy?(input('reboot')) %>
25
+ - name: Reboot the machine
26
+ reboot:
27
+ <% end %>
@@ -0,0 +1,24 @@
1
+ <%#
2
+ name: Run OpenSCAP remediation - Script Default
3
+ job_category: OpenSCAP
4
+ description_format: Run OpenSCAP remediation on given host. Please note, it is not meant to be used directly.
5
+ snippet: false
6
+ provider_type: script
7
+ kind: job_template
8
+ model: JobTemplate
9
+ feature: script_run_openscap_remediation
10
+ template_inputs:
11
+ - name: command
12
+ description: Command to run on the host
13
+ input_type: user
14
+ required: true
15
+ - name: reboot
16
+ description: Indicate wether the host should be rebooted after the remediation
17
+ input_type: user
18
+ required: false
19
+ %>
20
+ <%= input('command') %>
21
+ <% if truthy?(input('reboot')) -%>
22
+ echo "A reboot is required to finish the remediation. The system is going to reboot now."
23
+ <%= render_template('Power Action - Script Default', action: 'restart') %>
24
+ <% end -%>
data/config/routes.rb CHANGED
@@ -9,6 +9,7 @@ Rails.application.routes.draw do
9
9
  get 'parse_html'
10
10
  get 'parse_bzip'
11
11
  get 'download_html'
12
+ get 'show_log'
12
13
  end
13
14
  collection do
14
15
  get 'auto_complete_search'
@@ -0,0 +1,5 @@
1
+ class AddFixesToMessage < ActiveRecord::Migration[6.1]
2
+ def change
3
+ add_column :messages, :fixes, :text
4
+ end
5
+ end
@@ -48,7 +48,7 @@ module ForemanOpenscap
48
48
 
49
49
  initializer 'foreman_openscap.register_plugin', :before => :finisher_hook do |app|
50
50
  Foreman::Plugin.register :foreman_openscap do
51
- requires_foreman '>= 3.7'
51
+ requires_foreman '>= 3.11'
52
52
  register_gettext
53
53
 
54
54
  apipie_documented_controllers ["#{ForemanOpenscap::Engine.root}/app/controllers/api/v2/compliance/*.rb"]
@@ -58,7 +58,7 @@ module ForemanOpenscap
58
58
 
59
59
  # Add permissions
60
60
  security_block :foreman_openscap do
61
- permission :view_arf_reports, { :arf_reports => %i[index show parse_html show_html
61
+ permission :view_arf_reports, { :arf_reports => %i[index show parse_html show_html show_log
62
62
  parse_bzip auto_complete_search download_html],
63
63
  'api/v2/compliance/arf_reports' => %i[index show download download_html],
64
64
  :compliance_hosts => [:show] },
@@ -275,6 +275,16 @@ module ForemanOpenscap
275
275
  :description => N_("Run OVAL scan")
276
276
  }
277
277
 
278
+ ansible_remediation_options = {
279
+ :description => N_("Run OpenSCAP remediation with Ansible"),
280
+ :provided_inputs => ["tasks", "reboot"]
281
+ }
282
+
283
+ script_remediation_options = {
284
+ :description => N_("Run OpenSCAP remediation with Shell"),
285
+ :provided_inputs => ["command", "reboot"]
286
+ }
287
+
278
288
  if Gem::Version.new(ForemanRemoteExecution::VERSION) >= Gem::Version.new('1.2.3')
279
289
  options[:host_action_button] = true
280
290
  oval_options[:host_action_button] = (!::Foreman.in_rake? && ActiveRecord::Base.connection.table_exists?(:settings)) ? (Setting.find_by(:name => 'lab_features')&.value || false) : false
@@ -282,6 +292,8 @@ module ForemanOpenscap
282
292
 
283
293
  RemoteExecutionFeature.register(:foreman_openscap_run_scans, N_("Run OpenSCAP scan"), options)
284
294
  RemoteExecutionFeature.register(:foreman_openscap_run_oval_scans, N_("Run OVAL scan"), oval_options)
295
+ RemoteExecutionFeature.register(:ansible_run_openscap_remediation, N_("Run OpenSCAP remediation with Ansible"), ansible_remediation_options)
296
+ RemoteExecutionFeature.register(:script_run_openscap_remediation, N_("Run OpenSCAP remediation with Shell"), script_remediation_options)
285
297
  end
286
298
  end
287
299
 
@@ -303,4 +315,8 @@ module ForemanOpenscap
303
315
  def self.with_remote_execution?
304
316
  RemoteExecutionFeature rescue false
305
317
  end
318
+
319
+ def self.with_ansible?
320
+ ForemanAnsible rescue false
321
+ end
306
322
  end
@@ -1,3 +1,3 @@
1
1
  module ForemanOpenscap
2
- VERSION = "7.1.1".freeze
2
+ VERSION = "8.0.0".freeze
3
3
  end
@@ -86,22 +86,11 @@ namespace :test do
86
86
  test_dir = File.join(File.dirname(__FILE__), '../..', 'test')
87
87
  t.libs << ["test", test_dir]
88
88
  t.pattern = "#{test_dir}/**/*_test.rb"
89
- t.verbose = true
90
- t.warning = false
91
- end
92
- end
93
-
94
- namespace :test do
95
- desc "Test Core parts extended by ForemanOpenscap"
96
- Rake::TestTask.new(:foreman_openscap_extensions) do |t|
97
- test_dir = Rails.root.join('test')
98
- t.libs << ["test", test_dir]
99
- t.test_files = FileList[
100
- "#{test_dir}/unit/foreman/access_permissions_test.rb",
101
- "#{test_dir}/controllers/api/v2/hosts_controller_test.rb",
102
- "#{test_dir}/controllers/api/v2/hostgroups_controller_test.rb",
103
- "#{test_dir}/models/hosts/*_test.rb",
104
- ]
89
+ t.test_files = [
90
+ Rails.root.join('test/unit/foreman/access_permissions_test.rb'),
91
+ Rails.root.join('test/controllers/api/v2/hosts_controller_test.rb'),
92
+ Rails.root.join('test/controllers/api/v2/hostgroups_controller_test.rb'),
93
+ ] + Rails.root.glob("test/models/hosts/*_test.rb")
105
94
  t.verbose = true
106
95
  t.warning = false
107
96
  end
@@ -5,7 +5,7 @@
5
5
  #
6
6
  msgid ""
7
7
  msgstr ""
8
- "Project-Id-Version: foreman_openscap 7.1.0\n"
8
+ "Project-Id-Version: foreman_openscap 1.0.0\n"
9
9
  "Report-Msgid-Bugs-To: \n"
10
10
  "PO-Revision-Date: 2023-05-16 14:11+0200\n"
11
11
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
@@ -381,15 +381,15 @@ msgstr ""
381
381
  msgid "Successfully deleted %s compliance reports"
382
382
  msgstr ""
383
383
 
384
- #: ../app/controllers/arf_reports_controller.rb:85
384
+ #: ../app/controllers/arf_reports_controller.rb:106
385
385
  msgid "No compliance reports were found."
386
386
  msgstr ""
387
387
 
388
- #: ../app/controllers/arf_reports_controller.rb:89
388
+ #: ../app/controllers/arf_reports_controller.rb:110
389
389
  msgid "No compliance reports selected"
390
390
  msgstr ""
391
391
 
392
- #: ../app/controllers/arf_reports_controller.rb:94
392
+ #: ../app/controllers/arf_reports_controller.rb:115
393
393
  msgid "Something went wrong while selecting compliance reports - %s"
394
394
  msgstr ""
395
395
 
@@ -429,15 +429,15 @@ msgstr ""
429
429
  msgid "No valid policy ID provided"
430
430
  msgstr ""
431
431
 
432
- #: ../app/controllers/policies_controller.rb:125
433
- msgid "No hosts were found."
432
+ #: ../app/controllers/policies_controller.rb:129
433
+ msgid "No hosts were found with that id, name or query filter"
434
434
  msgstr ""
435
435
 
436
- #: ../app/controllers/policies_controller.rb:129
436
+ #: ../app/controllers/policies_controller.rb:134
437
437
  msgid "No hosts selected"
438
438
  msgstr ""
439
439
 
440
- #: ../app/controllers/policies_controller.rb:134
440
+ #: ../app/controllers/policies_controller.rb:139
441
441
  msgid "Something went wrong while selecting hosts - %s"
442
442
  msgstr ""
443
443
 
@@ -509,18 +509,22 @@ msgstr ""
509
509
  msgid " through %s"
510
510
  msgstr ""
511
511
 
512
- #: ../app/helpers/arf_reports_helper.rb:66
512
+ #: ../app/helpers/arf_reports_helper.rb:67
513
513
  msgid "Hosts failing this rule"
514
514
  msgstr ""
515
515
 
516
- #: ../app/helpers/arf_reports_helper.rb:67
516
+ #: ../app/helpers/arf_reports_helper.rb:68
517
517
  msgid "Hosts passing this rule"
518
518
  msgstr ""
519
519
 
520
- #: ../app/helpers/arf_reports_helper.rb:68
520
+ #: ../app/helpers/arf_reports_helper.rb:69
521
521
  msgid "Hosts othering this rule"
522
522
  msgstr ""
523
523
 
524
+ #: ../app/helpers/arf_reports_helper.rb:72
525
+ msgid "Remediation"
526
+ msgstr ""
527
+
524
528
  #: ../app/helpers/compliance_dashboard_helper.rb:3 ../app/views/arf_reports/_list.html.erb:6 ../app/views/arf_reports/delete_multiple.html.erb:7 ../app/views/policy_dashboard/_policy_reports.html.erb:6
525
529
  msgid "Host"
526
530
  msgstr ""
@@ -1160,7 +1164,7 @@ msgstr ""
1160
1164
  msgid "You can specify custom cron line, e.g. \"0 3 * * *\", separate each of 5 values by space"
1161
1165
  msgstr ""
1162
1166
 
1163
- #: ../app/views/policies/_list.html.erb:3 ../app/views/tailoring_files/_list.html.erb:3 ../webpack/routes/OvalContents/OvalContentsIndex/OvalContentsTable.js:19 ../webpack/routes/OvalContents/OvalContentsNew/OvalContentsNew.js:57 ../webpack/routes/OvalContents/OvalContentsShow/OvalContentsShow.js:48 ../webpack/routes/OvalPolicies/OvalPoliciesIndex/OvalPoliciesTable.js:19 ../webpack/routes/OvalPolicies/OvalPoliciesNew/NewOvalPolicyForm.js:56 ../webpack/routes/OvalPolicies/OvalPoliciesShow/DetailsTab.js:31 ../webpack/routes/OvalPolicies/OvalPoliciesShow/HostgroupsTable.js:9
1167
+ #: ../app/views/policies/_list.html.erb:3 ../app/views/tailoring_files/_list.html.erb:3 ../webpack/components/OpenscapRemediationWizard/steps/ReviewHosts.js:162 ../webpack/routes/OvalContents/OvalContentsIndex/OvalContentsTable.js:19 ../webpack/routes/OvalContents/OvalContentsNew/OvalContentsNew.js:57 ../webpack/routes/OvalContents/OvalContentsShow/OvalContentsShow.js:48 ../webpack/routes/OvalPolicies/OvalPoliciesIndex/OvalPoliciesTable.js:19 ../webpack/routes/OvalPolicies/OvalPoliciesNew/NewOvalPolicyForm.js:56 ../webpack/routes/OvalPolicies/OvalPoliciesShow/DetailsTab.js:31 ../webpack/routes/OvalPolicies/OvalPoliciesShow/HostgroupsTable.js:9
1164
1168
  msgid "Name"
1165
1169
  msgstr ""
1166
1170
 
@@ -1486,14 +1490,22 @@ msgstr ""
1486
1490
  msgid "ID of OpenSCAP Proxy"
1487
1491
  msgstr ""
1488
1492
 
1489
- #: ../lib/foreman_openscap/engine.rb:270 ../lib/foreman_openscap/engine.rb:283
1493
+ #: ../lib/foreman_openscap/engine.rb:270 ../lib/foreman_openscap/engine.rb:293
1490
1494
  msgid "Run OpenSCAP scan"
1491
1495
  msgstr ""
1492
1496
 
1493
- #: ../lib/foreman_openscap/engine.rb:275 ../lib/foreman_openscap/engine.rb:284
1497
+ #: ../lib/foreman_openscap/engine.rb:275 ../lib/foreman_openscap/engine.rb:294
1494
1498
  msgid "Run OVAL scan"
1495
1499
  msgstr ""
1496
1500
 
1501
+ #: ../lib/foreman_openscap/engine.rb:279 ../lib/foreman_openscap/engine.rb:295
1502
+ msgid "Run OpenSCAP remediation with Ansible"
1503
+ msgstr ""
1504
+
1505
+ #: ../lib/foreman_openscap/engine.rb:284 ../lib/foreman_openscap/engine.rb:296
1506
+ msgid "Run OpenSCAP remediation with Shell"
1507
+ msgstr ""
1508
+
1497
1509
  #: ../webpack/components/ConfirmModal.js:19
1498
1510
  msgid "Confirm"
1499
1511
  msgstr ""
@@ -1506,14 +1518,130 @@ msgstr ""
1506
1518
  msgid "There's no available report for this host"
1507
1519
  msgstr ""
1508
1520
 
1509
- #: ../webpack/components/withDeleteModal.js:27
1510
- msgid "Are you sure you want to delete %s?"
1521
+ #: ../webpack/components/OpenscapRemediationWizard/ViewSelectedHostsLink.js:27
1522
+ msgid "View selected hosts"
1523
+ msgstr ""
1524
+
1525
+ #: ../webpack/components/OpenscapRemediationWizard/index.js:69 ../webpack/components/OpenscapRemediationWizard/steps/ReviewHosts.js:174
1526
+ msgid "Review hosts"
1527
+ msgstr ""
1528
+
1529
+ #: ../webpack/components/OpenscapRemediationWizard/index.js:77 ../webpack/components/OpenscapRemediationWizard/steps/SnippetSelect.js:123
1530
+ msgid "Select snippet"
1531
+ msgstr ""
1532
+
1533
+ #: ../webpack/components/OpenscapRemediationWizard/index.js:85 ../webpack/components/OpenscapRemediationWizard/steps/ReviewRemediation.js:94
1534
+ msgid "Review remediation"
1535
+ msgstr ""
1536
+
1537
+ #: ../webpack/components/OpenscapRemediationWizard/index.js:89
1538
+ msgid "Run"
1511
1539
  msgstr ""
1512
1540
 
1513
- #: ../webpack/components/withLoading.js:12
1541
+ #: ../webpack/components/OpenscapRemediationWizard/index.js:93
1542
+ msgid "Done"
1543
+ msgstr ""
1544
+
1545
+ #: ../webpack/components/OpenscapRemediationWizard/index.js:127
1546
+ msgid "Remediate %s rule"
1547
+ msgstr ""
1548
+
1549
+ #: ../webpack/components/OpenscapRemediationWizard/steps/Finish.js:84
1550
+ msgid "Job details"
1551
+ msgstr ""
1552
+
1553
+ #: ../webpack/components/OpenscapRemediationWizard/steps/Finish.js:87
1554
+ msgid "Close"
1555
+ msgstr ""
1556
+
1557
+ #: ../webpack/components/OpenscapRemediationWizard/steps/Finish.js:97 ../webpack/components/OpenscapRemediationWizard/steps/SnippetSelect.js:144 ../webpack/components/withLoading.js:12
1514
1558
  msgid "Error!"
1515
1559
  msgstr ""
1516
1560
 
1561
+ #: ../webpack/components/OpenscapRemediationWizard/steps/Finish.js:105
1562
+ msgid "The job has started on selected host(s), you can check the status on the job details page."
1563
+ msgstr ""
1564
+
1565
+ #: ../webpack/components/OpenscapRemediationWizard/steps/ReviewHosts.js:167
1566
+ msgid "OS"
1567
+ msgstr ""
1568
+
1569
+ #: ../webpack/components/OpenscapRemediationWizard/steps/ReviewHosts.js:175
1570
+ msgid "By default, remediation is applied to the current host. Optionally, remediate any additional hosts that fail the rule."
1571
+ msgstr ""
1572
+
1573
+ #: ../webpack/components/OpenscapRemediationWizard/steps/ReviewRemediation.js:61
1574
+ msgid "Review the remediation snippet and apply it to the host manually."
1575
+ msgstr ""
1576
+
1577
+ #: ../webpack/components/OpenscapRemediationWizard/steps/ReviewRemediation.js:62
1578
+ msgid "Review the remediation snippet that will be applied to selected host(s)."
1579
+ msgstr ""
1580
+
1581
+ #: ../webpack/components/OpenscapRemediationWizard/steps/ReviewRemediation.js:67
1582
+ msgid "A reboot is required after applying remediation."
1583
+ msgstr ""
1584
+
1585
+ #: ../webpack/components/OpenscapRemediationWizard/steps/ReviewRemediation.js:68
1586
+ msgid "A reboot might be required after applying remediation."
1587
+ msgstr ""
1588
+
1589
+ #: ../webpack/components/OpenscapRemediationWizard/steps/ReviewRemediation.js:84
1590
+ msgid "Successfully copied to clipboard!"
1591
+ msgstr ""
1592
+
1593
+ #: ../webpack/components/OpenscapRemediationWizard/steps/ReviewRemediation.js:85
1594
+ msgid "Copy to clipboard"
1595
+ msgstr ""
1596
+
1597
+ #: ../webpack/components/OpenscapRemediationWizard/steps/ReviewRemediation.js:103
1598
+ msgid "Do not implement any of the recommended remedial actions or scripts without first testing them in a non-production environment."
1599
+ msgstr ""
1600
+
1601
+ #: ../webpack/components/OpenscapRemediationWizard/steps/ReviewRemediation.js:106
1602
+ msgid "Remediation might render the system non-functional."
1603
+ msgstr ""
1604
+
1605
+ #: ../webpack/components/OpenscapRemediationWizard/steps/ReviewRemediation.js:139
1606
+ msgid "Other hosts failing this rule"
1607
+ msgstr ""
1608
+
1609
+ #: ../webpack/components/OpenscapRemediationWizard/steps/ReviewRemediation.js:155
1610
+ msgid "Reboot the system(s)"
1611
+ msgstr ""
1612
+
1613
+ #: ../webpack/components/OpenscapRemediationWizard/steps/SnippetSelect.js:71
1614
+ msgid "Method"
1615
+ msgstr ""
1616
+
1617
+ #: ../webpack/components/OpenscapRemediationWizard/steps/SnippetSelect.js:77
1618
+ msgid "Remote job"
1619
+ msgstr ""
1620
+
1621
+ #: ../webpack/components/OpenscapRemediationWizard/steps/SnippetSelect.js:86
1622
+ msgid "Manual"
1623
+ msgstr ""
1624
+
1625
+ #: ../webpack/components/OpenscapRemediationWizard/steps/SnippetSelect.js:101
1626
+ msgid "There is no job to remediate with. Please remediate manually."
1627
+ msgstr ""
1628
+
1629
+ #: ../webpack/components/OpenscapRemediationWizard/steps/SnippetSelect.js:107
1630
+ msgid "Snippet"
1631
+ msgstr ""
1632
+
1633
+ #: ../webpack/components/OpenscapRemediationWizard/steps/SnippetSelect.js:150
1634
+ msgid "Select remediation method"
1635
+ msgstr ""
1636
+
1637
+ #: ../webpack/components/OpenscapRemediationWizard/steps/SnippetSelect.js:151
1638
+ msgid "You can remediate by running a remote job or you can display a snippet for manual remediation."
1639
+ msgstr ""
1640
+
1641
+ #: ../webpack/components/withDeleteModal.js:27
1642
+ msgid "Are you sure you want to delete %s?"
1643
+ msgstr ""
1644
+
1517
1645
  #: ../webpack/components/withLoading.js:64
1518
1646
  msgid "Permission denied"
1519
1647
  msgstr ""