foreman-proxy_openscap 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +25 -5
- data/bin/foreman-proxy-openscap-send +43 -0
- data/extra/foreman-proxy-openscap-send.cron +2 -0
- data/extra/rubygem-foreman-proxy_openscap.spec +18 -2
- data/foreman-proxy_openscap.gemspec +1 -0
- data/lib/foreman-proxy_openscap/openscap_api.rb +1 -4
- data/lib/foreman-proxy_openscap/openscap_lib.rb +103 -0
- data/lib/foreman-proxy_openscap/openscap_plugin.rb +2 -1
- data/lib/foreman-proxy_openscap/openscap_version.rb +1 -1
- data/settings.d/openscap.yml.example +3 -0
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a666dc3985dd08637d39416bec98b242a32cada9
|
4
|
+
data.tar.gz: df79ba41c09a04079fc09c615804d43317fb06ea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8624fd542f7bbadb842b0b55eb32ba16243a98d414f43fc51c33956907bcef51ee68dff3738e1309cd24b4c4bbf91b2e5e02db937495d648e0beea2cf2bad704
|
7
|
+
data.tar.gz: 8f2ad83e0601b13cdf4cf11486f3eac55e7bbaced8816f53f7199a25ced7aa3748cb91050c0f1c35cb2cc3f2b30f4597676396471892f23863b959c70e0376d2
|
data/README.md
CHANGED
@@ -3,8 +3,11 @@
|
|
3
3
|
A plug-in to the Foreman Proxy which receives bzip2ed ARF files
|
4
4
|
and forwards them to the Foreman.
|
5
5
|
|
6
|
-
|
7
|
-
|
6
|
+
Incoming ARF files are authenticated using puppet certificate of
|
7
|
+
the client machine. Proxy caches collected ARF files until they
|
8
|
+
are forwarded to Foreman.
|
9
|
+
|
10
|
+
Learn more about [Foreman-OpenSCAP](https://github.com/OpenSCAP/foreman_openscap) workflow.
|
8
11
|
|
9
12
|
## Installation
|
10
13
|
|
@@ -20,7 +23,7 @@ reports will be forwarded to foreman_openscap in future versions.
|
|
20
23
|
```
|
21
24
|
~$ cd foreman-proxy_openscap
|
22
25
|
~$ gem build foreman_proxy_openscap.gemspec
|
23
|
-
~# yum install yum-utils
|
26
|
+
~# yum install yum-utils rpm-build
|
24
27
|
~# yum-builddep extra/rubygem-foreman-proxy_openscap.spec
|
25
28
|
~# rpmbuild --define "_sourcedir `pwd`" -ba extra/rubygem-foreman-proxy_openscap.spec
|
26
29
|
```
|
@@ -36,6 +39,7 @@ reports will be forwarded to foreman_openscap in future versions.
|
|
36
39
|
```
|
37
40
|
cp /etc/foreman-proxy/settings.d/openscap.yml{.example,}
|
38
41
|
vim /etc/foreman-proxy/settings.d/openscap.yml
|
42
|
+
echo ":foreman_url: https://my-foreman.local.lan" >> /etc/foreman-proxy/settings.yml
|
39
43
|
```
|
40
44
|
|
41
45
|
- Deploy
|
@@ -46,5 +50,21 @@ reports will be forwarded to foreman_openscap in future versions.
|
|
46
50
|
|
47
51
|
- Usage:
|
48
52
|
|
49
|
-
|
50
|
-
|
53
|
+
Learn more about [Foreman-OpenSCAP](https://github.com/OpenSCAP/foreman_openscap) workflow.
|
54
|
+
|
55
|
+
## Copyright
|
56
|
+
|
57
|
+
Copyright (c) 2014 Red Hat, Inc.
|
58
|
+
|
59
|
+
This program is free software: you can redistribute it and/or modify
|
60
|
+
it under the terms of the GNU General Public License as published by
|
61
|
+
the Free Software Foundation, either version 3 of the License, or
|
62
|
+
(at your option) any later version.
|
63
|
+
|
64
|
+
This program is distributed in the hope that it will be useful,
|
65
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
66
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
67
|
+
GNU General Public License for more details.
|
68
|
+
|
69
|
+
You should have received a copy of the GNU General Public License
|
70
|
+
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
@@ -0,0 +1,43 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Copyright (c) 2014 Red Hat Inc.
|
4
|
+
#
|
5
|
+
# This software is licensed to you under the GNU General Public License,
|
6
|
+
# version 3 (GPLv3). There is NO WARRANTY for this software, express or
|
7
|
+
# implied, including the implied warranties of MERCHANTABILITY or FITNESS
|
8
|
+
# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv3
|
9
|
+
# along with this software; if not, see http://www.gnu.org/licenses/gpl.txt
|
10
|
+
#
|
11
|
+
|
12
|
+
$LOAD_PATH.unshift '/usr/share/foreman-proxy/lib'
|
13
|
+
$LOAD_PATH.unshift '/usr/share/foreman-proxy/modules'
|
14
|
+
|
15
|
+
require 'smart_proxy'
|
16
|
+
require 'foreman-proxy_openscap'
|
17
|
+
require 'foreman-proxy_openscap/openscap_lib'
|
18
|
+
|
19
|
+
# Don't run if OpenSCAP plugin is disabled.
|
20
|
+
exit unless Proxy::OpenSCAP::Plugin.settings.enabled == true
|
21
|
+
|
22
|
+
# TODO: include some jitter to not bring Foreman to its knees
|
23
|
+
|
24
|
+
module Proxy
|
25
|
+
module Log
|
26
|
+
@@logger = ::Logger.new(Proxy::OpenSCAP::Plugin.settings.openscap_send_log_file, 6, 1024*1024*10)
|
27
|
+
@@logger.level = ::Logger.const_get(Proxy::SETTINGS.log_level.upcase)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
include Proxy::Log
|
31
|
+
|
32
|
+
if !Proxy::SETTINGS.foreman_url
|
33
|
+
logger.error "Foreman URL not configured"
|
34
|
+
exit false
|
35
|
+
end
|
36
|
+
|
37
|
+
begin
|
38
|
+
Proxy::OpenSCAP::send_spool_to_foreman
|
39
|
+
rescue StandardError => e
|
40
|
+
logger.debug e.backtrace.join("\n\t")
|
41
|
+
logger.error "Failed to send SCAP results to the Foreman server: #{e}"
|
42
|
+
exit false
|
43
|
+
end
|
@@ -6,7 +6,7 @@
|
|
6
6
|
%global proxy_user foreman-proxy
|
7
7
|
|
8
8
|
Name: rubygem-%{gem_name}
|
9
|
-
Version: 0.0
|
9
|
+
Version: 0.1.0
|
10
10
|
Release: 1%{?dist}
|
11
11
|
Summary: OpenSCAP plug-in for Foreman's smart-proxy.
|
12
12
|
Group: Applications/Internet
|
@@ -15,7 +15,8 @@ URL: http://github.com/openscap/foreman-proxy_openscap
|
|
15
15
|
Source0: https://rubygems.org/gems/%{gem_name}-%{version}.gem
|
16
16
|
#Requires: ruby(release)
|
17
17
|
Requires: ruby(rubygems)
|
18
|
-
Requires: foreman-proxy
|
18
|
+
Requires: foreman-proxy >= 1.7.0-0.develop.201410221520
|
19
|
+
Requires: crontabs
|
19
20
|
#BuildRequires: ruby(release)
|
20
21
|
BuildRequires: rubygems-devel
|
21
22
|
BuildRequires: ruby
|
@@ -46,6 +47,11 @@ cp -a .%{gem_dir}/* \
|
|
46
47
|
mv %{buildroot}%{gem_instdir}/foreman-proxy_openscap.gemspec %{buildroot}/%{gem_spec}
|
47
48
|
rm %{buildroot}%{gem_instdir}/extra/*.spec # this specfile
|
48
49
|
|
50
|
+
# executables
|
51
|
+
mkdir -p %{buildroot}%{_bindir}
|
52
|
+
mv %{buildroot}%{gem_instdir}/bin/* \
|
53
|
+
%{buildroot}%{_bindir}
|
54
|
+
|
49
55
|
# bundler file
|
50
56
|
mkdir -p %{buildroot}%{foreman_proxy_bundlerd_dir}
|
51
57
|
mv %{buildroot}%{gem_instdir}/bundler.d/openscap.rb \
|
@@ -56,6 +62,11 @@ mkdir -p %{buildroot}%{foreman_proxy_pluginconf_dir}
|
|
56
62
|
mv %{buildroot}%{gem_instdir}/settings.d/openscap.yml.example \
|
57
63
|
%{buildroot}%{foreman_proxy_pluginconf_dir}/
|
58
64
|
|
65
|
+
# crontab
|
66
|
+
mkdir -p %{buildroot}%{_sysconfdir}/cron.d/
|
67
|
+
mv %{buildroot}%{gem_instdir}/extra/foreman-proxy-openscap-send.cron \
|
68
|
+
%{buildroot}%{_sysconfdir}/cron.d/%{name}
|
69
|
+
|
59
70
|
# create spool directory
|
60
71
|
mkdir -p %{buildroot}%{spool_dir}
|
61
72
|
|
@@ -67,12 +78,17 @@ mkdir -p %{buildroot}%{spool_dir}
|
|
67
78
|
|
68
79
|
%attr(-,%{proxy_user},%{proxy_user}) %{spool_dir}
|
69
80
|
%{foreman_proxy_bundlerd_dir}/openscap.rb
|
81
|
+
%{_bindir}/foreman-proxy-openscap-send
|
70
82
|
%doc %{foreman_proxy_pluginconf_dir}/openscap.yml.example
|
83
|
+
%config(noreplace) %attr(0644, root, root) %{_sysconfdir}/cron.d/%{name}
|
71
84
|
|
72
85
|
%{gem_docdir}
|
73
86
|
%{gem_instdir}/README.md
|
74
87
|
%{gem_instdir}/COPYING
|
75
88
|
|
76
89
|
%changelog
|
90
|
+
* Fri Oct 24 2014 Šimon Lukašík <slukasik@redhat.com> - 0.1.0-1
|
91
|
+
- rebuilt
|
92
|
+
|
77
93
|
* Fri Jul 18 2014 Šimon Lukašík <slukasik@redhat.com> - 0.0.1-1
|
78
94
|
- Initial package
|
@@ -8,7 +8,6 @@
|
|
8
8
|
# along with this software; if not, see http://www.gnu.org/licenses/gpl.txt
|
9
9
|
#
|
10
10
|
|
11
|
-
require 'digest'
|
12
11
|
require 'foreman-proxy_openscap/openscap_lib'
|
13
12
|
|
14
13
|
module Proxy::OpenSCAP
|
@@ -34,9 +33,7 @@ module Proxy::OpenSCAP
|
|
34
33
|
end
|
35
34
|
|
36
35
|
begin
|
37
|
-
|
38
|
-
target_path = target_dir + filename
|
39
|
-
File.open(target_path,'w') { |f| f.write(request.body.string) }
|
36
|
+
target_path = Proxy::OpenSCAP::store_arf(target_dir, request.body.string)
|
40
37
|
rescue StandardError => e
|
41
38
|
log_halt 500, "Could not store file: #{e.message}"
|
42
39
|
end
|
@@ -8,8 +8,11 @@
|
|
8
8
|
# along with this software; if not, see http://www.gnu.org/licenses/gpl.txt
|
9
9
|
#
|
10
10
|
|
11
|
+
require 'digest'
|
11
12
|
require 'fileutils'
|
13
|
+
require 'json'
|
12
14
|
require 'proxy/error'
|
15
|
+
require 'proxy/request'
|
13
16
|
|
14
17
|
module Proxy::OpenSCAP
|
15
18
|
def self.common_name(request)
|
@@ -40,6 +43,18 @@ module Proxy::OpenSCAP
|
|
40
43
|
dir
|
41
44
|
end
|
42
45
|
|
46
|
+
def self.store_arf(spool_arf_dir, data)
|
47
|
+
filename = Digest::SHA256.hexdigest data
|
48
|
+
target_path = spool_arf_dir + filename
|
49
|
+
File.open(target_path,'w') { |f| f.write(data) }
|
50
|
+
return target_path
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.send_spool_to_foreman
|
54
|
+
arf_dir = File.join(Proxy::OpenSCAP::Plugin.settings.spooldir, "/arf")
|
55
|
+
return unless File.exists? arf_dir
|
56
|
+
ForemanForwarder.new.do arf_dir
|
57
|
+
end
|
43
58
|
|
44
59
|
private
|
45
60
|
def self.validate_policy_name name
|
@@ -55,5 +70,93 @@ module Proxy::OpenSCAP
|
|
55
70
|
raise Proxy::Error::BadRequest, "Malformed date"
|
56
71
|
end
|
57
72
|
end
|
73
|
+
|
74
|
+
class ForemanForwarder < Proxy::HttpRequest::ForemanRequest
|
75
|
+
def do(arf_dir)
|
76
|
+
Dir.foreach(arf_dir) { |cname|
|
77
|
+
cname_dir = File.join(arf_dir, cname)
|
78
|
+
if File.directory? cname_dir and !(cname == '.' || cname == '..')
|
79
|
+
forward_cname_dir(cname, cname_dir)
|
80
|
+
end
|
81
|
+
}
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
def forward_cname_dir(cname, cname_dir)
|
86
|
+
Dir.foreach(cname_dir) { |policy_name|
|
87
|
+
policy_dir = File.join(cname_dir, policy_name)
|
88
|
+
if File.directory? policy_dir and !(policy_name == '.' || policy_name == '..')
|
89
|
+
forward_policy_dir(cname, policy_name, policy_dir)
|
90
|
+
end
|
91
|
+
}
|
92
|
+
remove cname_dir
|
93
|
+
end
|
94
|
+
|
95
|
+
def forward_policy_dir(cname, policy_name, policy_dir)
|
96
|
+
Dir.foreach(policy_dir) { |date|
|
97
|
+
date_dir = File.join(policy_dir, date)
|
98
|
+
if File.directory? date_dir and !(date == '.' || date == '..')
|
99
|
+
forward_date_dir(cname, policy_name, date, date_dir)
|
100
|
+
end
|
101
|
+
}
|
102
|
+
remove policy_dir
|
103
|
+
end
|
104
|
+
|
105
|
+
def forward_date_dir(cname, policy_name, date, date_dir)
|
106
|
+
path = upload_path(cname, policy_name, date)
|
107
|
+
Dir.foreach(date_dir) { |arf|
|
108
|
+
arf_path = File.join(date_dir, arf)
|
109
|
+
if File.file? arf_path and !(arf == '.' || arf == '..')
|
110
|
+
logger.debug("Uploading #{arf} to #{path}")
|
111
|
+
forward_arf_file(path, arf_path)
|
112
|
+
end
|
113
|
+
}
|
114
|
+
remove date_dir
|
115
|
+
end
|
116
|
+
|
117
|
+
def upload_path(cname, policy_name, date)
|
118
|
+
return "/api/v2/openscap/arf_reports/#{cname}/#{policy_name}/#{date}"
|
119
|
+
end
|
120
|
+
|
121
|
+
def forward_arf_file(foreman_api_path, arf_file_path)
|
122
|
+
begin
|
123
|
+
data = File.read(arf_file_path)
|
124
|
+
response = send_request(foreman_api_path, data)
|
125
|
+
response.value
|
126
|
+
raise StandardError, "Received #{response.code}: #{response.message}" unless response.code.to_i == 200
|
127
|
+
res = JSON.parse(response.body)
|
128
|
+
raise StandardError, "Received result: #{res['result']}" unless res['result'] == 'OK'
|
129
|
+
raise StandardError, "Sent bytes: #{data.length}, but foreman received: #{res['received']}" unless data.length == res['received']
|
130
|
+
File.delete arf_file_path
|
131
|
+
rescue StandardError => e
|
132
|
+
logger.debug response.body if response
|
133
|
+
raise e
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def remove(dir)
|
138
|
+
begin
|
139
|
+
Dir.delete dir
|
140
|
+
rescue StandardError => e
|
141
|
+
logger.error "Could not remove directory: #{e.message}"
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
def send_request(path, body)
|
146
|
+
# Override the parent method to set the right headers
|
147
|
+
path = [uri.path, path].join('/') unless uri.path.empty?
|
148
|
+
req = Net::HTTP::Post.new(URI.join(uri.to_s, path).path)
|
149
|
+
# Well, this is unfortunate. We want to have content-type text/xml. We
|
150
|
+
# also need the content-encoding to equal with x-bzip2. However, when
|
151
|
+
# the Foreman's framework sees text/xml, it will rewrite it to application/xml.
|
152
|
+
# What's worse, a framework will try to parse body as an utf8 string,
|
153
|
+
# no matter what content-encoding says. Oh my.
|
154
|
+
# Let's pass content-type arf-bzip2 and move forward.
|
155
|
+
req.content_type = 'application/arf-bzip2'
|
156
|
+
req['Content-Encoding'] = 'x-bzip2'
|
157
|
+
req.body = body
|
158
|
+
http.request(req)
|
159
|
+
end
|
160
|
+
end
|
58
161
|
end
|
59
162
|
|
@@ -17,7 +17,8 @@ module Proxy::OpenSCAP
|
|
17
17
|
http_rackup_path File.expand_path("http_config.ru", File.expand_path("../", __FILE__))
|
18
18
|
https_rackup_path File.expand_path("http_config.ru", File.expand_path("../", __FILE__))
|
19
19
|
|
20
|
-
default_settings :spooldir => '/var/spool/foreman-proxy/openscap'
|
20
|
+
default_settings :spooldir => '/var/spool/foreman-proxy/openscap',
|
21
|
+
:openscap_send_log_file => '/var/log/foreman-proxy/openscap-send.log'
|
21
22
|
end
|
22
23
|
end
|
23
24
|
|
@@ -1,6 +1,9 @@
|
|
1
1
|
---
|
2
2
|
:enabled: true
|
3
3
|
|
4
|
+
# Log file for the forwarding script.
|
5
|
+
#:abrt_send_log_file: /var/log/foreman-proxy/openscap-send.log
|
6
|
+
|
4
7
|
# Directory where OpenSCAP audits are stored
|
5
8
|
# before they are forwarded to Foreman
|
6
9
|
#:spooldir: /var/spool/foreman-proxy/openscap
|
metadata
CHANGED
@@ -1,26 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreman-proxy_openscap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.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: 2014-
|
11
|
+
date: 2014-10-24 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |-
|
14
14
|
A plug-in to the Foreman's smart-proxy which receives
|
15
15
|
bzip2ed ARF files and forwards them to the Foreman.
|
16
16
|
email: slukasik@redhat.com
|
17
|
-
executables:
|
17
|
+
executables:
|
18
|
+
- foreman-proxy-openscap-send
|
18
19
|
extensions: []
|
19
20
|
extra_rdoc_files: []
|
20
21
|
files:
|
21
22
|
- COPYING
|
22
23
|
- README.md
|
24
|
+
- bin/foreman-proxy-openscap-send
|
23
25
|
- bundler.d/openscap.rb
|
26
|
+
- extra/foreman-proxy-openscap-send.cron
|
24
27
|
- extra/rubygem-foreman-proxy_openscap.spec
|
25
28
|
- foreman-proxy_openscap.gemspec
|
26
29
|
- lib/foreman-proxy_openscap.rb
|