foreman_openscap 0.7.1 → 0.7.2

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 (85) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/api/v2/compliance/arf_reports_controller.rb +1 -1
  3. data/app/controllers/api/v2/compliance/policies_controller.rb +2 -2
  4. data/app/controllers/api/v2/compliance/scap_contents_controller.rb +1 -1
  5. data/app/controllers/api/v2/compliance/tailoring_files_controller.rb +1 -1
  6. data/app/controllers/arf_reports_controller.rb +9 -9
  7. data/app/controllers/concerns/foreman/controller/parameters/policy.rb +1 -1
  8. data/app/controllers/openscap_proxies_controller.rb +5 -5
  9. data/app/controllers/policies_controller.rb +16 -17
  10. data/app/controllers/policy_dashboard_controller.rb +2 -1
  11. data/app/controllers/scap_contents_controller.rb +2 -2
  12. data/app/controllers/tailoring_files_controller.rb +4 -4
  13. data/app/helpers/arf_report_dashboard_helper.rb +2 -3
  14. data/app/helpers/arf_reports_helper.rb +1 -1
  15. data/app/helpers/compliance_hosts_helper.rb +1 -2
  16. data/app/helpers/policies_helper.rb +4 -4
  17. data/app/helpers/policy_dashboard_helper.rb +2 -3
  18. data/app/lib/proxy_api/available_proxy.rb +2 -2
  19. data/app/lib/proxy_api/openscap.rb +1 -1
  20. data/app/mailers/foreman_openscap/policy_mailer.rb +1 -1
  21. data/app/models/concerns/foreman_openscap/compliance_status_scoped_search.rb +7 -8
  22. data/app/models/concerns/foreman_openscap/host_extensions.rb +44 -25
  23. data/app/models/concerns/foreman_openscap/log_extensions.rb +1 -1
  24. data/app/models/concerns/foreman_openscap/openscap_proxy_core_extensions.rb +3 -3
  25. data/app/models/foreman_openscap/arf_report.rb +34 -12
  26. data/app/models/foreman_openscap/policy.rb +19 -17
  27. data/app/models/foreman_openscap/scap_content.rb +4 -2
  28. data/app/services/foreman_openscap/arf_report_status_calculator.rb +1 -1
  29. data/app/services/foreman_openscap/host_report_dashboard/data.rb +2 -2
  30. data/app/services/foreman_openscap/policy_dashboard/data.rb +4 -3
  31. data/app/validators/foreman_openscap/data_stream_validator.rb +2 -2
  32. data/app/views/policy_dashboard/_policy_status_widget.html.erb +5 -5
  33. data/config/routes.rb +6 -6
  34. data/db/migrate/20141015115511_add_arf_report_unique_constraint.rb +1 -1
  35. data/db/migrate/20141113221054_create_scaptimony_scap_content_profiles.rb +1 -1
  36. data/db/migrate/20141116170632_remove_xccdf_profile_from_scaptimony_policies.rb +1 -1
  37. data/db/migrate/20141121120326_create_scaptimony_arf_report_breakdowns.rb +15 -15
  38. data/db/migrate/20141121164042_replace_arf_report_breakdown_view.rb +15 -15
  39. data/db/migrate/20141206211151_create_scaptimony_assets_policies.rb +1 -1
  40. data/db/migrate/20150115155947_add_scaptimony_scap_content_digest.rb +1 -1
  41. data/db/migrate/20150821100137_migrate_from_scaptimony.rb +1 -1
  42. data/db/migrate/20160830113437_remove_deleted_policy.rb +1 -1
  43. data/db/migrate/20160925213031_change_scap_widget_names.rb +8 -8
  44. data/db/migrate/20161223153249_add_permissions_to_arf_report.rb +4 -4
  45. data/db/seeds.d/75-job_templates.rb +6 -1
  46. data/db/seeds.d/openscap_feature.rb +1 -1
  47. data/lib/foreman_openscap/data_migration.rb +1 -2
  48. data/lib/foreman_openscap/engine.rb +33 -34
  49. data/lib/foreman_openscap/helper.rb +5 -7
  50. data/lib/foreman_openscap/message_cleaner.rb +32 -0
  51. data/lib/foreman_openscap/version.rb +1 -1
  52. data/lib/tasks/foreman_openscap_tasks.rake +12 -0
  53. data/locale/de/foreman_openscap.po +205 -43
  54. data/locale/en_GB/foreman_openscap.po +205 -43
  55. data/locale/es/foreman_openscap.po +205 -43
  56. data/locale/foreman_openscap.pot +418 -185
  57. data/locale/fr/foreman_openscap.po +205 -43
  58. data/locale/gl/foreman_openscap.po +205 -43
  59. data/locale/it/foreman_openscap.po +205 -43
  60. data/locale/ja/foreman_openscap.po +205 -43
  61. data/locale/ko/foreman_openscap.po +205 -43
  62. data/locale/pt_BR/foreman_openscap.po +205 -43
  63. data/locale/ru/foreman_openscap.po +205 -43
  64. data/locale/sv_SE/foreman_openscap.po +205 -43
  65. data/locale/zh_CN/foreman_openscap.po +205 -43
  66. data/locale/zh_TW/foreman_openscap.po +205 -43
  67. data/test/factories/arf_report_factory.rb +2 -2
  68. data/test/factories/asset_factory.rb +5 -0
  69. data/test/factories/compliance_host_factory.rb +4 -4
  70. data/test/factories/compliance_log_factory.rb +9 -4
  71. data/test/files/arf_report/arf_report.json +1 -0
  72. data/test/files/arf_report/arf_report_msg_desc_changed.json +1 -0
  73. data/test/files/arf_report/arf_report_msg_value_changed.json +1 -0
  74. data/test/functional/api/v2/compliance/arf_reports_controller_test.rb +111 -1
  75. data/test/functional/api/v2/compliance/policies_controller_test.rb +1 -1
  76. data/test/functional/api/v2/compliance/tailoring_files_controller_test.rb +4 -4
  77. data/test/test_plugin_helper.rb +4 -4
  78. data/test/unit/arf_report_test.rb +5 -5
  79. data/test/unit/concerns/host_extensions_test.rb +64 -4
  80. data/test/unit/message_cleaner_test.rb +31 -0
  81. data/test/unit/policy_mailer_test.rb +1 -2
  82. data/test/unit/scap_content_test.rb +3 -5
  83. data/test/unit/services/report_dashboard/data_test.rb +1 -1
  84. data/test/unit/services/tailoring_files_proxy_check_test.rb +4 -4
  85. metadata +12 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d990a16bea1dc5c0a6f4842fb3f61df880f744fb
4
- data.tar.gz: 1cc01508d9d31b40a171f809f4f6efa8ebd6485a
3
+ metadata.gz: 9ab167c73f11d1deec80d98b87c0c75a5c2df119
4
+ data.tar.gz: 2904ab063872e0ba90daca541917ebbde98d0927
5
5
  SHA512:
6
- metadata.gz: e33ad9f4607d3b235e0be752bf6a49594221a2ed8ac4e3c6a67f59b71df5712ad041c8e09ba4718d56301d4d9c21a2e9898c92168f1feb25e6180d630e11121a
7
- data.tar.gz: 2d58fcf86df24c30fdb767ad866a2e9ceb2b1e92a7ab8c97efcb793132f7a0371e2ffbce4d5ac1420665204abc1bc194702d4bb757338da4138669099a280a20
6
+ metadata.gz: ff2cdd7e0bedaabf6d5d5f76981afdf07019a8eee6faddd68b9ef88f349c4eef41b02994d04a4fd32894135dca037cedadcb24d5091a28407bdc3e2cc61f057d
7
+ data.tar.gz: 1661d0a384c8c66285cb2a4385aa47aeaccfdc4e4b8527a0eaca9cbb867fae5310e14b6d84f8dc1f687f7a55b37f30c0a861f6395bb309f7ade56960e3e9ba5b
@@ -19,7 +19,7 @@ module Api
19
19
  end
20
20
 
21
21
  def get_resource(message = 'no resource loaded')
22
- instance_variable_get :"@arf_report" or fail message
22
+ instance_variable_get :"@arf_report" or raise message
23
23
  end
24
24
 
25
25
  api :GET, '/compliance/arf_reports', N_('List ARF reports')
@@ -4,7 +4,7 @@ module Api::V2
4
4
  include Foreman::Controller::SmartProxyAuth
5
5
  include Foreman::Controller::Parameters::PolicyApi
6
6
 
7
- add_smart_proxy_filters [:content, :tailoring], :features => 'Openscap'
7
+ add_smart_proxy_filters %i(content tailoring), :features => 'Openscap'
8
8
 
9
9
  before_filter :find_resource, :except => %w(index create)
10
10
 
@@ -15,7 +15,7 @@ module Api::V2
15
15
  end
16
16
 
17
17
  def get_resource(message = 'no resource loaded')
18
- instance_variable_get :"@policy" or fail message
18
+ instance_variable_get :"@policy" or raise message
19
19
  end
20
20
 
21
21
  def policy_url(policy = nil)
@@ -9,7 +9,7 @@ module Api::V2
9
9
  end
10
10
 
11
11
  def get_resource(message = 'no resource loaded')
12
- instance_variable_get :"@scap_content" or fail message
12
+ instance_variable_get :"@scap_content" or raise message
13
13
  end
14
14
 
15
15
  api :GET, '/compliance/scap_contents', N_('List SCAP contents')
@@ -10,7 +10,7 @@ module Api::V2
10
10
  end
11
11
 
12
12
  def get_resource(message = 'no resource loaded')
13
- instance_variable_get :"@tailoring_file" or fail message
13
+ instance_variable_get :"@tailoring_file" or raise message
14
14
  end
15
15
 
16
16
  api :GET, '/compliance/tailoring_files', N_('List Tailoring files')
@@ -2,17 +2,17 @@ class ArfReportsController < ApplicationController
2
2
  include Foreman::Controller::AutoCompleteSearch
3
3
  include ForemanOpenscap::ArfReportsControllerCommonExtensions
4
4
 
5
- before_filter :find_arf_report, :only => [:show, :show_html, :destroy, :parse_html, :parse_bzip, :download_html]
6
- before_filter :find_multiple, :only => [:delete_multiple, :submit_delete_multiple]
5
+ before_filter :find_arf_report, :only => %i(show show_html destroy parse_html parse_bzip download_html)
6
+ before_filter :find_multiple, :only => %i(delete_multiple submit_delete_multiple)
7
7
 
8
8
  def model_of_controller
9
9
  ::ForemanOpenscap::ArfReport
10
10
  end
11
11
 
12
12
  def index
13
- @arf_reports = resource_base.includes(:host => [:policies, :last_report_object, :host_statuses])
14
- .search_for(params[:search], :order => params[:order])
15
- .paginate(:page => params[:page], :per_page => params[:per_page])
13
+ @arf_reports = resource_base.includes(:host => %i(policies last_report_object host_statuses))
14
+ .search_for(params[:search], :order => params[:order])
15
+ .paginate(:page => params[:page], :per_page => params[:per_page])
16
16
  end
17
17
 
18
18
  def show
@@ -34,7 +34,7 @@ class ArfReportsController < ApplicationController
34
34
  response = @arf_report.to_bzip
35
35
  send_data response, :filename => "#{format_filename}.xml.bz2", :type => 'application/octet-stream', :disposition => 'attachement'
36
36
  rescue => e
37
- process_error(:error_msg => (_("Failed to downloaded ARF report as bzip: %s") % (e.message)),
37
+ process_error(:error_msg => (_("Failed to downloaded ARF report as bzip: %s") % e.message),
38
38
  :error_redirect => arf_report_path(@arf_report.id))
39
39
  end
40
40
  end
@@ -52,7 +52,7 @@ class ArfReportsController < ApplicationController
52
52
 
53
53
  def destroy
54
54
  if @arf_report.destroy
55
- process_success(:success_msg => (_("Successfully deleted ARF report.")), :success_redirect => arf_reports_path)
55
+ process_success(:success_msg => _("Successfully deleted ARF report."), :success_redirect => arf_reports_path)
56
56
  else
57
57
  process_error(:error_msg => _("Failed to delete ARF Report for host %{host_name} reported at %{reported_at}") % {:host_name => @arf_report.host.name, :reported_at => @arf_report.reported_at})
58
58
  end
@@ -75,7 +75,7 @@ class ArfReportsController < ApplicationController
75
75
  private
76
76
 
77
77
  def find_arf_report
78
- @arf_report = resource_base.includes(:logs => [:message, :source]).find(params[:id])
78
+ @arf_report = resource_base.includes(:logs => %i(message source)).find(params[:id])
79
79
  end
80
80
 
81
81
  def find_multiple
@@ -91,7 +91,7 @@ class ArfReportsController < ApplicationController
91
91
  end
92
92
  return @arf_reports
93
93
  rescue => e
94
- error _("Something went wrong while selecting compliance reports - %s") % (e)
94
+ error _("Something went wrong while selecting compliance reports - %s") % e
95
95
  logger.debug e.message
96
96
  logger.debug e.backtrace.join("\n")
97
97
  redirect_to arf_reports_path and return false
@@ -5,7 +5,7 @@ module Foreman::Controller::Parameters::Policy
5
5
  class_methods do
6
6
  def policy_params_filter
7
7
  Foreman::ParameterFilter.new(::ForemanOpenscap::Policy).tap do |filter|
8
- filter.permit([:current_step, :wizard_initiated] + filter_params_list)
8
+ filter.permit(%i(current_step wizard_initiated) + filter_params_list)
9
9
  end
10
10
  end
11
11
  end
@@ -22,10 +22,10 @@ class OpenscapProxiesController < ApplicationController
22
22
  end
23
23
 
24
24
  def find_spool_error
25
- @smart_proxy.statuses[:logs].
26
- logs.
27
- log_entries.
28
- reverse.
29
- find { |entry| entry["level"] == "ERROR" && entry["message"].start_with?("Failed to parse Arf Report") }
25
+ @smart_proxy.statuses[:logs]
26
+ .logs
27
+ .log_entries
28
+ .reverse
29
+ .find { |entry| entry["level"] == "ERROR" && entry["message"].start_with?("Failed to parse Arf Report") }
30
30
  end
31
31
  end
@@ -2,8 +2,8 @@ class PoliciesController < ApplicationController
2
2
  include Foreman::Controller::AutoCompleteSearch
3
3
  include Foreman::Controller::Parameters::Policy
4
4
 
5
- before_filter :find_by_id, :only => [:show, :edit, :update, :parse, :destroy]
6
- before_filter :find_multiple, :only => [:select_multiple_hosts, :update_multiple_hosts, :disassociate_multiple_hosts, :remove_policy_from_multiple_hosts]
5
+ before_filter :find_by_id, :only => %i(show edit update parse destroy)
6
+ before_filter :find_multiple, :only => %i(select_multiple_hosts update_multiple_hosts disassociate_multiple_hosts remove_policy_from_multiple_hosts)
7
7
  before_filter :find_tailoring_file, :only => [:tailoring_file_selected]
8
8
 
9
9
  def model_of_controller
@@ -11,9 +11,9 @@ class PoliciesController < ApplicationController
11
11
  end
12
12
 
13
13
  def index
14
- @policies = resource_base.search_for(params[:search], :order => params[:order]).
15
- paginate(:page => params[:page], :per_page => params[:per_page]).
16
- includes(:scap_content, :scap_content_profile, :tailoring_file)
14
+ @policies = resource_base.search_for(params[:search], :order => params[:order])
15
+ .paginate(:page => params[:page], :per_page => params[:per_page])
16
+ .includes(:scap_content, :scap_content_profile, :tailoring_file)
17
17
  if @policies.empty? && ForemanOpenscap::ScapContent.unconfigured?
18
18
  redirect_to scap_contents_path
19
19
  end
@@ -34,13 +34,11 @@ class PoliciesController < ApplicationController
34
34
  @policy = ::ForemanOpenscap::Policy.new(policy_params)
35
35
  if @policy.wizard_completed? && @policy.save
36
36
  process_success :success_redirect => policies_path
37
+ elsif @policy.valid?
38
+ render 'new' and return
37
39
  else
38
- if @policy.valid?
39
- render 'new' and return
40
- else
41
- @policy.rewind_step
42
- process_error :object => @policy
43
- end
40
+ @policy.rewind_step
41
+ process_error :object => @policy
44
42
  end
45
43
  end
46
44
 
@@ -75,13 +73,14 @@ class PoliciesController < ApplicationController
75
73
  render :partial => 'tailoring_file_selected', :locals => { :policy => @policy, :tailoring_file => @tailoring_file }
76
74
  end
77
75
 
78
- def select_multiple_hosts; end
76
+ def select_multiple_hosts
77
+ end
79
78
 
80
79
  def update_multiple_hosts
81
80
  if (id = params['policy']['id'])
82
81
  policy = ::ForemanOpenscap::Policy.find(id)
83
82
  policy.assign_hosts(@hosts)
84
- notice _("Updated hosts: Assigned with compliance policy: %s") % policy.name
83
+ notice _("Updated hosts: Assigned with compliance policy: %s") % policy.name
85
84
  # We prefer to go back as this does not lose the current search
86
85
  redirect_to hosts_path
87
86
  else
@@ -90,18 +89,18 @@ class PoliciesController < ApplicationController
90
89
  end
91
90
  end
92
91
 
93
- def disassociate_multiple_hosts; end
92
+ def disassociate_multiple_hosts
93
+ end
94
94
 
95
95
  def remove_policy_from_multiple_hosts
96
96
  if (id = params.fetch(:policy, {})[:id])
97
97
  policy = ::ForemanOpenscap::Policy.find(id)
98
98
  policy.unassign_hosts(@hosts)
99
99
  notice _("Updated hosts: Unassigned from compliance policy '%s'") % policy.name
100
- redirect_to hosts_path
101
100
  else
102
101
  error _('No valid policy ID provided')
103
- redirect_to hosts_path
104
102
  end
103
+ redirect_to hosts_path
105
104
  end
106
105
 
107
106
  private
@@ -127,7 +126,7 @@ class PoliciesController < ApplicationController
127
126
  end
128
127
  return @hosts
129
128
  rescue => e
130
- error _("Something went wrong while selecting hosts - %s") % (e)
129
+ error _("Something went wrong while selecting hosts - %s") % e
131
130
  logger.debug e.message
132
131
  logger.debug e.backtrace.join("\n")
133
132
  redirect_to hosts_path and return false
@@ -1,7 +1,8 @@
1
1
  class PolicyDashboardController < ApplicationController
2
2
  before_filter :prefetch_data, :only => :index
3
3
 
4
- def index; end
4
+ def index
5
+ end
5
6
 
6
7
  def prefetch_data
7
8
  @policy = ::ForemanOpenscap::Policy.find(params[:id])
@@ -2,8 +2,8 @@ class ScapContentsController < ApplicationController
2
2
  include Foreman::Controller::AutoCompleteSearch
3
3
  include Foreman::Controller::Parameters::ScapContent
4
4
 
5
- before_filter :handle_file_upload, :only => [:create, :update]
6
- before_filter :find_by_id, :only => [:show, :edit, :update, :destroy]
5
+ before_filter :handle_file_upload, :only => %i(create update)
6
+ before_filter :find_by_id, :only => %i(show edit update destroy)
7
7
 
8
8
  def model_of_controller
9
9
  ::ForemanOpenscap::ScapContent
@@ -2,16 +2,16 @@ class TailoringFilesController < ApplicationController
2
2
  include Foreman::Controller::AutoCompleteSearch
3
3
  include Foreman::Controller::Parameters::TailoringFile
4
4
 
5
- before_filter :find_tailoring_file, :only => [:destroy, :update, :edit, :xml]
6
- before_filter :handle_file_upload, :only => [:create, :update]
5
+ before_filter :find_tailoring_file, :only => %i(destroy update edit xml)
6
+ before_filter :handle_file_upload, :only => %i(create update)
7
7
 
8
8
  def model_of_controller
9
9
  ::ForemanOpenscap::TailoringFile
10
10
  end
11
11
 
12
12
  def index
13
- @tailoring_files = resource_base.search_for(params[:search], :order => params[:order]).
14
- paginate(:page => params[:page], :per_page => params[:per_page])
13
+ @tailoring_files = resource_base.search_for(params[:search], :order => params[:order])
14
+ .paginate(:page => params[:page], :per_page => params[:per_page])
15
15
  end
16
16
 
17
17
  def new
@@ -3,14 +3,13 @@ module ArfReportDashboardHelper
3
3
  :passed => '#89A54E',
4
4
  :failed => '#AA4643',
5
5
  :othered => '#DB843D',
6
- }
6
+ }.freeze
7
7
 
8
8
  def reports_breakdown_chart(report, options = {})
9
9
  data = []
10
10
  [[:failed, _('Failed')],
11
11
  [:passed, _('Passed')],
12
- [:othered, _('Othered')],
13
- ].each do |i|
12
+ [:othered, _('Othered')],].each do |i|
14
13
  data << {:label => i[1], :data => report[i[0]], :color => COLORS[i[0]]}
15
14
  end
16
15
  flot_pie_chart 'overview', _('Compliance reports breakdown'), data, options
@@ -5,7 +5,7 @@ module ArfReportsHelper
5
5
  end
6
6
 
7
7
  def show_logs
8
- return unless @arf_report.logs.size > 0
8
+ return if @arf_report.logs.empty?
9
9
  form_tag arf_report_path(@arf_report), :id => 'level_filter', :method => :get, :class => "form form-horizontal" do
10
10
  content_tag(:span, _("Show log messages:") + ' ') +
11
11
  select(nil, 'level', [[_('All messages'), 'info'],[_('Failed and Othered'), 'warning'],[_('Failed only'), 'error']],
@@ -4,8 +4,7 @@ module ComplianceHostsHelper
4
4
  data = []
5
5
  [[:passed, _('Passed')],
6
6
  [:failed, _('Failed')],
7
- [:othered, _('Other')],
8
- ].each do |i|
7
+ [:othered, _('Other')],].each do |i|
9
8
  data << {:label => i[1], :data => report[i[0]], :color => ArfReportDashboardHelper::COLORS[i[0]]}
10
9
  end
11
10
  flot_pie_chart 'overview', _('Compliance reports breakdown'), data, options
@@ -1,7 +1,7 @@
1
1
  module PoliciesHelper
2
2
  def profiles_selection
3
- return @scap_content.scap_content_profiles unless @scap_content.blank?
4
- return @policy.scap_content.scap_content_profiles unless @policy.scap_content.blank?
3
+ return @scap_content.scap_content_profiles if @scap_content.present?
4
+ return @policy.scap_content.scap_content_profiles if @policy.scap_content.present?
5
5
  return []
6
6
  end
7
7
 
@@ -72,7 +72,7 @@ module PoliciesHelper
72
72
  content_tag(:div, :class => "form-actions") do
73
73
  text = overwrite ? overwrite : _("Submit")
74
74
  options = {:class => "btn btn-primary"}
75
- options.merge! :'data-id' => form_to_submit_id(form) unless options.key?(:'data-id')
75
+ options[:'data-id'] = form_to_submit_id(form) unless options.key?(:'data-id')
76
76
  previous = form.object.first_step? ? ' ' : previous_link(form)
77
77
  cancel_and_submit = content_tag(:div, :class => "pull-right") do
78
78
  link_to(_("Cancel"), args[:cancel_path], :class => "btn btn-default") + ' ' +
@@ -90,7 +90,7 @@ module PoliciesHelper
90
90
  def previous_link(form)
91
91
  previous = content_tag(:span, :class => 'glyphicon glyphicon-chevron-left') {}
92
92
  content_tag(:div, :class => 'pull-left') do
93
- link_to((previous).html_safe, '#', :class => 'btn btn-default', :onclick => "previous_step('#{@policy.previous_step}')")
93
+ link_to(previous.html_safe, '#', :class => 'btn btn-default', :onclick => "previous_step('#{@policy.previous_step}')")
94
94
  end
95
95
  end
96
96
 
@@ -4,15 +4,14 @@ module PolicyDashboardHelper
4
4
  :incompliant_hosts => ArfReportDashboardHelper::COLORS[:failed],
5
5
  :inconclusive_hosts => ArfReportDashboardHelper::COLORS[:othered],
6
6
  :report_missing => '#92A8CD',
7
- }
7
+ }.freeze
8
8
 
9
9
  def host_breakdown_chart(report, options = {})
10
10
  data = []
11
11
  [[:compliant_hosts, _('Compliant hosts')],
12
12
  [:incompliant_hosts, _('Incompliant hosts')],
13
13
  [:inconclusive_hosts, _('Inconclusive')],
14
- [:report_missing, _('Not audited')],
15
- ].each do |i|
14
+ [:report_missing, _('Not audited')],].each do |i|
16
15
  data << {:label => i[1], :data => report[i[0]], :color => COLORS[i[0]]}
17
16
  end
18
17
  flot_pie_chart 'overview', _('Compliance Status'), data, options
@@ -9,7 +9,7 @@ module ::ProxyAPI
9
9
  Net::HTTPHeaderSyntaxError,
10
10
  Net::ProtocolError,
11
11
  Timeout::Error
12
- ]
12
+ ].freeze
13
13
 
14
14
  def initialize(args)
15
15
  @args = args
@@ -17,7 +17,7 @@ module ::ProxyAPI
17
17
 
18
18
  def available?
19
19
  begin
20
- return true if (has_scap_feature? && minimum_version)
20
+ return true if has_scap_feature? && minimum_version
21
21
  rescue *HTTP_ERRORS
22
22
  return false
23
23
  end
@@ -3,7 +3,7 @@ module ::ProxyAPI
3
3
  def initialize(args)
4
4
  @url = args[:url] + '/compliance/'
5
5
  super args
6
- @connect_params[:headers].merge!(:content_type => :xml)
6
+ @connect_params[:headers][:content_type] = :xml
7
7
  @connect_params[:timeout] = timeout
8
8
  end
9
9
 
@@ -32,7 +32,7 @@ module ForemanOpenscap
32
32
  @changed_hosts = []
33
33
  hash.each do |key, values|
34
34
  values.each do |host|
35
- @changed_hosts << host if host.scap_status_changed?(::ForemanOpenscap::Policy.find key)
35
+ @changed_hosts << host if host.scap_status_changed?(::ForemanOpenscap::Policy.find(key))
36
36
  end
37
37
  end
38
38
  @changed_hosts.uniq
@@ -4,7 +4,8 @@ module ForemanOpenscap
4
4
 
5
5
  module ClassMethods
6
6
  def compliance_status_scoped_search(status, options = {})
7
- options.merge!(:offset => ArfReport::METRIC.index(status.to_s), :word_size => ArfReport::BIT_NUM)
7
+ options[:offset] = ArfReport::METRIC.index(status.to_s)
8
+ options[:word_size] = ArfReport::BIT_NUM
8
9
  scoped_search options
9
10
  end
10
11
 
@@ -12,9 +13,8 @@ module ForemanOpenscap
12
13
  cond = sanitize_policy_name(policy_name)
13
14
  { :conditions => ArfReport.arel_table[:id].in(
14
15
  PolicyArfReport.select(PolicyArfReport.arel_table[:arf_report_id])
15
- .of_policy(Policy.find_by_name(cond).id).ast
16
- ).to_sql
17
- }
16
+ .of_policy(Policy.find_by(name: cond).id).ast
17
+ ).to_sql}
18
18
  end
19
19
 
20
20
  def search_by_comply_with(_key, _operator, policy_name)
@@ -33,9 +33,8 @@ module ForemanOpenscap
33
33
  cond = sanitize_policy_name(policy_name)
34
34
  { :conditions => ArfReport.arel_table[:id].in(
35
35
  ArfReport.select(ArfReport.arel_table[:id])
36
- .latest_of_policy(Policy.find_by_name cond).instance_eval(&selection).ast
37
- ).to_sql
38
- }
36
+ .latest_of_policy(Policy.find_by(name: cond)).instance_eval(&selection).ast
37
+ ).to_sql}
39
38
  end
40
39
 
41
40
  def search_by_last_for(key, operator, by)
@@ -56,7 +55,7 @@ module ForemanOpenscap
56
55
  ) latest
57
56
  ON foreman_openscap_policies.id = latest.policy_id)' }
58
57
  else
59
- fail "Cannot search last by #{by}"
58
+ raise "Cannot search last by #{by}"
60
59
  end
61
60
  end
62
61
 
@@ -23,27 +23,23 @@ module ForemanOpenscap
23
23
  after_update :puppetrun!, :if => ->(host) { Setting[:puppetrun] && host.changed.include?('openscap_proxy_id') }
24
24
 
25
25
  scope :comply_with, lambda { |policy|
26
- joins(:arf_reports).merge(ArfReport.latest_of_policy policy).merge(ArfReport.passed)
26
+ joins(:arf_reports).merge(ArfReport.latest_of_policy(policy)).merge(ArfReport.passed)
27
27
  }
28
28
 
29
29
  scope :incomply_with, lambda { |policy|
30
- joins(:arf_reports).merge(ArfReport.latest_of_policy policy).merge(ArfReport.failed)
30
+ joins(:arf_reports).merge(ArfReport.latest_of_policy(policy)).merge(ArfReport.failed)
31
31
  }
32
32
 
33
33
  scope :inconclusive_with, lambda { |policy|
34
- joins(:arf_reports).merge(ArfReport.latest_of_policy policy).merge(ArfReport.othered)
34
+ joins(:arf_reports).merge(ArfReport.latest_of_policy(policy)).merge(ArfReport.othered)
35
35
  }
36
36
 
37
37
  scope :policy_reports_missing, lambda { |policy|
38
- where("id NOT IN (SELECT host_id
39
- FROM reports INNER JOIN foreman_openscap_policy_arf_reports
40
- ON reports.id = foreman_openscap_policy_arf_reports.arf_report_id
41
- WHERE policy_id = #{policy.id})
42
- AND id IN (SELECT assetable_id
43
- FROM foreman_openscap_asset_policies INNER JOIN foreman_openscap_assets
44
- ON foreman_openscap_asset_policies.asset_id = foreman_openscap_assets.id
45
- WHERE foreman_openscap_assets.assetable_type = 'Host::Base'
46
- AND foreman_openscap_asset_policies.policy_id = '#{policy.id}')")
38
+ search_for("compliance_report_missing_for = \"#{policy.name}\"")
39
+ }
40
+
41
+ scope :assigned_to_policy, lambda { |policy|
42
+ search_for("compliance_policy = \"#{policy.name}\"")
47
43
  }
48
44
 
49
45
  alias_method_chain :inherited_attributes, :openscap
@@ -86,10 +82,10 @@ module ForemanOpenscap
86
82
  def reports_for_policy(policy, limit = nil)
87
83
  if limit
88
84
  ForemanOpenscap::ArfReport.joins(:policy_arf_report)
89
- .merge(ForemanOpenscap::PolicyArfReport.of_policy policy.id).where(:host_id => id).limit limit
85
+ .merge(ForemanOpenscap::PolicyArfReport.of_policy(policy.id)).where(:host_id => id).limit limit
90
86
  else
91
87
  ForemanOpenscap::ArfReport.joins(:policy_arf_report)
92
- .merge(ForemanOpenscap::PolicyArfReport.of_policy policy.id).where(:host_id => id)
88
+ .merge(ForemanOpenscap::PolicyArfReport.of_policy(policy.id)).where(:host_id => id)
93
89
  end
94
90
  end
95
91
 
@@ -104,21 +100,44 @@ module ForemanOpenscap
104
100
  module ClassMethods
105
101
  def search_by_policy_name(key, operator, policy_name)
106
102
  cond = sanitize_sql_for_conditions(["foreman_openscap_policies.name #{operator} ?", value_to_sql(operator, policy_name)])
107
- { :conditions => Host::Managed.arel_table[:id].in(Host::Managed.select(Host::Managed.arel_table[:id]).joins(:policies).where(cond).pluck(:id)).to_sql }
103
+
104
+ host_group_host_ids = policy_assigned_using_hostgroup_host_ids cond, []
105
+ host_group_cond = if host_group_host_ids.any?
106
+ ' OR ' + sanitize_sql_for_conditions("hosts.id IN (#{host_group_host_ids.join(',')})")
107
+ else
108
+ ''
109
+ end
110
+ { :conditions => Host::Managed.arel_table[:id].in(Host::Managed.select(Host::Managed.arel_table[:id]).joins(:policies).where(cond).pluck(:id)).to_sql + host_group_cond }
108
111
  end
109
112
 
110
113
  def search_by_missing_arf(key, operator, policy_name)
111
114
  cond = sanitize_sql_for_conditions(["foreman_openscap_policies.name #{operator} ?", value_to_sql(operator, policy_name)])
112
- { :conditions => Host::Managed.arel_table[:id].in(Host::Managed.select(Host::Managed.arel_table[:id]).
113
- joins(:policies).
114
- where(cond).
115
- where("foreman_openscap_assets.id NOT IN (
116
- SELECT DISTINCT foreman_openscap_arf_reports.asset_id
117
- FROM foreman_openscap_arf_reports
118
- WHERE foreman_openscap_arf_reports.asset_id = foreman_openscap_assets.id
119
- AND foreman_openscap_arf_reports.policy_id = foreman_openscap_policies.id)").
120
- pluck(:id)).to_sql
121
- }
115
+
116
+ host_ids_from_arf_of_policy = ForemanOpenscap::ArfReport.joins(:policy).where(cond).pluck(:host_id).uniq
117
+
118
+ direct_result = policy_assigned_directly_host_ids cond, host_ids_from_arf_of_policy
119
+
120
+ hg_result = policy_assigned_using_hostgroup_host_ids cond, host_ids_from_arf_of_policy
121
+
122
+ result = (direct_result + hg_result).uniq
123
+ { :conditions => "hosts.id IN (#{result.empty? ? 'NULL' : result.join(',')})" }
124
+ end
125
+
126
+ def policy_assigned_directly_host_ids(condition, host_ids_from_arf)
127
+ ForemanOpenscap::Asset.where(:assetable_type => 'Host::Base')
128
+ .joins(:policies)
129
+ .where(condition)
130
+ .where.not(:assetable_id => host_ids_from_arf)
131
+ .pluck(:assetable_id)
132
+ end
133
+
134
+ def policy_assigned_using_hostgroup_host_ids(condition, host_ids_from_arf)
135
+ hostgroup_with_policy_ids = ForemanOpenscap::Asset.where(:assetable_type => 'Hostgroup')
136
+ .joins(:policies)
137
+ .where(condition)
138
+ .pluck(:assetable_id)
139
+ subtree_ids = Hostgroup.where(:id => hostgroup_with_policy_ids).flat_map(&:subtree_ids).uniq
140
+ Host.where(:hostgroup_id => subtree_ids).where.not(:id => host_ids_from_arf).pluck(:id)
122
141
  end
123
142
  end
124
143
  end
@@ -2,7 +2,7 @@ module ForemanOpenscap
2
2
  module LogExtensions
3
3
  extend ActiveSupport::Concern
4
4
  included do
5
- SCAP_RESULT = %w(pass fail error unknown notapplicable notchecked notselected informational fixed)
5
+ SCAP_RESULT = %w(pass fail error unknown notapplicable notchecked notselected informational fixed).freeze
6
6
  validate :scap_result
7
7
  end
8
8
 
@@ -13,7 +13,7 @@ module ForemanOpenscap
13
13
  end
14
14
 
15
15
  def update_scap_client_params
16
- model_match = self.class.name.underscore.match(/\Ahostgroup\z/) ? "hostgroup" : "fqdn"
16
+ model_match = self.class.name.underscore =~ /\Ahostgroup\z/ ? "hostgroup" : "fqdn"
17
17
  scap_params = find_scap_client.class_params
18
18
  server_lookup_key = scap_params.find { |param| param.key == "server" }
19
19
  port_lookup_key = scap_params.find { |param| param.key == "port" }
@@ -34,7 +34,7 @@ module ForemanOpenscap
34
34
 
35
35
  def scap_client_lookup_values_for(lookup_keys, model_match)
36
36
  lookup_keys.inject({}) do |result, key|
37
- result[key] = key.lookup_values.find { |value| value.match == "#{lookup_matcher(model_match)}" }
37
+ result[key] = key.lookup_values.find { |value| value.match == lookup_matcher(model_match).to_s }
38
38
  result
39
39
  end
40
40
  end
@@ -55,7 +55,7 @@ module ForemanOpenscap
55
55
  end
56
56
 
57
57
  def find_scap_client
58
- Puppetclass.find_by_name("foreman_scap_client")
58
+ Puppetclass.find_by(name: "foreman_scap_client")
59
59
  end
60
60
 
61
61
  def lookup_matcher(model_match)