foreman_openscap 0.3.4 → 0.4.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 +80 -12
- data/app/assets/javascript/foreman_openscap/scap_hosts_show.js +4 -0
- data/app/controllers/api/v2/compliance/arf_reports_controller.rb +46 -3
- data/app/controllers/api/v2/compliance/policies_controller.rb +51 -24
- data/app/controllers/api/v2/compliance/scap_contents_controller.rb +74 -0
- data/app/controllers/scaptimony_hosts_controller.rb +5 -0
- data/app/controllers/scaptimony_policies_controller.rb +16 -2
- data/app/helpers/concerns/foreman_openscap/hosts_helper_extensions.rb +32 -1
- data/app/models/concerns/foreman_openscap/arf_report_extensions.rb +1 -0
- data/app/models/concerns/foreman_openscap/host_extensions.rb +1 -1
- data/app/models/concerns/foreman_openscap/policy_extensions.rb +5 -1
- data/app/overrides/hosts/overview/host_compliance_status.rb +4 -0
- data/app/services/scaptimony/host_report_dashboard/data.rb +38 -0
- data/app/views/api/v2/compliance/arf_reports/base.json.rabl +4 -0
- data/app/views/api/v2/compliance/arf_reports/index.json.rabl +2 -0
- data/app/views/api/v2/compliance/arf_reports/main.json.rabl +5 -0
- data/app/views/api/v2/compliance/arf_reports/show.json.rabl +3 -0
- data/app/views/api/v2/compliance/policies/base.json.rabl +3 -0
- data/app/views/api/v2/compliance/policies/index.json.rabl +3 -0
- data/app/views/api/v2/compliance/policies/main.json.rabl +5 -0
- data/app/views/api/v2/compliance/policies/show.json.rabl +3 -0
- data/app/views/api/v2/compliance/scap_contents/base.json.rabl +3 -0
- data/app/views/api/v2/compliance/scap_contents/index.json.rabl +3 -0
- data/app/views/api/v2/compliance/scap_contents/main.json.rabl +5 -0
- data/app/views/api/v2/compliance/scap_contents/show.json.rabl +1 -0
- data/app/views/dashboard/_foreman_openscap_host_reports_widget.html.erb +1 -1
- data/app/views/scaptimony_arf_reports/_list.html.erb +1 -1
- data/app/views/scaptimony_hosts/_host_status.html.erb +17 -0
- data/app/views/scaptimony_hosts/show.html.erb +23 -0
- data/app/views/scaptimony_policies/disassociate_multiple_hosts.html.erb +7 -0
- data/config/routes.rb +6 -2
- data/lib/foreman_openscap/engine.rb +2 -0
- data/lib/foreman_openscap/version.rb +1 -1
- data/test/factories/arf_report_factory.rb +10 -0
- data/test/factories/asset_factory.rb +6 -0
- data/test/factories/policy_factory.rb +1 -2
- data/test/factories/scap_content_related.rb +0 -1
- data/test/files/scap_contents/ssg-fedora-ds.xml +1 -28
- data/test/functional/api/v2/arf_reports_controller_test.rb +24 -0
- data/test/functional/api/v2/policies_controller_test.rb +58 -0
- data/test/functional/api/v2/scap_contents_controller_test.rb +49 -0
- metadata +32 -7
- data/Rakefile +0 -40
- data/test/factories/foreman_openscap_factories.rb +0 -5
- data/test/functional/api/v2/compliance/policies_controller_test.rb +0 -14
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 48ae466c6c227a222397d8a8151177798cf1a035
|
|
4
|
+
data.tar.gz: 6abafa02b5291e3b1aa4c36a682e4ea931ccd646
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d3c84160ddb908cd9f928878bed4f11c14e9691fe827f072795003e1bc97687db1c2ce33826b57a3ef64997c10bd7d4e44aa5b9d505da02bf9b0145e53511e85
|
|
7
|
+
data.tar.gz: e9fcbe1028267dbc7ca0d548e41d4390309e540465609eefe739a3fce064566119d72a8fc498e6174697057be2642520839f1f15227ca1e1ac09fcf7fafc0af5
|
data/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Foreman-OpenSCAP
|
|
2
2
|
|
|
3
|
+
[](https://codeclimate.com/github/OpenSCAP/foreman_openscap)
|
|
4
|
+
|
|
3
5
|
This plug-in enables automated vulnerability assessment and compliance audit
|
|
4
6
|
of Foreman based infrastructure.
|
|
5
7
|
|
|
@@ -20,6 +22,83 @@ of Foreman based infrastructure.
|
|
|
20
22
|
+ Vulnerability Assessment (processing OVAL CVE streams)
|
|
21
23
|
+ E-mail notifications
|
|
22
24
|
|
|
25
|
+
## Usage
|
|
26
|
+
|
|
27
|
+
### Basic Concepts
|
|
28
|
+
|
|
29
|
+
There are three basic concepts (entities) in OpenSCAP plug-in: SCAP Contents, Compliance
|
|
30
|
+
Policies and ARF Reports.
|
|
31
|
+
|
|
32
|
+
*SCAP Content* represents SCAP DataStream XML file as defined by SCAP 1.2 standard. Datastream
|
|
33
|
+
file contains implementation of compliance, configuration or security baselines. Users are
|
|
34
|
+
advised to acquire examplary baseline by installing scap-security-guide package. DataStream
|
|
35
|
+
file usualy contains multiple XCCDF Profiles. Each for different security target. The content
|
|
36
|
+
of Datastream file can be inspected by `oscap` tool from openscap-scanner package.
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
# yum install -y scap-security-guide openscap-scanner
|
|
40
|
+
# oscap info /usr/share/xml/scap/ssg/content/ssg-rhel6-ds.xml
|
|
41
|
+
# oscap info /usr/share/xml/scap/ssg/content/ssg-rhel7-ds.xml
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
*Compliance Policy* is highlevel concept of a baseline applied to the infrastructure. Compliance
|
|
45
|
+
Policy is defined by user on web interface. User may assign following information to the Policy:
|
|
46
|
+
+ SCAP Content
|
|
47
|
+
+ XCCDF Profile from particular SCAP Content
|
|
48
|
+
+ Host Groups that should comply with the policy
|
|
49
|
+
+ Schedule - the period in which the audit shall occur
|
|
50
|
+
|
|
51
|
+
*ARF Report* is XML output of single scan occurance per single host. Asset Reporting File format
|
|
52
|
+
is defined by SCAP 1.2 standard. Foreman plug-in stores the ARF Reports in database for later
|
|
53
|
+
inspections.
|
|
54
|
+
|
|
55
|
+
### User Interface
|
|
56
|
+
|
|
57
|
+
The most of the Foreman-OpenSCAP controls are located in the *Compliance* section under the *Host*
|
|
58
|
+
menu. The section contains three items as described in previous section: SCAP Contents, Compliance
|
|
59
|
+
Policies, ARF Reports.
|
|
60
|
+
|
|
61
|
+
### Prerequisites before the first use
|
|
62
|
+
|
|
63
|
+
Make sure that
|
|
64
|
+
1. smart_proxy_openscap and puppet-foreman_scap_client packages are installed on your proxies
|
|
65
|
+
2. proxies have Foreman uri defined
|
|
66
|
+
```
|
|
67
|
+
# echo ':foreman_url: https://foreman17.local.lan' >> /etc/foreman-proxy/settings.yml
|
|
68
|
+
```
|
|
69
|
+
3. foreman_scap_client puppet class is imported to your Foreman
|
|
70
|
+
1. Go to Configure -> Puppet classes page
|
|
71
|
+
2. Click Import button
|
|
72
|
+
3. Select foreman_scap_client
|
|
73
|
+
|
|
74
|
+
### Setting-up first compliance policy
|
|
75
|
+
|
|
76
|
+
1. Log-in to Web Interface
|
|
77
|
+
2. Create new SCAP Content
|
|
78
|
+
1. Go to *Hosts -> Compliance -> SCAP contents* page
|
|
79
|
+
2. Upload DataSteam file
|
|
80
|
+
3. Create new Policy
|
|
81
|
+
1. Go to Hosts -> Compliance -> Policies page
|
|
82
|
+
2. Assign SCAP Content to Policy
|
|
83
|
+
3. Select Profile from your SCAP Content
|
|
84
|
+
4. Define periodic scan schedule
|
|
85
|
+
5. Assign Hostgroups to the policy (hosts you want to audit should be assigned with one of the
|
|
86
|
+
hostgroups)
|
|
87
|
+
4. Select particular hosts for compliance audit
|
|
88
|
+
1. Go to *Hosts -> All hosts* page
|
|
89
|
+
2. Select hosts
|
|
90
|
+
3. Use *Select Action -> Assign Compliance Policy* button
|
|
91
|
+
5. Make sure the DataStream file is present on the clients' file system.
|
|
92
|
+
|
|
93
|
+
At the moment, Foreman infrastructure is not able to serve a file to the clients. Hence, users
|
|
94
|
+
are required to distribute their DataStrem file to each client. The expected location is
|
|
95
|
+
defined at *Compliance Policy -> Edit* dialogue.
|
|
96
|
+
6. Inspect the compliance results
|
|
97
|
+
1. Go to *Hosts -> Compliance -> Reports* page
|
|
98
|
+
2. Wait for ARF Reports to show-up
|
|
99
|
+
3. Go to *Hosts -> Compliance -> Policies* page
|
|
100
|
+
4. Click the policy link to view dashboard and trend
|
|
101
|
+
|
|
23
102
|
## Installation from RPMS
|
|
24
103
|
|
|
25
104
|
- Install Foreman from [upstream](http://theforeman.org/)
|
|
@@ -62,20 +141,9 @@ of Foreman based infrastructure.
|
|
|
62
141
|
# service foreman restart
|
|
63
142
|
```
|
|
64
143
|
|
|
65
|
-
## Usage
|
|
66
|
-
|
|
67
|
-
Deploy [puppet-openscap](https://github.com/OpenSCAP/puppet-openscap) Puppet module
|
|
68
|
-
on your client systems. Apply openscap::xccdf::foreman_audit puppet class using Foreman
|
|
69
|
-
on your clients. The client will schedule OpenSCAP audit as requested by the Puppet
|
|
70
|
-
class. The audit report will be then transfered from the client machine to the proxy
|
|
71
|
-
(foreman-proxy_openscap). Then audit reports are forwarded from proxy to SCAPtimony
|
|
72
|
-
in batches and achieved at your Foreman server.
|
|
73
|
-
|
|
74
|
-
More coming, see future features above.
|
|
75
|
-
|
|
76
144
|
## Copyright
|
|
77
145
|
|
|
78
|
-
Copyright (c) 2014 Red Hat, Inc.
|
|
146
|
+
Copyright (c) 2014--2015 Red Hat, Inc.
|
|
79
147
|
|
|
80
148
|
This program is free software: you can redistribute it and/or modify
|
|
81
149
|
it under the terms of the GNU General Public License as published by
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#
|
|
2
|
-
# Copyright (c) 2014 Red Hat Inc.
|
|
2
|
+
# Copyright (c) 2014--2015 Red Hat Inc.
|
|
3
3
|
#
|
|
4
4
|
# This software is licensed to you under the GNU General Public License,
|
|
5
5
|
# version 3 (GPLv3). There is NO WARRANTY for this software, express or
|
|
@@ -19,9 +19,45 @@ module Api
|
|
|
19
19
|
include Api::Version2
|
|
20
20
|
include Foreman::Controller::SmartProxyAuth
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
add_smart_proxy_filters :create, :features => 'Openscap'
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
before_filter :find_resource, :only => %w{show destroy}
|
|
25
|
+
|
|
26
|
+
def resource_name
|
|
27
|
+
'Scaptimony::ArfReport'
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def get_resource
|
|
31
|
+
instance_variable_get :"@arf_report" or raise 'no resource loaded'
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
resource_description do
|
|
35
|
+
resource_id 'scaptimony_arf_reports'
|
|
36
|
+
api_version 'v2'
|
|
37
|
+
api_base_url "/api/v2"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
api :GET, '/compliance/arf_reports', N_('List Arf reports')
|
|
41
|
+
param_group :search_and_pagination, ::Api::V2::BaseController
|
|
42
|
+
|
|
43
|
+
def index
|
|
44
|
+
@arf_reports = resource_scope_for_index(:permission => :edit_compliance).includes(:arf_report_breakdown, :asset)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
api :GET, '/compliance/arf_reports/:id', N_('Show an Arf report')
|
|
48
|
+
param :id, :identifier, :required => true
|
|
49
|
+
|
|
50
|
+
def show
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
api :DELETE, '/compliance/arf_reports/:id', N_('Deletes an Arf Report')
|
|
54
|
+
param :id, :identifier, :required => true
|
|
55
|
+
|
|
56
|
+
def destroy
|
|
57
|
+
process_response @arf_report.destroy
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
api :POST, "/compliance/arf/:cname/:policy_id/:date", N_("Upload an ARF report")
|
|
25
61
|
param :cname, :identifier, :required => true
|
|
26
62
|
param :policy_id, :identifier, :required => true
|
|
27
63
|
param :date, :identifier, :required => true
|
|
@@ -43,9 +79,16 @@ module Api
|
|
|
43
79
|
# no matter what content-encoding says. Let's pass content-type arf-bzip2
|
|
44
80
|
# and move forward.
|
|
45
81
|
super unless
|
|
82
|
+
params[:action] == 'create' and
|
|
46
83
|
request.content_type.end_with? 'arf-bzip2' and
|
|
47
84
|
request.env['HTTP_CONTENT_ENCODING'] == 'x-bzip2'
|
|
48
85
|
end
|
|
86
|
+
|
|
87
|
+
private
|
|
88
|
+
def find_resource
|
|
89
|
+
not_found and return if params[:id].blank?
|
|
90
|
+
instance_variable_set("@arf_report", resource_scope.find(params[:id]))
|
|
91
|
+
end
|
|
49
92
|
end
|
|
50
93
|
end
|
|
51
94
|
end
|
|
@@ -1,14 +1,7 @@
|
|
|
1
1
|
module Api::V2
|
|
2
2
|
module Compliance
|
|
3
3
|
class PoliciesController < ::Api::V2::BaseController
|
|
4
|
-
|
|
5
|
-
include Foreman::Controller::SmartProxyAuth
|
|
6
|
-
|
|
7
|
-
add_puppetmaster_filters :content
|
|
8
|
-
|
|
9
|
-
before_filter :find_resource, :only => %w{content}
|
|
10
|
-
|
|
11
|
-
attr_reader :detected_proxy
|
|
4
|
+
before_filter :find_resource, :except => %w{index create}
|
|
12
5
|
|
|
13
6
|
def resource_name
|
|
14
7
|
'Scaptimony::Policy'
|
|
@@ -18,35 +11,69 @@ module Api::V2
|
|
|
18
11
|
instance_variable_get :"@policy" or raise 'no resource loaded'
|
|
19
12
|
end
|
|
20
13
|
|
|
14
|
+
def policy_url(policy = nil)
|
|
15
|
+
api_policy_url(@policy)
|
|
16
|
+
end
|
|
17
|
+
|
|
21
18
|
resource_description do
|
|
22
19
|
resource_id 'scaptimony_policies'
|
|
23
20
|
api_version 'v2'
|
|
24
21
|
api_base_url "/api/v2"
|
|
25
22
|
end
|
|
26
23
|
|
|
27
|
-
api :GET, '/compliance/policies
|
|
24
|
+
api :GET, '/compliance/policies', N_('List SCAP contents')
|
|
25
|
+
param_group :search_and_pagination, ::Api::V2::BaseController
|
|
26
|
+
|
|
27
|
+
def index
|
|
28
|
+
@policies = resource_scope_for_index(:permission => :edit_compliance)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
api :GET, '/compliance/policies/:id', N_('Show an SCAP content')
|
|
28
32
|
param :id, :identifier, :required => true
|
|
29
33
|
|
|
30
|
-
def
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
def show
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def_param_group :policy do
|
|
38
|
+
param :policy, Hash, :required => true, :action_aware => true do
|
|
39
|
+
param :name, String, :required => true, :desc => N_('Policy name')
|
|
40
|
+
param :description, String, :desc => N_('Policy description')
|
|
41
|
+
param :scap_content_id, Integer, :required => true, :desc => N_('Policy scap content id')
|
|
42
|
+
param :scap_content_profile_id, Integer, :required => true, :desc => N_('Policy scap content profile id')
|
|
43
|
+
param :period, String, :required => true, :desc => N_('Policy schedule period')
|
|
44
|
+
param :weekday, String, :required => true, :desc => N_('Policy schedule weekday')
|
|
45
|
+
param :hostgroup_ids, Array, :desc => N_('Apply policy to hostgroups')
|
|
46
|
+
param_group :taxonomies, ::Api::V2::BaseController
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
api :POST, '/compliance/policies', N_('Create a policy')
|
|
51
|
+
param_group :policy, :as => :create
|
|
52
|
+
|
|
53
|
+
def create
|
|
54
|
+
@policy = Scaptimony::Policy.new(params[:policy])
|
|
55
|
+
process_response @policy.save
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
api :PUT, '/compliance/policies/:id', N_('Update a policy')
|
|
59
|
+
param :id, :identifier, :required => true
|
|
60
|
+
param_group :policy
|
|
61
|
+
|
|
62
|
+
def update
|
|
63
|
+
process_response @policy.update_attributes(params[:policy])
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
api :DELETE, '/compliance/policies/:id', N_('Deletes a policy')
|
|
67
|
+
param :id, :identifier, :required => true
|
|
68
|
+
|
|
69
|
+
def destroy
|
|
70
|
+
process_response @policy.destroy
|
|
35
71
|
end
|
|
36
72
|
|
|
37
73
|
private
|
|
38
74
|
def find_resource
|
|
39
75
|
not_found and return if params[:id].blank?
|
|
40
|
-
instance_variable_set("@policy",
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def action_permission
|
|
44
|
-
case params[:action]
|
|
45
|
-
when 'content'
|
|
46
|
-
:view
|
|
47
|
-
else
|
|
48
|
-
super
|
|
49
|
-
end
|
|
76
|
+
instance_variable_set("@policy", resource_scope.find(params[:id]))
|
|
50
77
|
end
|
|
51
78
|
end
|
|
52
79
|
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
module Api::V2
|
|
2
|
+
module Compliance
|
|
3
|
+
class ScapContentsController < ::Api::V2::BaseController
|
|
4
|
+
before_filter :find_resource, :except => %w{index create}
|
|
5
|
+
|
|
6
|
+
def resource_name
|
|
7
|
+
'Scaptimony::ScapContent'
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def get_resource
|
|
11
|
+
instance_variable_get :"@scap_content" or raise 'no resource loaded'
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
resource_description do
|
|
15
|
+
resource_id 'scaptimony_scap_contents'
|
|
16
|
+
api_version 'v2'
|
|
17
|
+
api_base_url "/api/v2"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
api :GET, '/compliance/scap_contents', N_('List SCAP contents')
|
|
21
|
+
param_group :search_and_pagination, ::Api::V2::BaseController
|
|
22
|
+
|
|
23
|
+
def index
|
|
24
|
+
@scap_contents = resource_scope_for_index(:permission => :edit_compliance)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
api :GET, '/compliance/scap_contents/:id', N_('Show an SCAP content')
|
|
28
|
+
param :id, :identifier, :required => true
|
|
29
|
+
|
|
30
|
+
def show
|
|
31
|
+
send_data @scap_content.scap_file,
|
|
32
|
+
:type => 'application/xml',
|
|
33
|
+
:filename => @scap_content.original_filename
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def_param_group :scap_content do
|
|
37
|
+
param :scap_content, Hash, :required => true, :action_aware => true do
|
|
38
|
+
param :title, String, :required => true, :desc => N_('Scap content name')
|
|
39
|
+
param :scap_file, String, :required => true
|
|
40
|
+
param_group :taxonomies, ::Api::V2::BaseController
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
api :POST, '/compliance/scap_contents', N_('Create SCAP content')
|
|
45
|
+
param_group :scap_content, :as => :create
|
|
46
|
+
|
|
47
|
+
def create
|
|
48
|
+
@scap_content = Scaptimony::ScapContent.new(params[:scap_content])
|
|
49
|
+
process_response @scap_content.save
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
api :PUT, '/compliance/scap_contents/:id', N_('Update an SCAP content')
|
|
53
|
+
param :id, :identifier, :required => true
|
|
54
|
+
param_group :scap_content
|
|
55
|
+
|
|
56
|
+
def update
|
|
57
|
+
process_response @scap_content.update_attributes(params[:scap_content])
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
api :DELETE, '/compliance/scap_contents/:id', N_('Deletes an SCAP content')
|
|
61
|
+
param :id, :identifier, :required => true
|
|
62
|
+
|
|
63
|
+
def destroy
|
|
64
|
+
process_response @scap_content.destroy
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
private
|
|
68
|
+
def find_resource
|
|
69
|
+
not_found and return if params[:id].blank?
|
|
70
|
+
instance_variable_set("@scap_content", resource_scope.find(params[:id]))
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
class ScaptimonyPoliciesController < ApplicationController
|
|
2
2
|
include Foreman::Controller::AutoCompleteSearch
|
|
3
3
|
before_filter :find_by_id, :only => [:show, :edit, :update, :parse, :destroy]
|
|
4
|
-
before_filter :find_multiple, :only => [:select_multiple_hosts, :update_multiple_hosts]
|
|
4
|
+
before_filter :find_multiple, :only => [:select_multiple_hosts, :update_multiple_hosts, :disassociate_multiple_hosts, :remove_policy_from_multiple_hosts]
|
|
5
5
|
|
|
6
6
|
def model_of_controller
|
|
7
7
|
::Scaptimony::Policy
|
|
@@ -73,7 +73,7 @@ class ScaptimonyPoliciesController < ApplicationController
|
|
|
73
73
|
def update_multiple_hosts
|
|
74
74
|
if (id = params['policy']['id'])
|
|
75
75
|
policy = ::Scaptimony::Policy.find(id)
|
|
76
|
-
policy.assign_hosts
|
|
76
|
+
policy.assign_hosts(@hosts)
|
|
77
77
|
notice _("Updated hosts: Assigned with compliance policy: #{policy.name}")
|
|
78
78
|
# We prefer to go back as this does not lose the current search
|
|
79
79
|
redirect_to hosts_path
|
|
@@ -83,6 +83,20 @@ class ScaptimonyPoliciesController < ApplicationController
|
|
|
83
83
|
end
|
|
84
84
|
end
|
|
85
85
|
|
|
86
|
+
def disassociate_multiple_hosts; end
|
|
87
|
+
|
|
88
|
+
def remove_policy_from_multiple_hosts
|
|
89
|
+
if (id = params.fetch(:policy, {})[:id])
|
|
90
|
+
policy = ::Scaptimony::Policy.find(id)
|
|
91
|
+
policy.unassign_hosts(@hosts)
|
|
92
|
+
notice _("Updated hosts: Unassigned from compliance policy '%s'") % policy.name
|
|
93
|
+
redirect_to hosts_path
|
|
94
|
+
else
|
|
95
|
+
error _('No valid policy id provided')
|
|
96
|
+
redirect_to hosts_path
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
86
100
|
def welcome
|
|
87
101
|
@searchbar = true
|
|
88
102
|
if (model_of_controller.first.nil? rescue false)
|
|
@@ -6,8 +6,39 @@ module ForemanOpenscap
|
|
|
6
6
|
alias_method_chain :multiple_actions, :scap
|
|
7
7
|
end
|
|
8
8
|
|
|
9
|
+
Colors = {
|
|
10
|
+
:passed => '#89A54E',
|
|
11
|
+
:failed => '#AA4643',
|
|
12
|
+
:othered => '#DB843D',
|
|
13
|
+
}
|
|
14
|
+
|
|
9
15
|
def multiple_actions_with_scap
|
|
10
|
-
multiple_actions_without_scap
|
|
16
|
+
multiple_actions_without_scap + [[_('Assign Compliance Policy'), select_multiple_hosts_scaptimony_policies_path],
|
|
17
|
+
[_('Unassign Compliance Policy'), disassociate_multiple_hosts_scaptimony_policies_path]]
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def host_policy_breakdown_chart(report, options = {})
|
|
22
|
+
data = []
|
|
23
|
+
[[:passed, _('Passed')],
|
|
24
|
+
[:failed, _('Failed')],
|
|
25
|
+
[:othered, _('Other')],
|
|
26
|
+
].each { |i|
|
|
27
|
+
data << {:label => i[1], :data => report[i[0]], :color => Colors[i[0]]}
|
|
28
|
+
}
|
|
29
|
+
flot_pie_chart 'overview', _('Compliance reports breakdown'), data, options
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def host_arf_reports_chart(policy_id)
|
|
33
|
+
passed, failed, othered, = [], [], []
|
|
34
|
+
@host.arf_reports.of_policy(policy_id).each do |report|
|
|
35
|
+
passed << [report.created_at.to_i*1000, report.passed]
|
|
36
|
+
failed << [report.created_at.to_i*1000, report.failed]
|
|
37
|
+
othered << [report.created_at.to_i*1000, report.othered]
|
|
38
|
+
end
|
|
39
|
+
[{:label => _("Passed"), :data => passed, :color => Colors[:passed]},
|
|
40
|
+
{:label => _("Failed"), :data => failed, :color => Colors[:failed]},
|
|
41
|
+
{:label => _("Othered"), :data => othered, :color => Colors[:othered]}]
|
|
11
42
|
end
|
|
12
43
|
end
|
|
13
44
|
end
|
|
@@ -21,6 +21,7 @@ module ForemanOpenscap
|
|
|
21
21
|
|
|
22
22
|
scope :hosts, lambda { includes(:policy, :arf_report_breakdown) }
|
|
23
23
|
scope :latest, lambda { includes(:host, :policy, :arf_report_breakdown).limit(5).order("scaptimony_arf_reports.created_at DESC") }
|
|
24
|
+
scope :of_policy, lambda {|policy_id| {:conditions => {:policy_id => policy_id}}}
|
|
24
25
|
|
|
25
26
|
scoped_search :in => :host, :on => :name, :complete_value => :true, :rename => "host"
|
|
26
27
|
|
|
@@ -129,12 +129,16 @@ module ForemanOpenscap
|
|
|
129
129
|
assign_assets hosts.map &:get_asset
|
|
130
130
|
end
|
|
131
131
|
|
|
132
|
+
def unassign_hosts(hosts)
|
|
133
|
+
host_asset_ids = Scaptimony::Asset.where(:assetable_type => 'Host::Base', :assetable_id => hosts.map(&:id)).pluck(:id)
|
|
134
|
+
self.asset_ids = self.asset_ids - host_asset_ids
|
|
135
|
+
end
|
|
136
|
+
|
|
132
137
|
def to_enc
|
|
133
138
|
{
|
|
134
139
|
'id' => self.id,
|
|
135
140
|
'profile_id' => self.scap_content_profile.try(:profile_id) || '',
|
|
136
141
|
'content_path' => "/var/lib/openscap/content/#{self.scap_content.digest}.xml",
|
|
137
|
-
'download_path' => "/compliance/policies/#{self.id}/content" # default to proxy path
|
|
138
142
|
}.merge(period_enc)
|
|
139
143
|
end
|
|
140
144
|
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module Scaptimony::HostReportDashboard
|
|
2
|
+
class Data
|
|
3
|
+
attr_reader :report
|
|
4
|
+
|
|
5
|
+
def initialize(policy_id, asset_id)
|
|
6
|
+
@latest_report = Scaptimony::ArfReport.where(:asset_id => asset_id, :policy_id => policy_id).order('created_at DESC').limit(1).first
|
|
7
|
+
@report = {}
|
|
8
|
+
fetch_data
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
attr_writer :report
|
|
13
|
+
attr_accessor :latest_report
|
|
14
|
+
|
|
15
|
+
def fetch_data
|
|
16
|
+
report.update(
|
|
17
|
+
{
|
|
18
|
+
:passed => report_passed,
|
|
19
|
+
:failed => report_failed,
|
|
20
|
+
:othered => report_othered
|
|
21
|
+
}
|
|
22
|
+
)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def report_passed
|
|
26
|
+
@latest_report.passed
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def report_failed
|
|
30
|
+
@latest_report.failed
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def report_othered
|
|
34
|
+
@latest_report.othered
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
object @scap_content
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
</tr>
|
|
14
14
|
<% latest_reports.each do |report| %>
|
|
15
15
|
<tr>
|
|
16
|
-
<td><%= link_to h(report.host.
|
|
16
|
+
<td><%= link_to h(report.host.name), scaptimony_arf_report_path(report) %></td>
|
|
17
17
|
<td><%= link_to h(report.policy.name), scaptimony_policy_dashboard_scaptimony_policy_path(report.policy) %></td>
|
|
18
18
|
<td><%= report_event_column(report.passed, "label-success") %></td>
|
|
19
19
|
<td><%= report_event_column(report.failed, "label-danger") %></td>
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
</tr>
|
|
10
10
|
<% for arf_report in @arf_reports %>
|
|
11
11
|
<tr>
|
|
12
|
-
<td><%=
|
|
12
|
+
<td><%= name_column(arf_report.host) %></td>
|
|
13
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>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<% if host.arf_reports.any? %>
|
|
2
|
+
<table class="table table-bordered table-striped" id="compliance">
|
|
3
|
+
<tr>
|
|
4
|
+
<th colspan="2"><%= _('Compliance Properties') %></th>
|
|
5
|
+
</tr>
|
|
6
|
+
<tr>
|
|
7
|
+
<td><%= _('Compliance') %></td>
|
|
8
|
+
<td>
|
|
9
|
+
<% if host.arf_reports.search_for('failed > 0').blank? %>
|
|
10
|
+
<%= link_to(report_event_column('O', "label-success"), scaptimony_host_path(host.id)) %>
|
|
11
|
+
<% else %>
|
|
12
|
+
<%= link_to(report_event_column('F', "label-danger"), scaptimony_host_path(host.id)) %>
|
|
13
|
+
<% end %>
|
|
14
|
+
</td>
|
|
15
|
+
</tr>
|
|
16
|
+
</table>
|
|
17
|
+
<% end %>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<%= javascript 'dashboard', 'foreman_openscap/scap_hosts_show' %>
|
|
2
|
+
|
|
3
|
+
<% title _("%s compliance reports by policy") % @host.to_label %>
|
|
4
|
+
<% @host.policies.each do |policy| %>
|
|
5
|
+
<h2 class="center-block"><%= _('Policy %s') % policy %></h2>
|
|
6
|
+
<div class="row">
|
|
7
|
+
<div class="col-md-4">
|
|
8
|
+
<div class="stats-well">
|
|
9
|
+
<h4 class="header ca"><%= _('%s latest report') % policy.name %></h4>
|
|
10
|
+
<% report = Scaptimony::HostReportDashboard::Data.new(policy.id, @host.asset.id).report %>
|
|
11
|
+
<%= host_policy_breakdown_chart(report, :class => 'statistics-pie small') %>
|
|
12
|
+
</div>
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
<div class="col-md-8">
|
|
16
|
+
<div class="stats-well">
|
|
17
|
+
<h4 class="ca"><%= _("%s reports over time") % policy %></h4>
|
|
18
|
+
<%= flot_chart('resource_graph', '', '', host_arf_reports_chart(policy.id)) %>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
<hr style="border: 1px solid #eeeeee"/>
|
|
23
|
+
<% end %>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
<%= render 'hosts/selected_hosts', :hosts => @hosts %>
|
|
2
|
+
<%= form_for :policy,
|
|
3
|
+
:url => remove_policy_from_multiple_hosts_scaptimony_policies_path(:host_ids => params[:host_ids]) do |f| %>
|
|
4
|
+
<%= selectable_f f, :id, [[_('Select Compliance Policy'), 'disabled'],
|
|
5
|
+
] + Scaptimony::Policy.all.map{|e| [e.name, e.id]},{},
|
|
6
|
+
:onchange => 'toggle_multiple_ok_button(this)' %>
|
|
7
|
+
<% end %>
|
data/config/routes.rb
CHANGED
|
@@ -22,6 +22,8 @@ Rails.application.routes.draw do
|
|
|
22
22
|
post 'scap_content_selected'
|
|
23
23
|
get 'select_multiple_hosts'
|
|
24
24
|
post 'update_multiple_hosts'
|
|
25
|
+
get 'disassociate_multiple_hosts'
|
|
26
|
+
post 'remove_policy_from_multiple_hosts'
|
|
25
27
|
end
|
|
26
28
|
end
|
|
27
29
|
resources :scap_contents,
|
|
@@ -30,16 +32,18 @@ Rails.application.routes.draw do
|
|
|
30
32
|
get 'auto_complete_search'
|
|
31
33
|
end
|
|
32
34
|
end
|
|
35
|
+
resources :hosts, :only => [:show], :as => :scaptimony_hosts, :controller => :scaptimony_hosts
|
|
33
36
|
end
|
|
34
37
|
|
|
35
38
|
namespace :api do
|
|
36
39
|
scope "(:apiv)", :module => :v2, :defaults => {:apiv => 'v2'},
|
|
37
40
|
:apiv => /v1|v2/, :constraints => ApiConstraints.new(:version => 2) do
|
|
38
41
|
namespace :compliance do
|
|
42
|
+
resources :scap_contents, :except => [:new, :edit]
|
|
43
|
+
resources :policies, :except => [:new, :edit]
|
|
44
|
+
resources :arf_reports, :only => [:index, :show, :destroy]
|
|
39
45
|
post 'arf_reports/:cname/:policy_id/:date', \
|
|
40
46
|
:constraints => { :cname => /[^\/]+/ }, :to => 'arf_reports#create'
|
|
41
|
-
|
|
42
|
-
get 'policies/:id/content', :to => 'policies#content'
|
|
43
47
|
end
|
|
44
48
|
end
|
|
45
49
|
end
|
|
@@ -19,6 +19,7 @@ module ForemanOpenscap
|
|
|
19
19
|
app.config.assets.precompile += %w(
|
|
20
20
|
'foreman_openscap/policy_edit.js',
|
|
21
21
|
'foreman_openscap/period_selector.js',
|
|
22
|
+
'foreman_openscap/scap_hosts_show.js',
|
|
22
23
|
'foreman_openscap/policy.css'
|
|
23
24
|
)
|
|
24
25
|
end
|
|
@@ -27,6 +28,7 @@ module ForemanOpenscap
|
|
|
27
28
|
SETTINGS[:foreman_openscap] =
|
|
28
29
|
{:assets => {:precompile => ['foreman_openscap/policy_edit.js',
|
|
29
30
|
'foreman_openscap/period_selector.js',
|
|
31
|
+
'foreman_openscap/scap_hosts_show.js',
|
|
30
32
|
'foreman_openscap/policy.css']}}
|
|
31
33
|
end
|
|
32
34
|
|
|
@@ -5617,31 +5617,4 @@ To verify insecure file locking has been disabled, run the following command:
|
|
|
5617
5617
|
<external_variable comment="maximum password age" datatype="int" id="oval:ssg:var:282" version="1"/>
|
|
5618
5618
|
<external_variable comment="timeout value" datatype="int" id="oval:ssg:var:283" version="1"/>
|
|
5619
5619
|
</variables>
|
|
5620
|
-
</oval_definitions></ds:component></ds:data-stream-collection>
|
|
5621
|
-
|
|
5622
|
-
|
|
5623
|
-
|
|
5624
|
-
|
|
5625
|
-
|
|
5626
|
-
|
|
5627
|
-
|
|
5628
|
-
|
|
5629
|
-
|
|
5630
|
-
|
|
5631
|
-
|
|
5632
|
-
|
|
5633
|
-
|
|
5634
|
-
|
|
5635
|
-
|
|
5636
|
-
|
|
5637
|
-
|
|
5638
|
-
|
|
5639
|
-
|
|
5640
|
-
|
|
5641
|
-
|
|
5642
|
-
|
|
5643
|
-
|
|
5644
|
-
|
|
5645
|
-
|
|
5646
|
-
|
|
5647
|
-
|
|
5620
|
+
</oval_definitions></ds:component></ds:data-stream-collection>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require 'test_plugin_helper'
|
|
2
|
+
|
|
3
|
+
class Api::V2::ArfReportsControllerTest < ActionController::TestCase
|
|
4
|
+
setup do
|
|
5
|
+
# override validation of policy (puppetclass, lookup_key overrides)
|
|
6
|
+
Scaptimony::Policy.any_instance.stubs(:valid?).returns(true)
|
|
7
|
+
end
|
|
8
|
+
test "should get index" do
|
|
9
|
+
FactoryGirl.create(:arf_report)
|
|
10
|
+
get :index, {}, set_session_user
|
|
11
|
+
response = ActiveSupport::JSON.decode(@response.body)
|
|
12
|
+
assert_not response['results'].empty?
|
|
13
|
+
assert_response :success
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
test "should get show" do
|
|
17
|
+
get :show, { :id => FactoryGirl.create(:arf_report).to_param }, set_session_user
|
|
18
|
+
response = ActiveSupport::JSON.decode(@response.body)
|
|
19
|
+
refute response['passed'].blank?
|
|
20
|
+
refute response['failed'].blank?
|
|
21
|
+
refute response['othered'].blank?
|
|
22
|
+
assert_response :success
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
require 'test_plugin_helper'
|
|
2
|
+
|
|
3
|
+
class Api::V2::PoliciesControllerTest < ActionController::TestCase
|
|
4
|
+
setup do
|
|
5
|
+
Scaptimony::Policy.any_instance.stubs(:ensure_needed_puppetclasses).returns(true)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
test "should get index" do
|
|
9
|
+
FactoryGirl.create(:policy)
|
|
10
|
+
get :index, {}, set_session_user
|
|
11
|
+
response = ActiveSupport::JSON.decode(@response.body)
|
|
12
|
+
assert response['results'].length > 0
|
|
13
|
+
assert_response :success
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
test "should show a policy" do
|
|
17
|
+
policy = FactoryGirl.create(:policy)
|
|
18
|
+
get :show, { :id => policy.to_param }, set_session_user
|
|
19
|
+
response = ActiveSupport::JSON.decode(@response.body)
|
|
20
|
+
assert response['name'], policy.name
|
|
21
|
+
assert_response :success
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
test "should update a policy" do
|
|
25
|
+
policy = FactoryGirl.create(:policy)
|
|
26
|
+
put :update, {:id => policy.id, :policy => {:period => 'monthly'}}
|
|
27
|
+
updated_policy = ActiveSupport::JSON.decode(@response.body)
|
|
28
|
+
assert(updated_policy['period'], 'monthly')
|
|
29
|
+
assert_response :ok
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
test "should not update invalid" do
|
|
33
|
+
policy = FactoryGirl.create(:policy)
|
|
34
|
+
put :update, {:id => policy.id, :policy => {:name => 'say my name'}}
|
|
35
|
+
assert_response :unprocessable_entity
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
test "should create a policy" do
|
|
39
|
+
scap_content_profile = FactoryGirl.create(:scap_content_profile)
|
|
40
|
+
attributes = {:policy => {:name => 'my_policy', :scap_content_profile_id => scap_content_profile.id, :scap_content_id => scap_content_profile.scap_content_id}}
|
|
41
|
+
post :create, attributes, set_session_user
|
|
42
|
+
response = ActiveSupport::JSON.decode(@response.body)
|
|
43
|
+
assert response['scap_content_profile_id'], scap_content_profile.to_param
|
|
44
|
+
assert_response :created
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
test "should not create invalid policy" do
|
|
48
|
+
post :create, {}, set_session_user
|
|
49
|
+
assert_response :unprocessable_entity
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
test "should destroy" do
|
|
53
|
+
policy = FactoryGirl.create(:policy)
|
|
54
|
+
delete :destroy, { :id => policy.id }, set_session_user
|
|
55
|
+
assert_response :ok
|
|
56
|
+
refute Scaptimony::Policy.exists?(policy.id)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
require 'test_plugin_helper'
|
|
2
|
+
|
|
3
|
+
class Api::V2::ScapContentsControllerTest < ActionController::TestCase
|
|
4
|
+
|
|
5
|
+
test "should get index" do
|
|
6
|
+
FactoryGirl.create(:scap_content)
|
|
7
|
+
get :index, {}, set_session_user
|
|
8
|
+
response = ActiveSupport::JSON.decode(@response.body)
|
|
9
|
+
assert response['results'].any?
|
|
10
|
+
assert_response :success
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
test "should return xml of scap content" do
|
|
14
|
+
scap_content = FactoryGirl.create(:scap_content)
|
|
15
|
+
get :show, { :id => scap_content.id }, set_session_user
|
|
16
|
+
assert(@response.header['Content-Type'], 'application/xml')
|
|
17
|
+
assert_response :success
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
test "should create invalid scap content" do
|
|
21
|
+
post :create, {}, set_session_user
|
|
22
|
+
assert_response :unprocessable_entity
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
test "should create scap content" do
|
|
26
|
+
# Skipped as API does not support uploading files
|
|
27
|
+
skip
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
test "should update scap content" do
|
|
31
|
+
scap_content = FactoryGirl.create(:scap_content)
|
|
32
|
+
put :update, { :id => scap_content.id, :scap_content => {:title => 'RHEL7 SCAP'}}, set_session_user
|
|
33
|
+
assert_response :success
|
|
34
|
+
assert scap_content.title, 'RHEL7 SCAP'
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
test "should not update invalid scap content" do
|
|
38
|
+
scap_content = FactoryGirl.create(:scap_content)
|
|
39
|
+
put :update, { :id => scap_content.id, :scap_content => {:scap_file => '<xml>blah</xml>'}}, set_session_user
|
|
40
|
+
assert_response :unprocessable_entity
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
test "should destory scap content" do
|
|
44
|
+
scap_content = FactoryGirl.create(:scap_content)
|
|
45
|
+
delete :destroy, { :id => scap_content.id }, set_session_user
|
|
46
|
+
assert_response :ok
|
|
47
|
+
refute Scaptimony::ScapContent.exists?(scap_content.id)
|
|
48
|
+
end
|
|
49
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: foreman_openscap
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- "Šimon Lukašík"
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2015-
|
|
11
|
+
date: 2015-03-25 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: deface
|
|
@@ -47,14 +47,16 @@ extra_rdoc_files: []
|
|
|
47
47
|
files:
|
|
48
48
|
- LICENSE
|
|
49
49
|
- README.md
|
|
50
|
-
- Rakefile
|
|
51
50
|
- app/assets/javascript/foreman_openscap/period_selector.js
|
|
52
51
|
- app/assets/javascript/foreman_openscap/policy_edit.js
|
|
52
|
+
- app/assets/javascript/foreman_openscap/scap_hosts_show.js
|
|
53
53
|
- app/assets/stylesheets/foreman_openscap/policy.css.scss
|
|
54
54
|
- app/controllers/api/v2/compliance/arf_reports_controller.rb
|
|
55
55
|
- app/controllers/api/v2/compliance/policies_controller.rb
|
|
56
|
+
- app/controllers/api/v2/compliance/scap_contents_controller.rb
|
|
56
57
|
- app/controllers/scaptimony_arf_reports_controller.rb
|
|
57
58
|
- app/controllers/scaptimony_dashboard_controller.rb
|
|
59
|
+
- app/controllers/scaptimony_hosts_controller.rb
|
|
58
60
|
- app/controllers/scaptimony_policies_controller.rb
|
|
59
61
|
- app/controllers/scaptimony_policy_dashboard_controller.rb
|
|
60
62
|
- app/controllers/scaptimony_scap_contents_controller.rb
|
|
@@ -70,20 +72,37 @@ files:
|
|
|
70
72
|
- app/models/concerns/foreman_openscap/policy_extensions.rb
|
|
71
73
|
- app/models/concerns/foreman_openscap/scap_content_extensions.rb
|
|
72
74
|
- app/overrides/hosts/index/host_arf_report.rb
|
|
75
|
+
- app/overrides/hosts/overview/host_compliance_status.rb
|
|
76
|
+
- app/services/scaptimony/host_report_dashboard/data.rb
|
|
73
77
|
- app/services/scaptimony/policy_dashboard/data.rb
|
|
74
78
|
- app/services/scaptimony/policy_dashboard/loader.rb
|
|
75
79
|
- app/services/scaptimony/policy_dashboard/manager.rb
|
|
76
80
|
- app/services/scaptimony/report_dashboard/data.rb
|
|
81
|
+
- app/views/api/v2/compliance/arf_reports/base.json.rabl
|
|
82
|
+
- app/views/api/v2/compliance/arf_reports/index.json.rabl
|
|
83
|
+
- app/views/api/v2/compliance/arf_reports/main.json.rabl
|
|
84
|
+
- app/views/api/v2/compliance/arf_reports/show.json.rabl
|
|
85
|
+
- app/views/api/v2/compliance/policies/base.json.rabl
|
|
86
|
+
- app/views/api/v2/compliance/policies/index.json.rabl
|
|
87
|
+
- app/views/api/v2/compliance/policies/main.json.rabl
|
|
88
|
+
- app/views/api/v2/compliance/policies/show.json.rabl
|
|
89
|
+
- app/views/api/v2/compliance/scap_contents/base.json.rabl
|
|
90
|
+
- app/views/api/v2/compliance/scap_contents/index.json.rabl
|
|
91
|
+
- app/views/api/v2/compliance/scap_contents/main.json.rabl
|
|
92
|
+
- app/views/api/v2/compliance/scap_contents/show.json.rabl
|
|
77
93
|
- app/views/dashboard/_foreman_openscap_host_reports_widget.html.erb
|
|
78
94
|
- app/views/dashboard/_foreman_openscap_reports_breakdown_widget.html.erb
|
|
79
95
|
- app/views/scaptimony_arf_reports/_host_report.html.erb
|
|
80
96
|
- app/views/scaptimony_arf_reports/_list.html.erb
|
|
81
97
|
- app/views/scaptimony_arf_reports/index.html.erb
|
|
82
98
|
- app/views/scaptimony_arf_reports/show.html.erb
|
|
99
|
+
- app/views/scaptimony_hosts/_host_status.html.erb
|
|
100
|
+
- app/views/scaptimony_hosts/show.html.erb
|
|
83
101
|
- app/views/scaptimony_policies/_form.html.erb
|
|
84
102
|
- app/views/scaptimony_policies/_list.html.erb
|
|
85
103
|
- app/views/scaptimony_policies/_scap_content_results.html.erb
|
|
86
104
|
- app/views/scaptimony_policies/create.html.erb
|
|
105
|
+
- app/views/scaptimony_policies/disassociate_multiple_hosts.html.erb
|
|
87
106
|
- app/views/scaptimony_policies/edit.html.erb
|
|
88
107
|
- app/views/scaptimony_policies/index.html.erb
|
|
89
108
|
- app/views/scaptimony_policies/new.html.erb
|
|
@@ -114,11 +133,14 @@ files:
|
|
|
114
133
|
- lib/foreman_openscap/helper.rb
|
|
115
134
|
- lib/foreman_openscap/version.rb
|
|
116
135
|
- lib/tasks/foreman_openscap_tasks.rake
|
|
117
|
-
- test/factories/
|
|
136
|
+
- test/factories/arf_report_factory.rb
|
|
137
|
+
- test/factories/asset_factory.rb
|
|
118
138
|
- test/factories/policy_factory.rb
|
|
119
139
|
- test/factories/scap_content_related.rb
|
|
120
140
|
- test/files/scap_contents/ssg-fedora-ds.xml
|
|
121
|
-
- test/functional/api/v2/
|
|
141
|
+
- test/functional/api/v2/arf_reports_controller_test.rb
|
|
142
|
+
- test/functional/api/v2/policies_controller_test.rb
|
|
143
|
+
- test/functional/api/v2/scap_contents_controller_test.rb
|
|
122
144
|
- test/test_plugin_helper.rb
|
|
123
145
|
- test/unit/openscap_host_test.rb
|
|
124
146
|
homepage: https://github.com/OpenSCAP/foreman_openscap
|
|
@@ -149,8 +171,11 @@ test_files:
|
|
|
149
171
|
- test/unit/openscap_host_test.rb
|
|
150
172
|
- test/test_plugin_helper.rb
|
|
151
173
|
- test/files/scap_contents/ssg-fedora-ds.xml
|
|
152
|
-
- test/functional/api/v2/
|
|
174
|
+
- test/functional/api/v2/arf_reports_controller_test.rb
|
|
175
|
+
- test/functional/api/v2/scap_contents_controller_test.rb
|
|
176
|
+
- test/functional/api/v2/policies_controller_test.rb
|
|
177
|
+
- test/factories/asset_factory.rb
|
|
153
178
|
- test/factories/policy_factory.rb
|
|
154
179
|
- test/factories/scap_content_related.rb
|
|
155
|
-
- test/factories/
|
|
180
|
+
- test/factories/arf_report_factory.rb
|
|
156
181
|
has_rdoc:
|
data/Rakefile
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env rake
|
|
2
|
-
begin
|
|
3
|
-
require 'bundler/setup'
|
|
4
|
-
rescue LoadError
|
|
5
|
-
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
|
6
|
-
end
|
|
7
|
-
begin
|
|
8
|
-
require 'rdoc/task'
|
|
9
|
-
rescue LoadError
|
|
10
|
-
require 'rdoc/rdoc'
|
|
11
|
-
require 'rake/rdoctask'
|
|
12
|
-
RDoc::Task = Rake::RDocTask
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
RDoc::Task.new(:rdoc) do |rdoc|
|
|
16
|
-
rdoc.rdoc_dir = 'rdoc'
|
|
17
|
-
rdoc.title = 'ForemanOpenscap'
|
|
18
|
-
rdoc.options << '--line-numbers'
|
|
19
|
-
rdoc.rdoc_files.include('README.rdoc')
|
|
20
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
|
|
24
|
-
load 'rails/tasks/engine.rake'
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
Bundler::GemHelper.install_tasks
|
|
29
|
-
|
|
30
|
-
require 'rake/testtask'
|
|
31
|
-
|
|
32
|
-
Rake::TestTask.new(:test) do |t|
|
|
33
|
-
t.libs << 'lib'
|
|
34
|
-
t.libs << 'test'
|
|
35
|
-
t.pattern = 'test/**/*_test.rb'
|
|
36
|
-
t.verbose = false
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
task :default => :test
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
require 'test_plugin_helper'
|
|
2
|
-
|
|
3
|
-
class Api::V2::Compliance::PoliciesControllerTest < ActionController::TestCase
|
|
4
|
-
setup do
|
|
5
|
-
Scaptimony::Policy.any_instance.stubs(:ensure_needed_puppetclasses).returns(true)
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
test "should return xml of scap content" do
|
|
9
|
-
policy = FactoryGirl.create(:policy)
|
|
10
|
-
get :content, { :id => policy.id }, set_session_user
|
|
11
|
-
assert(@response.header['Content-Type'], 'application/xml')
|
|
12
|
-
assert_response :success
|
|
13
|
-
end
|
|
14
|
-
end
|