foreman_openscap 7.1.1 → 8.0.0

Sign up to get free protection for your applications and to get access to all the features.
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 ""