foreman_openscap 0.2.1 → 0.3.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.
- checksums.yaml +4 -4
- data/README.md +20 -6
- data/app/assets/javascript/foreman_openscap/period_selector.js +3 -0
- data/app/assets/javascript/foreman_openscap/policy_edit.js +37 -0
- data/app/assets/stylesheets/foreman_openscap/policy.css.scss +7 -0
- data/app/controllers/api/v2/{openscap → compliance}/arf_reports_controller.rb +6 -5
- data/app/controllers/scaptimony_arf_reports_controller.rb +9 -6
- data/app/controllers/scaptimony_policies_controller.rb +72 -11
- data/app/{models/scaptimony/asset.rb → controllers/scaptimony_policy_dashboard_controller.rb} +8 -9
- data/app/controllers/scaptimony_scap_contents_controller.rb +25 -16
- data/app/helpers/concerns/foreman_openscap/hosts_helper_extensions.rb +3 -4
- data/app/helpers/scaptimony_policies_helper.rb +22 -0
- data/app/helpers/scaptimony_policy_dashboard_helper.rb +43 -0
- data/app/helpers/scaptimony_report_dashboard_helper.rb +20 -0
- data/app/models/concerns/foreman_openscap/arf_report_extensions.rb +30 -1
- data/app/models/concerns/foreman_openscap/asset_extensions.rb +34 -0
- data/app/models/concerns/foreman_openscap/host_extensions.rb +38 -7
- data/app/models/concerns/foreman_openscap/policy_extensions.rb +214 -3
- data/app/models/concerns/foreman_openscap/scap_content_extensions.rb +21 -1
- data/app/overrides/hosts/index/host_arf_report.rb +5 -0
- data/app/services/scaptimony/policy_dashboard/data.rb +30 -0
- data/app/services/scaptimony/policy_dashboard/loader.rb +20 -0
- data/app/services/scaptimony/policy_dashboard/manager.rb +32 -0
- data/app/services/scaptimony/report_dashboard/data.rb +37 -0
- data/app/views/dashboard/_foreman_openscap_host_reports_widget.html.erb +24 -0
- data/app/views/dashboard/_foreman_openscap_reports_breakdown_widget.html.erb +3 -0
- data/app/views/scaptimony_arf_reports/_host_report.html.erb +8 -0
- data/app/views/scaptimony_arf_reports/_list.html.erb +2 -2
- data/app/views/scaptimony_arf_reports/show.html.erb +3 -0
- data/app/views/scaptimony_policies/_form.html.erb +23 -4
- data/app/views/scaptimony_policies/_list.html.erb +2 -4
- data/app/views/scaptimony_policies/create.html.erb +2 -0
- data/app/views/scaptimony_policies/edit.html.erb +1 -2
- data/app/views/scaptimony_policies/index.html.erb +1 -1
- data/app/views/scaptimony_policies/new.html.erb +1 -2
- data/app/views/scaptimony_policies/select_multiple_hosts.html.erb +8 -0
- data/app/views/scaptimony_policies/show.html.erb +3 -0
- data/app/views/scaptimony_policies/steps/_create_policy_form.html.erb +5 -0
- data/app/views/scaptimony_policies/steps/_hostgroups_form.html.erb +7 -0
- data/app/views/scaptimony_policies/steps/_locations_form.html.erb +13 -0
- data/app/views/scaptimony_policies/steps/_organizations_form.html.erb +13 -0
- data/app/views/scaptimony_policies/steps/_scap_content_form.html.erb +21 -0
- data/app/views/scaptimony_policies/steps/_schedule_form.html.erb +11 -0
- data/app/views/scaptimony_policies/steps/_step_form.html.erb +11 -0
- data/app/views/scaptimony_policy_dashboard/_policy_chart_widget.html.erb +4 -0
- data/app/views/scaptimony_policy_dashboard/_policy_reports.html.erb +24 -0
- data/app/views/scaptimony_policy_dashboard/_policy_status_widget.html.erb +12 -0
- data/app/views/scaptimony_policy_dashboard/index.html.erb +26 -0
- data/app/views/scaptimony_scap_contents/_form.html.erb +8 -0
- data/app/views/scaptimony_scap_contents/_list.html.erb +8 -6
- data/config/routes.rb +24 -6
- data/db/seeds.d/openscap_feature.rb +2 -0
- data/lib/foreman_openscap/engine.rb +18 -12
- data/lib/foreman_openscap/helper.rb +1 -7
- data/lib/foreman_openscap/version.rb +1 -1
- metadata +57 -31
- data/app/assets/javascript/policy_edit.js +0 -14
- data/app/overrides/dashboard/index/sample_override.html.erb.deface +0 -4
- data/db/migrate/20141017172055_create_scaptimony_auditable_hosts.rb +0 -9
@@ -0,0 +1,30 @@
|
|
1
|
+
module Scaptimony::PolicyDashboard
|
2
|
+
class Data
|
3
|
+
attr_reader :report
|
4
|
+
|
5
|
+
def initialize(policy, filter = "")
|
6
|
+
@policy = policy
|
7
|
+
@filter = filter
|
8
|
+
@report = {}
|
9
|
+
fetch_data
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
attr_writer :report
|
14
|
+
|
15
|
+
def hosts
|
16
|
+
@hosts ||= Host.authorized(:view_hosts, Host)
|
17
|
+
end
|
18
|
+
|
19
|
+
def fetch_data
|
20
|
+
report.update(
|
21
|
+
{:compliant_hosts => @policy.assets.hosts.comply_with(@policy).count,
|
22
|
+
:incompliant_hosts => @policy.assets.hosts.incomply_with(@policy).count,
|
23
|
+
:inconclusive_hosts => @policy.assets.hosts.inconclusive_with(@policy).count,
|
24
|
+
:report_missing => @policy.assets.hosts.policy_reports_missing(@policy).count,
|
25
|
+
:assigned_hosts => @policy.assets.hosts.count,
|
26
|
+
:unassigned_hosts => hosts.count - @policy.assets.hosts.count
|
27
|
+
})
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2014 Red Hat Inc.
|
3
|
+
#
|
4
|
+
# This software is licensed to you under the GNU General Public License,
|
5
|
+
# version 3 (GPLv3). There is NO WARRANTY for this software, express or
|
6
|
+
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
|
7
|
+
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv3
|
8
|
+
# along with this software; if not, see http://www.gnu.org/licenses/gpl.txt
|
9
|
+
#
|
10
|
+
|
11
|
+
module Scaptimony::PolicyDashboard
|
12
|
+
class Loader
|
13
|
+
def self.load
|
14
|
+
Scaptimony::PolicyDashboard::Manager.map do |dashboard|
|
15
|
+
dashboard.widget 'policy_status_widget', :row=>1,:col=>1,:sizex=>8,:sizey=>1,:name=> N_('Status table')
|
16
|
+
dashboard.widget 'policy_chart_widget', :row=>1,:col=>9,:sizex=>4,:sizey=>1,:name=> N_('Status chart')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2014 Red Hat Inc.
|
3
|
+
#
|
4
|
+
# This software is licensed to you under the GNU General Public License,
|
5
|
+
# version 3 (GPLv3). There is NO WARRANTY for this software, express or
|
6
|
+
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
|
7
|
+
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv3
|
8
|
+
# along with this software; if not, see http://www.gnu.org/licenses/gpl.txt
|
9
|
+
#
|
10
|
+
|
11
|
+
module Scaptimony::PolicyDashboard
|
12
|
+
module Manager
|
13
|
+
class << self
|
14
|
+
def map
|
15
|
+
@widgets ||= []
|
16
|
+
mapper = Mapper.new(@widgets)
|
17
|
+
if block_given?
|
18
|
+
yield mapper
|
19
|
+
else
|
20
|
+
mapper
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def widgets
|
25
|
+
@widgets ||= Scaptimony::PolicyDashboard::Loader.load
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class Mapper < ::Dashboard::Manager::Mapper
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Scaptimony::ReportDashboard
|
2
|
+
class Data
|
3
|
+
attr_reader :report
|
4
|
+
|
5
|
+
def initialize(filter = "")
|
6
|
+
@filter = filter
|
7
|
+
@report = {}
|
8
|
+
fetch_data
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
attr_writer :report
|
13
|
+
attr_accessor :filter
|
14
|
+
|
15
|
+
def fetch_data
|
16
|
+
report.update(
|
17
|
+
{
|
18
|
+
:passed => passed_breakdowns,
|
19
|
+
:failed => failed_breakdowns,
|
20
|
+
:othered => othered_breakdowns
|
21
|
+
}
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
def passed_breakdowns
|
26
|
+
(::Scaptimony::ArfReportBreakdown.sum(:passed)).to_f
|
27
|
+
end
|
28
|
+
|
29
|
+
def failed_breakdowns
|
30
|
+
(::Scaptimony::ArfReportBreakdown.sum(:failed)).to_f
|
31
|
+
end
|
32
|
+
|
33
|
+
def othered_breakdowns
|
34
|
+
(::Scaptimony::ArfReportBreakdown.sum(:othered)).to_f
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<h4 class="ca"><%= _('Latest compliance reports') %></h4>
|
2
|
+
<% latest_reports = Scaptimony::ArfReport.latest %>
|
3
|
+
<% if latest_reports.empty? %>
|
4
|
+
<p class="ca"><%= _("No reports available") %></p>
|
5
|
+
<% else %>
|
6
|
+
<table class="table table-striped ellipsis">
|
7
|
+
<tr>
|
8
|
+
<th><%= _('Host') %></th>
|
9
|
+
<th><%= _('Policy') %></th>
|
10
|
+
<%= translated_header(s_('Passed|P'), _('Passed')).html_safe %>
|
11
|
+
<%= translated_header(s_('Failed|F'), _('Failed')).html_safe %>
|
12
|
+
<%= translated_header(s_('Othered|O'), _('Othered')).html_safe %>
|
13
|
+
</tr>
|
14
|
+
<% latest_reports.each do |report| %>
|
15
|
+
<tr>
|
16
|
+
<td><%= link_to h(report.host.name), scaptimony_arf_report_path(report) %></td>
|
17
|
+
<td><%= link_to h(report.policy.name), scaptimony_policy_dashboard_scaptimony_policy_path(report.policy) %></td>
|
18
|
+
<td><%= report_event_column(report.passed, "label-success") %></td>
|
19
|
+
<td><%= report_event_column(report.failed, "label-danger") %></td>
|
20
|
+
<td><%= report_event_column(report.othered, "label-info") %></td>
|
21
|
+
</tr>
|
22
|
+
<% end %>
|
23
|
+
</table>
|
24
|
+
<% end %>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<% if host.arf_reports.any? %>
|
2
|
+
<% if host.arf_reports.search_for('failed > 0').blank? %>
|
3
|
+
<%= link_to(report_event_column('O', "label-success"), scaptimony_arf_reports_path(:search => "host=#{host.name}")) %>
|
4
|
+
<% else %>
|
5
|
+
<%= link_to(report_event_column('F', "label-danger"), scaptimony_arf_reports_path(:search => "host=#{host.name}")) %>
|
6
|
+
<% end %>
|
7
|
+
<% end %>
|
8
|
+
<%= render_original %>
|
@@ -9,8 +9,8 @@
|
|
9
9
|
</tr>
|
10
10
|
<% for arf_report in @arf_reports %>
|
11
11
|
<tr>
|
12
|
-
<td><%= name_column(arf_report.
|
13
|
-
<td><%= _("%s ago") % time_ago_in_words(arf_report.date
|
12
|
+
<td><%= name_column(arf_report.host) %></td>
|
13
|
+
<td><%= _("%s ago") % time_ago_in_words(arf_report.date) %></td>
|
14
14
|
<td><%= report_arf_column(arf_report.passed, "label-info") %></th>
|
15
15
|
<td><%= report_arf_column(arf_report.failed, "label-danger") %></th>
|
16
16
|
<td><%= report_arf_column(arf_report.othered, "label-warning") %></th>
|
@@ -1,4 +1,5 @@
|
|
1
|
-
<%= javascript 'policy_edit' %>
|
1
|
+
<%= javascript 'foreman_openscap/policy_edit' %>
|
2
|
+
<%= javascript 'foreman_openscap/period_selector' %>
|
2
3
|
<%= form_for @policy,
|
3
4
|
:url => (@policy.id? ? scaptimony_policy_path(:id => @policy.id) : scaptimony_policies_path) do |f| %>
|
4
5
|
<%= base_errors_for @policy %>
|
@@ -7,11 +8,18 @@
|
|
7
8
|
<li class="active"><a href="#primary" data-toggle="tab"><%= _("General") %></a></li>
|
8
9
|
<li><a href="#scap_content" data-toggle="tab"><%= _("SCAP Content") %></a></li>
|
9
10
|
<li><a href="#scap_schedule" data-toggle="tab"><%= _("Schedule") %></a></li>
|
11
|
+
<% if show_location_tab? %>
|
12
|
+
<li><a href='#locations' data-toggle='tab'><%= _('Locations') %></a></li>
|
13
|
+
<% end %>
|
14
|
+
<% if show_organization_tab? %>
|
15
|
+
<li><a href='#organizations' data-toggle='tab'><%= _('Organizations') %></a></li>
|
16
|
+
<% end %>
|
17
|
+
<li><a href='#hostgroups' data-toggle='tab'><%= _('Hostgroups') %></a></li>
|
10
18
|
</ul>
|
11
19
|
<div class="tab-content">
|
12
20
|
<div class="tab-pane active" id="primary">
|
13
21
|
<%= text_f(f, :name) %>
|
14
|
-
<%=
|
22
|
+
<%= textarea_f(f, :description, :rows => :auto ) %>
|
15
23
|
</div>
|
16
24
|
<div class="tab-pane" id="scap_content">
|
17
25
|
<%= select_f f, :scap_content_id, Scaptimony::ScapContent.all, :id, :title,
|
@@ -31,8 +39,19 @@
|
|
31
39
|
</span>
|
32
40
|
</div>
|
33
41
|
<div class="tab-pane" id="scap_schedule">
|
34
|
-
<%=
|
35
|
-
|
42
|
+
<%= select_f(f, :period, %w[Weekly Monthly Custom], :downcase, :to_s,
|
43
|
+
{ :include_blank => _('Choose period') },
|
44
|
+
{ :onchange => 'period_selected(this)' }) %>
|
45
|
+
<%= select_f(f, :weekday, Date::DAYNAMES, :downcase, :to_s, :include_blank => _('Choose weekday')) %>
|
46
|
+
<%= text_f(f, :day_of_month, :help_inline => _('Number of a day in month, note that not all months have same count of days')) %>
|
47
|
+
<%= text_f(f, :cron_line, :help_inline => _('You can specify custom cron line, e.g. "0 3 * * *", separate each of 5 values by space')) %>
|
48
|
+
</div>
|
49
|
+
|
50
|
+
<%= render 'taxonomies/loc_org_tabs', :f => f, :obj => @policy %>
|
51
|
+
<div class="tab-pane" id="hostgroups">
|
52
|
+
<%= multiple_selects f, :hostgroups, Hostgroup,
|
53
|
+
@policy.hostgroup_ids,
|
54
|
+
{:disabled => @policy.used_hostgroup_ids } %>
|
36
55
|
</div>
|
37
56
|
<%= submit_or_cancel f %>
|
38
57
|
</div>
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<table class="table table-bordered table-striped
|
1
|
+
<table class="table table-bordered table-striped">
|
2
2
|
<tr>
|
3
3
|
<th>Name</th>
|
4
4
|
<th>Content</th>
|
@@ -8,9 +8,7 @@
|
|
8
8
|
<% for policy in @policies %>
|
9
9
|
<tr>
|
10
10
|
<td>
|
11
|
-
<%=
|
12
|
-
hash_for_edit_scaptimony_policy_path(:id => policy).merge(
|
13
|
-
:auth_object => policy, :authorizer => authorizer) %>
|
11
|
+
<%= link_to policy.name, scaptimony_policy_dashboard_scaptimony_policy_path(:id => policy.id) %>
|
14
12
|
</td>
|
15
13
|
<td>
|
16
14
|
<% if !policy.scap_content.nil? %>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<%= render 'hosts/selected_hosts', :hosts => @hosts %>
|
2
|
+
|
3
|
+
<%= form_for :policy,
|
4
|
+
:url => update_multiple_hosts_scaptimony_policies_path(:host_ids => params[:host_ids]) do |f| %>
|
5
|
+
<%= selectable_f f, :id, [[_("Select Compliance Policy"), "disabled"],
|
6
|
+
] + Scaptimony::Policy.all.map{|e| [e.name, e.id]},{},
|
7
|
+
:onchange => "toggle_multiple_ok_button(this)" %>
|
8
|
+
<% end %>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<div class="tab-pane <%= show_partial_wizard(step) %>" id="hostgroups">
|
2
|
+
<%= wizard_header @policy.step_index, *@policy.steps %>
|
3
|
+
<% select_options ||= {} %>
|
4
|
+
<%= multiple_selects f, :hostgroups, Hostgroup,
|
5
|
+
@policy.hostgroup_ids,
|
6
|
+
{:disabled => @policy.used_hostgroup_ids }.merge!(select_options) %>
|
7
|
+
</div>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<% select_options ||= {} %>
|
2
|
+
<% html_options ||= {} %>
|
3
|
+
<% html_options[:location] ||= {} %>
|
4
|
+
<% obj = @policy %>
|
5
|
+
<% if show_location_tab? %>
|
6
|
+
<div class="tab-pane <%= show_partial_wizard(step) %>" id="locations">
|
7
|
+
<%= wizard_header @policy.step_index, *@policy.steps %>
|
8
|
+
<%= location_selects f, obj.used_or_selected_location_ids,
|
9
|
+
{:disabled => obj.used_location_ids}.merge!(select_options),
|
10
|
+
{:data => {:descendants => obj.children_of_selected_location_ids,
|
11
|
+
:useds => obj.used_location_ids}}.merge!(html_options[:location]) %>
|
12
|
+
</div>
|
13
|
+
<% end %>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<% select_options ||= {} %>
|
2
|
+
<% html_options ||= {} %>
|
3
|
+
<% html_options[:organization] ||= {} %>
|
4
|
+
<% obj = @policy %>
|
5
|
+
<% if show_organization_tab? %>
|
6
|
+
<div class="tab-pane <%= show_partial_wizard(step) %>" id="organizations">
|
7
|
+
<%= wizard_header @policy.step_index, *@policy.steps %>
|
8
|
+
<%= organization_selects f, obj.used_or_selected_organization_ids,
|
9
|
+
{:disabled => obj.used_organization_ids}.merge!(select_options),
|
10
|
+
{:data => {:descendants => obj.children_of_selected_organization_ids,
|
11
|
+
:useds => obj.used_organization_ids}}.merge!(html_options[:organization]) %>
|
12
|
+
</div>
|
13
|
+
<% end %>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<div class="tab-pane <%= show_partial_wizard(step) %>" id="scap_content">
|
2
|
+
<%= wizard_header @policy.step_index, *@policy.steps %>
|
3
|
+
|
4
|
+
<%= select_f f, :scap_content_id, Scaptimony::ScapContent.all, :id, :title,
|
5
|
+
{:include_blank => _("Choose existing SCAP Content")},
|
6
|
+
{:label => _("SCAP Content"),
|
7
|
+
:onchange => 'scap_content_selected(this);',
|
8
|
+
:'data-url' => method_path('scap_content_selected')}
|
9
|
+
%>
|
10
|
+
<span id="scap_content_profile_select">
|
11
|
+
<%= select_f f, :scap_content_profile_id, profiles_selection, :id, :title,
|
12
|
+
{:selected => @policy.scap_content_profile_id,
|
13
|
+
:include_blank => _("Default XCCDF profile")},
|
14
|
+
{:label => _("XCCDF Profile"),
|
15
|
+
:disabled => profiles_selection.empty?,
|
16
|
+
:help_inline => :indicator}
|
17
|
+
%>
|
18
|
+
</span>
|
19
|
+
<p class="alert alert-info"><%= _('Notice: Ensure the selected SCAP content exists on your hosts.') %></p>
|
20
|
+
</div>
|
21
|
+
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<%= javascript 'foreman_openscap/period_selector' %>
|
2
|
+
|
3
|
+
<div class="tab-pane <%= show_partial_wizard(step) %>" id="scap_schedule">
|
4
|
+
<%= wizard_header @policy.step_index, *@policy.steps %>
|
5
|
+
<%= select_f(f, :period, %w[Weekly Monthly Custom], :downcase, :to_s,
|
6
|
+
{ :include_blank => _('Choose period') },
|
7
|
+
{ :onchange => 'period_selected(this)' }) %>
|
8
|
+
<%= select_f(f, :weekday, Date::DAYNAMES, :downcase, :to_s, :include_blank => _('Choose weekday')) %>
|
9
|
+
<%= text_f(f, :day_of_month, :help_inline => _('Number of a day in month, note that not all months have same count of days')) %>
|
10
|
+
<%= text_f(f, :cron_line, :help_inline => _('You can specify custom cron line, e.g. "0 3 * * *", separate each of 5 values by space')) %>
|
11
|
+
</div>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<%= javascript 'foreman_openscap/policy_edit' %>
|
2
|
+
<%= stylesheet 'foreman_openscap/policy' %>
|
3
|
+
<%= form_for @policy,
|
4
|
+
:url => (@policy.id? ? scaptimony_policy_path(:id => @policy.id) : scaptimony_policies_path) do |f| %>
|
5
|
+
<%= base_errors_for @policy %>
|
6
|
+
<%= f.hidden_field(:current_step, :value => @policy.next_step) unless @policy.current_step.blank? %>
|
7
|
+
<% @policy.steps.each do | step | %>
|
8
|
+
<%= render :partial => "scaptimony_policies/steps/#{step.downcase.tr(' ', '_')}_form", :locals => {:f => f, :step => step} %>
|
9
|
+
<% end %>
|
10
|
+
<%= submit_or_cancel_policy(f, (_('Next') unless @policy.last_step?) ) %>
|
11
|
+
<% end %>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<table class="table table-bordered table-striped ellipsis">
|
2
|
+
<tr>
|
3
|
+
<th><%= _('Host') %></th>
|
4
|
+
<th><%= _("Date") %></th>
|
5
|
+
<th><%= _("Passed") %></th>
|
6
|
+
<th><%= _("Failed") %></th>
|
7
|
+
<th><%= _("Other") %></th>
|
8
|
+
<th></th>
|
9
|
+
</tr>
|
10
|
+
<% for arf_report in @policy.arf_reports.latest %>
|
11
|
+
<tr>
|
12
|
+
<td><%= name_column(arf_report.host) %></td>
|
13
|
+
<td><%= _("%s ago") % time_ago_in_words(arf_report.date) %></td>
|
14
|
+
<td><%= report_arf_column(arf_report.passed, "label-info") %></th>
|
15
|
+
<td><%= report_arf_column(arf_report.failed, "label-danger") %></th>
|
16
|
+
<td><%= report_arf_column(arf_report.othered, "label-warning") %></th>
|
17
|
+
<td>
|
18
|
+
<%= action_buttons(
|
19
|
+
link_to(_("View Report"), hash_for_scaptimony_arf_report_path(:id => arf_report.id))
|
20
|
+
) %>
|
21
|
+
</td>
|
22
|
+
</tr>
|
23
|
+
<% end %>
|
24
|
+
</table>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<div id='status-table'>
|
2
|
+
<h4 class="header"><%= _('Hosts Breakdown') %></h4>
|
3
|
+
<ul>
|
4
|
+
<%= status_link _('Compliant with the policy'), :compliant_hosts, scaptimony_arf_reports_path(:search => "comply_with = #{@policy.name}") %>
|
5
|
+
<%= status_link _('Not compliant with the policy'), :incompliant_hosts, scaptimony_arf_reports_path(:search => "not_comply_with = #{@policy.name}") %>
|
6
|
+
<%= status_link _('Inconclusive results'), :inconclusive_hosts, scaptimony_arf_reports_path(:search => " inconclusive_with = #{@policy.name}") %>
|
7
|
+
<%= status_link _('Never audited'), :report_missing, hosts_path(:search => "compliance_report_missing_for = #{@policy.name}") %>
|
8
|
+
<h4 class="total">
|
9
|
+
<%= link_to(_("Total hosts: %s") % @report[:assigned_hosts], hosts_path(:search => "compliance_policy = #{@policy.name}")) %>
|
10
|
+
</h4>
|
11
|
+
</ul>
|
12
|
+
</div>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<%= javascript 'dashboard' %>
|
2
|
+
|
3
|
+
<% title _("Compliance policy: %s") % @policy.name %>
|
4
|
+
|
5
|
+
<div id='dashboard' class="row gridster">
|
6
|
+
<ul>
|
7
|
+
<%= policy_widget_list.map do |widget|
|
8
|
+
content_tag(:li, render(widget.id), :data => {
|
9
|
+
:id => widget.id,
|
10
|
+
:name => widget.name || widget.id,
|
11
|
+
:row => widget.row,
|
12
|
+
:col => widget.col,
|
13
|
+
:sizex => widget.sizex,
|
14
|
+
:sizey => widget.sizey,
|
15
|
+
:hide => widget.hide
|
16
|
+
})
|
17
|
+
end.join(' ').html_safe
|
18
|
+
%>
|
19
|
+
</ul>
|
20
|
+
</div>
|
21
|
+
<% if @policy.arf_reports.any? %>
|
22
|
+
<div class="row gridster">
|
23
|
+
<%= _("Latest reports for policy: %s") % @policy.name %>
|
24
|
+
<%= render :partial => 'policy_reports' %>
|
25
|
+
</div>
|
26
|
+
<% end %>
|