smart_proxy_openscap 0.6.5 → 0.6.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/bin/smart-proxy-arf-html +7 -0
  3. data/bin/{smart-proxy-parse-arf → smart-proxy-arf-json} +2 -2
  4. data/bin/smart-proxy-policy-guide +7 -0
  5. data/bin/smart-proxy-scap-profiles +7 -0
  6. data/bin/smart-proxy-scap-validation +7 -0
  7. data/lib/smart_proxy_openscap/arf_html.rb +21 -0
  8. data/lib/smart_proxy_openscap/arf_json.rb +111 -0
  9. data/lib/smart_proxy_openscap/arf_parser.rb +17 -93
  10. data/lib/smart_proxy_openscap/content_parser.rb +30 -0
  11. data/lib/smart_proxy_openscap/foreman_forwarder.rb +1 -2
  12. data/lib/smart_proxy_openscap/openscap_api.rb +8 -19
  13. data/lib/smart_proxy_openscap/openscap_html_generator.rb +38 -0
  14. data/lib/smart_proxy_openscap/openscap_lib.rb +5 -3
  15. data/lib/smart_proxy_openscap/openscap_plugin.rb +0 -6
  16. data/lib/smart_proxy_openscap/policy_guide.rb +23 -0
  17. data/lib/smart_proxy_openscap/policy_parser.rb +33 -0
  18. data/lib/smart_proxy_openscap/profiles_parser.rb +32 -0
  19. data/lib/smart_proxy_openscap/scap_profiles.rb +49 -0
  20. data/lib/smart_proxy_openscap/scap_validation.rb +34 -0
  21. data/lib/smart_proxy_openscap/shell_wrapper.rb +77 -0
  22. data/lib/smart_proxy_openscap/spool_forwarder.rb +1 -1
  23. data/lib/smart_proxy_openscap/storage.rb +0 -2
  24. data/lib/smart_proxy_openscap/storage_fs.rb +11 -16
  25. data/lib/smart_proxy_openscap/version.rb +1 -1
  26. data/test/get_report_xml_html_test.rb +0 -2
  27. data/test/scap_content_parser_api_test.rb +1 -1
  28. data/test/script_class_test.rb +94 -0
  29. data/test/test_helper.rb +1 -0
  30. metadata +20 -10
  31. data/lib/smart_proxy_openscap/openscap_content_parser.rb +0 -77
  32. data/lib/smart_proxy_openscap/openscap_initializer.rb +0 -21
  33. data/lib/smart_proxy_openscap/openscap_report_parser.rb +0 -48
  34. data/lib/smart_proxy_openscap/plugin_configuration.rb +0 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e666336bf02a0dc32630813e523d0af008006603
4
- data.tar.gz: e5fbd577be166d0b2ca4d79841c7753a7b958577
3
+ metadata.gz: 29317c06a0e14367b00b34438becb736c48a3963
4
+ data.tar.gz: 43c1ab223379188365b5d2c739fbc4a8f047dfc2
5
5
  SHA512:
6
- metadata.gz: 76bfca9428e45706fcd289da3dabea7c145c540a1a58bcce5a9ecdd016cabaf4192b1b563035cf142deeb97f5058b69b0e332bbbdfb28d7cda8b746dbd6b8b04
7
- data.tar.gz: 021058331dd2a2ebd832e0ea59c58021cfa8a22fc3b36265ae5743a7d8a7478ed6793d614e0033d4374d6a601d14a57e91779bbec4dc59cc071cb6e60f94e441
6
+ metadata.gz: 3951f55a4c38a11d354d8e31d3b2e8d400923893238bd312bf272c4cd39df1caad03206ebbcd41edd625358be8cad1added830238899304045e0e546f0edac02
7
+ data.tar.gz: 4063007b806d2f811f8ca556fedb7450a78468b40f8e02968a0779fe0055005f4ce8690982daee8c0665f51e78cb24804b30ebf71b2d97c784451f71d1f4d9f1
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ path = File.join(File.dirname(File.expand_path(__FILE__)), '..', 'lib')
3
+ $:.unshift(path) if File.exist? path
4
+
5
+ require 'smart_proxy_openscap/arf_html'
6
+
7
+ Proxy::OpenSCAP::ArfHtml.new.generate_html ARGV[0], ARGV[1]
@@ -2,6 +2,6 @@
2
2
  path = File.join(File.dirname(File.expand_path(__FILE__)), '..', 'lib')
3
3
  $:.unshift(path) if File.exist? path
4
4
 
5
- require 'smart_proxy_openscap/arf_parser'
5
+ require 'smart_proxy_openscap/arf_json'
6
6
 
7
- Proxy::OpenSCAP::ArfParser.new.parse ARGV[0], ARGV[1]
7
+ Proxy::OpenSCAP::ArfJson.new.as_json ARGV[0], ARGV[1]
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ path = File.join(File.dirname(File.expand_path(__FILE__)), '..', 'lib')
3
+ $:.unshift(path) if File.exist? path
4
+
5
+ require 'smart_proxy_openscap/policy_guide'
6
+
7
+ Proxy::OpenSCAP::PolicyGuide.new.generate_guide *ARGV
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ path = File.join(File.dirname(File.expand_path(__FILE__)), '..', 'lib')
3
+ $:.unshift(path) if File.exist? path
4
+
5
+ require 'smart_proxy_openscap/scap_profiles'
6
+
7
+ Proxy::OpenSCAP::ScapProfiles.new.profiles ARGV[0], ARGV[1], ARGV[2]
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ path = File.join(File.dirname(File.expand_path(__FILE__)), '..', 'lib')
3
+ $:.unshift(path) if File.exist? path
4
+
5
+ require 'smart_proxy_openscap/scap_validation'
6
+
7
+ Proxy::OpenSCAP::ScapValidation.new.validate ARGV[0], ARGV[1], ARGV[2]
@@ -0,0 +1,21 @@
1
+ require 'openscap'
2
+ require 'openscap/ds/arf'
3
+
4
+ module Proxy
5
+ module OpenSCAP
6
+ class ArfHtml
7
+ def generate_html(file_in, file_out)
8
+ ::OpenSCAP.oscap_init
9
+ File.write file_out, get_arf_html(file_in)
10
+ ::OpenSCAP.oscap_cleanup
11
+ end
12
+
13
+ def get_arf_html(file_in)
14
+ arf_object = ::OpenSCAP::DS::Arf.new(file_in)
15
+ # @TODO: Drop this when support for 1.8.7 ends
16
+ return arf_object.html if RUBY_VERSION.start_with? '1.8'
17
+ arf_object.html.force_encoding('UTF-8')
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,111 @@
1
+ # encoding=utf-8
2
+ require 'openscap'
3
+ require 'openscap/ds/arf'
4
+ require 'openscap/xccdf/testresult'
5
+ require 'openscap/xccdf/ruleresult'
6
+ require 'openscap/xccdf/rule'
7
+ require 'openscap/xccdf/fix'
8
+ require 'openscap/xccdf/benchmark'
9
+ require 'json'
10
+ require 'digest'
11
+
12
+ module Proxy
13
+ module OpenSCAP
14
+ class ArfJson
15
+ def as_json(file_in, file_out)
16
+ ::OpenSCAP.oscap_init
17
+ arf_digest = Digest::SHA256.hexdigest(File.read(file_in))
18
+
19
+ arf = ::OpenSCAP::DS::Arf.new(file_in)
20
+ test_result = arf.test_result
21
+
22
+ results = test_result.rr
23
+ sds = arf.report_request
24
+ bench_source = sds.select_checklist!
25
+ benchmark = ::OpenSCAP::Xccdf::Benchmark.new(bench_source)
26
+ items = benchmark.items
27
+
28
+ report = parse_results(items, results, arf_digest)
29
+ File.write file_out, report.to_json
30
+ ensure
31
+ cleanup test_result, benchmark, sds, arf
32
+ end
33
+
34
+ private
35
+
36
+ def parse_results(items, results, arf_digest)
37
+ report = {}
38
+ report[:logs] = []
39
+ passed = 0
40
+ failed = 0
41
+ othered = 0
42
+ results.each do |rr_id, result|
43
+ next if result.result == 'notapplicable' || result.result == 'notselected'
44
+ # get rules and their results
45
+ rule_data = items[rr_id]
46
+ report[:logs] << populate_result_data(rr_id, result.result, rule_data)
47
+ # create metrics for the results
48
+ case result.result
49
+ when 'pass', 'fixed'
50
+ passed += 1
51
+ when 'fail'
52
+ failed += 1
53
+ else
54
+ othered += 1
55
+ end
56
+ end
57
+ report[:digest] = arf_digest
58
+ report[:metrics] = { :passed => passed, :failed => failed, :othered => othered }
59
+ report
60
+ end
61
+
62
+ def populate_result_data(result_id, rule_result, rule_data)
63
+ log = {}
64
+ log[:source] = ascii8bit_to_utf8(result_id)
65
+ log[:result] = ascii8bit_to_utf8(rule_result)
66
+ log[:title] = ascii8bit_to_utf8(rule_data.title)
67
+ log[:description] = ascii8bit_to_utf8(rule_data.description)
68
+ log[:rationale] = ascii8bit_to_utf8(rule_data.rationale)
69
+ log[:references] = hash_a8b(rule_data.references.map(&:to_hash))
70
+ log[:fixes] = hash_a8b(rule_data.fixes.map(&:to_hash))
71
+ log[:severity] = ascii8bit_to_utf8(rule_data.severity)
72
+ log
73
+ end
74
+
75
+ def cleanup(*args)
76
+ args.compact.map(&:destroy)
77
+ ::OpenSCAP.oscap_cleanup
78
+ end
79
+
80
+ # Unfortunately openscap in ruby 1.9.3 outputs data in Ascii-8bit.
81
+ # We transform it to UTF-8 for easier json integration.
82
+
83
+ # :invalid ::
84
+ # If the value is invalid, #encode replaces invalid byte sequences in
85
+ # +str+ with the replacement character. The default is to raise the
86
+ # Encoding::InvalidByteSequenceError exception
87
+ # :undef ::
88
+ # If the value is undefined, #encode replaces characters which are
89
+ # undefined in the destination encoding with the replacement character.
90
+ # The default is to raise the Encoding::UndefinedConversionError.
91
+ # :replace ::
92
+ # Sets the replacement string to the given value. The default replacement
93
+ # string is "\uFFFD" for Unicode encoding forms, and "?" otherwise.
94
+ def ascii8bit_to_utf8(string)
95
+ return ascii8bit_to_utf8_legacy(string) if RUBY_VERSION.start_with? '1.8'
96
+ string.to_s.encode('utf-8', :invalid => :replace, :undef => :replace, :replace => '_')
97
+ end
98
+
99
+ # String#encode appeared first in 1.9, so we need a workaround for 1.8
100
+ def ascii8bit_to_utf8_legacy(string)
101
+ Iconv.conv('UTF-8//IGNORE', 'UTF-8', string.to_s)
102
+ end
103
+
104
+ def hash_a8b(ary)
105
+ ary.map do |hash|
106
+ Hash[hash.map { |key, value| [ascii8bit_to_utf8(key), ascii8bit_to_utf8(value)] }]
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -1,110 +1,34 @@
1
- # encoding=utf-8
2
- require 'openscap'
3
- require 'openscap/ds/arf'
4
- require 'openscap/xccdf/testresult'
5
- require 'openscap/xccdf/ruleresult'
6
- require 'openscap/xccdf/rule'
7
- require 'openscap/xccdf/fix'
8
- require 'openscap/xccdf/benchmark'
9
- require 'json'
10
- require 'digest'
1
+ require 'smart_proxy_openscap/shell_wrapper'
11
2
 
12
3
  module Proxy
13
4
  module OpenSCAP
14
- class ArfParser
15
- def parse(file_in, file_out)
16
- ::OpenSCAP.oscap_init
17
- arf_digest = Digest::SHA256.hexdigest(File.read(file_in))
5
+ class ArfParser < ShellWrapper
18
6
 
19
- arf = ::OpenSCAP::DS::Arf.new(file_in)
20
- test_result = arf.test_result
21
-
22
- results = test_result.rr
23
- sds = arf.report_request
24
- bench_source = sds.select_checklist!
25
- benchmark = ::OpenSCAP::Xccdf::Benchmark.new(bench_source)
26
- items = benchmark.items
27
-
28
- report = parse_results(items, results, arf_digest)
29
- File.write file_out, report.to_json
30
- ensure
31
- cleanup test_result, benchmark, sds, arf
32
- end
33
-
34
- private
35
-
36
- def parse_results(items, results, arf_digest)
37
- report = {}
38
- report[:logs] = []
39
- passed = 0
40
- failed = 0
41
- othered = 0
42
- results.each do |rr_id, result|
43
- next if result.result == 'notapplicable' || result.result == 'notselected'
44
- # get rules and their results
45
- rule_data = items[rr_id]
46
- report[:logs] << populate_result_data(rr_id, result.result, rule_data)
47
- # create metrics for the results
48
- case result.result
49
- when 'pass', 'fixed'
50
- passed += 1
51
- when 'fail'
52
- failed += 1
53
- else
54
- othered += 1
55
- end
56
- end
57
- report[:digest] = arf_digest
58
- report[:metrics] = { :passed => passed, :failed => failed, :othered => othered }
59
- report
7
+ def initialize(cname, policy_id, date)
8
+ @cname = cname
9
+ @policy_id = policy_id
10
+ @date = date
11
+ @script_name = 'smart-proxy-arf-json'
60
12
  end
61
13
 
62
- def populate_result_data(result_id, rule_result, rule_data)
63
- log = {}
64
- log[:source] = ascii8bit_to_utf8(result_id)
65
- log[:result] = ascii8bit_to_utf8(rule_result)
66
- log[:title] = ascii8bit_to_utf8(rule_data.title)
67
- log[:description] = ascii8bit_to_utf8(rule_data.description)
68
- log[:rationale] = ascii8bit_to_utf8(rule_data.rationale)
69
- log[:references] = hash_a8b(rule_data.references.map(&:to_hash))
70
- log[:fixes] = hash_a8b(rule_data.fixes.map(&:to_hash))
71
- log[:severity] = ascii8bit_to_utf8(rule_data.severity)
72
- log
14
+ def as_json(arf_data)
15
+ execute_shell_command arf_data
73
16
  end
74
17
 
75
- def cleanup(*args)
76
- args.compact.map(&:destroy)
77
- ::OpenSCAP.oscap_cleanup
18
+ def in_filename
19
+ "#{super}-#{@cname}-#{@policy_id}-#{@date}-"
78
20
  end
79
21
 
80
- # Unfortunately openscap in ruby 1.9.3 outputs data in Ascii-8bit.
81
- # We transform it to UTF-8 for easier json integration.
82
-
83
- # :invalid ::
84
- # If the value is invalid, #encode replaces invalid byte sequences in
85
- # +str+ with the replacement character. The default is to raise the
86
- # Encoding::InvalidByteSequenceError exception
87
- # :undef ::
88
- # If the value is undefined, #encode replaces characters which are
89
- # undefined in the destination encoding with the replacement character.
90
- # The default is to raise the Encoding::UndefinedConversionError.
91
- # :replace ::
92
- # Sets the replacement string to the given value. The default replacement
93
- # string is "\uFFFD" for Unicode encoding forms, and "?" otherwise.
94
- def ascii8bit_to_utf8(string)
95
- return ascii8bit_to_utf8_legacy(string) if RUBY_VERSION.start_with? '1.8'
96
- string.to_s.encode('utf-8', :invalid => :replace, :undef => :replace, :replace => '_')
22
+ def out_filename
23
+ "#{in_filename}json-"
97
24
  end
98
25
 
99
- # String#encode appeared first in 1.9, so we need a workaround for 1.8
100
- def ascii8bit_to_utf8_legacy(string)
101
- Iconv.conv('UTF-8//IGNORE', 'UTF-8', string.to_s)
26
+ def failure_message
27
+ "Failure when running script which parses reports"
102
28
  end
103
29
 
104
- def hash_a8b(ary)
105
- ary.map do |hash|
106
- Hash[hash.map { |key, value| [ascii8bit_to_utf8(key), ascii8bit_to_utf8(value)] }]
107
- end
30
+ def command(in_file, out_file)
31
+ "#{script_location} #{in_file.path} #{out_file.path}"
108
32
  end
109
33
  end
110
34
  end
@@ -0,0 +1,30 @@
1
+ require 'smart_proxy_openscap/shell_wrapper'
2
+
3
+ module Proxy::OpenSCAP
4
+ class ContentParser < ShellWrapper
5
+ def initialize(type)
6
+ @type = type
7
+ @script_name = 'smart-proxy-scap-validation'
8
+ end
9
+
10
+ def validate(scap_file)
11
+ execute_shell_command scap_file
12
+ end
13
+
14
+ def out_filename
15
+ "#{in_filename}json-"
16
+ end
17
+
18
+ def in_filename
19
+ "#{super}-#{@type}-validate-"
20
+ end
21
+
22
+ def failure_message
23
+ "Failure when running script which validates scap files"
24
+ end
25
+
26
+ def command(in_file, out_file)
27
+ "#{script_location} #{in_file.path} #{out_file.path} #{@type}"
28
+ end
29
+ end
30
+ end
@@ -5,8 +5,7 @@ module Proxy::OpenSCAP
5
5
  def post_arf_report(cname, policy_id, date, data)
6
6
  begin
7
7
  foreman_api_path = upload_path(cname, policy_id, date)
8
- json = Proxy::OpenSCAP::Parse.new(cname, policy_id, date).as_json(data)
9
- raise OpenSCAP::OpenSCAPError, "Failed to parse report" if json.nil? || json.empty?
8
+ json = Proxy::OpenSCAP::ArfParser.new(cname, policy_id, date).as_json(data)
10
9
  response = send_request(foreman_api_path, json)
11
10
  # Raise an HTTP error if the response is not 2xx (success).
12
11
  response.value
@@ -42,7 +42,7 @@ module Proxy::OpenSCAP
42
42
  Proxy::OpenSCAP::StorageFS.new(Proxy::OpenSCAP::Plugin.settings.failed_dir, cn, post_to_foreman['id'], date).store_failed(request.body.string)
43
43
  logger.error "Failed to save Report in reports directory (#{Proxy::OpenSCAP::Plugin.settings.reportsdir}). Failed with: #{e.message}.
44
44
  Saving file in #{Proxy::OpenSCAP::Plugin.settings.failed_dir}. Please copy manually to #{Proxy::OpenSCAP::Plugin.settings.reportsdir}"
45
- rescue OpenSCAP::OpenSCAPError => e
45
+ rescue Proxy::OpenSCAP::OpenSCAPException => e
46
46
  logger.error "Failed to parse Arf Report, moving to #{Proxy::OpenSCAP::Plugin.settings.corrupted_dir}"
47
47
  Proxy::OpenSCAP::StorageFS.new(Proxy::OpenSCAP::Plugin.settings.corrupted_dir, cn, policy, date).store_corrupted(request.body.string)
48
48
  rescue *HTTP_ERRORS => e
@@ -73,9 +73,11 @@ module Proxy::OpenSCAP
73
73
 
74
74
  get "/arf/:id/:cname/:date/:digest/html" do
75
75
  begin
76
- Proxy::OpenSCAP::StorageFS.new(Proxy::OpenSCAP::Plugin.settings.reportsdir, params[:cname], params[:id], params[:date]).get_arf_html(params[:digest])
76
+ Proxy::OpenSCAP::OpenscapHtmlGenerator.new(params[:cname], params[:id], params[:date], params[:digest]).get_html
77
77
  rescue FileNotFound => e
78
78
  log_halt 500, "Could not find requested file, #{e.message}"
79
+ rescue OpenSCAPException => e
80
+ log_halt 500, "Could not generate report in HTML"
79
81
  end
80
82
  end
81
83
 
@@ -114,28 +116,22 @@ module Proxy::OpenSCAP
114
116
  end
115
117
 
116
118
  post "/scap_content/policies" do
117
- content_parser = create_content_parser
118
119
  begin
119
- content_parser.extract_policies
120
+ Proxy::OpenSCAP::ProfilesParser.new('scap_content').profiles(request.body.string)
120
121
  rescue *HTTP_ERRORS => e
121
122
  log_halt 500, e.message
122
123
  rescue StandardError => e
123
124
  log_halt 500, "Error occurred: #{e.message}"
124
- ensure
125
- content_parser.cleanup
126
125
  end
127
126
  end
128
127
 
129
128
  post "/tailoring_file/profiles" do
130
- content_parser = create_content_parser
131
129
  begin
132
- content_parser.get_profiles
130
+ Proxy::OpenSCAP::ProfilesParser.new('tailoring_file').profiles(request.body.string)
133
131
  rescue *HTTP_ERRORS => e
134
132
  log_halt 500, e.message
135
133
  rescue StandardError => e
136
134
  log_halt 500, "Error occurred: #{e.message}"
137
- ensure
138
- content_parser.cleanup
139
135
  end
140
136
  end
141
137
 
@@ -150,15 +146,12 @@ module Proxy::OpenSCAP
150
146
  end
151
147
 
152
148
  post "/scap_content/guide/:policy" do
153
- content_parser = create_content_parser
154
149
  begin
155
- content_parser.guide(params[:policy])
150
+ Proxy::OpenSCAP::PolicyParser.new(params[:policy]).guide(request.body.string)
156
151
  rescue *HTTP_ERRORS => e
157
152
  log_halt 500, e.message
158
153
  rescue StandardError => e
159
154
  log_halt 500, "Error occurred: #{e.message}"
160
- ensure
161
- content_parser.cleanup
162
155
  end
163
156
  end
164
157
 
@@ -166,16 +159,12 @@ module Proxy::OpenSCAP
166
159
 
167
160
  def validate_scap_file(params)
168
161
  begin
169
- Proxy::OpenSCAP::ContentParser.new(request.body.string, params[:type]).validate
162
+ Proxy::OpenSCAP::ContentParser.new(params[:type]).validate(request.body.string)
170
163
  rescue *HTTP_ERRORS => e
171
164
  log_halt 500, e.message
172
165
  rescue StandardError => e
173
166
  log_halt 500, "Error occurred: #{e.message}"
174
167
  end
175
168
  end
176
-
177
- def create_content_parser
178
- Proxy::OpenSCAP::ContentParser.new(request.body.string)
179
- end
180
169
  end
181
170
  end
@@ -0,0 +1,38 @@
1
+ require 'smart_proxy_openscap/storage_fs'
2
+ require 'smart_proxy_openscap/shell_wrapper'
3
+
4
+ module Proxy
5
+ module OpenSCAP
6
+ class OpenscapHtmlGenerator < ShellWrapper
7
+ def initialize(cname, id, date, digest)
8
+ @cname = cname
9
+ @id = id
10
+ @date = date
11
+ @digest = digest
12
+ @script_name = 'smart-proxy-arf-html'
13
+ end
14
+
15
+ def get_html
16
+ execute_shell_command
17
+ end
18
+
19
+ def out_filename
20
+ "#{super}-#{@cname}-#{@id}-#{@date}-#{@digest}-"
21
+ end
22
+
23
+ def command(in_file, out_file)
24
+ "#{script_location} #{file_path_in_storage} #{out_file.path}"
25
+ end
26
+
27
+ def failure_message
28
+ "Failure when running script which generates html reports"
29
+ end
30
+
31
+ def file_path_in_storage
32
+ path_to_dir = Proxy::OpenSCAP::Plugin.settings.reportsdir
33
+ storage = Proxy::OpenSCAP::StorageFS.new(path_to_dir, @cname, @id, @date)
34
+ storage.get_path(@digest)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -16,12 +16,14 @@ require 'proxy/error'
16
16
  require 'proxy/request'
17
17
  require 'smart_proxy_openscap/fetch_scap_content'
18
18
  require 'smart_proxy_openscap/foreman_forwarder'
19
- require 'smart_proxy_openscap/openscap_content_parser'
19
+ require 'smart_proxy_openscap/content_parser'
20
20
  require 'smart_proxy_openscap/openscap_exception'
21
- require 'smart_proxy_openscap/openscap_report_parser'
21
+ require 'smart_proxy_openscap/arf_parser'
22
22
  require 'smart_proxy_openscap/spool_forwarder'
23
- require 'smart_proxy_openscap/storage_fs'
23
+ require 'smart_proxy_openscap/openscap_html_generator'
24
24
  require 'smart_proxy_openscap/fetch_tailoring_file'
25
+ require 'smart_proxy_openscap/policy_parser'
26
+ require 'smart_proxy_openscap/profiles_parser'
25
27
 
26
28
  module Proxy::OpenSCAP
27
29
  extend ::Proxy::Log
@@ -9,7 +9,6 @@
9
9
  #
10
10
 
11
11
  require 'smart_proxy_openscap/version'
12
- require 'smart_proxy_openscap/plugin_configuration'
13
12
 
14
13
  module Proxy::OpenSCAP
15
14
  class Plugin < ::Proxy::Plugin
@@ -24,10 +23,5 @@ module Proxy::OpenSCAP
24
23
  :reportsdir => File.join(APP_ROOT, 'openscap/reports'),
25
24
  :failed_dir => File.join(APP_ROOT, 'openscap/failed'),
26
25
  :tailoring_dir => File.join(APP_ROOT, 'openscap/tailoring')
27
-
28
- load_classes ::Proxy::OpenSCAP::PluginConfiguration
29
- load_dependency_injection_wirings ::Proxy::OpenSCAP::PluginConfiguration
30
-
31
- start_services :openscap_initializer
32
26
  end
33
27
  end
@@ -0,0 +1,23 @@
1
+ require 'openscap'
2
+ require 'openscap/source'
3
+ require 'openscap/ds/sds'
4
+ require 'json'
5
+
6
+ module Proxy
7
+ module OpenSCAP
8
+ class PolicyGuide
9
+ def generate_guide(in_file, out_file, policy)
10
+ ::OpenSCAP.oscap_init
11
+ source = ::OpenSCAP::Source.new in_file
12
+ sds = ::OpenSCAP::DS::Sds.new source
13
+ sds.select_checklist
14
+ profile_id = policy ? nil : policy
15
+ html = sds.html_guide profile_id
16
+ File.write(out_file, { :html => html.force_encoding('UTF-8') }.to_json)
17
+ sds.destroy
18
+ source.destroy
19
+ ::OpenSCAP.oscap_cleanup
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,33 @@
1
+ require 'smart_proxy_openscap/shell_wrapper'
2
+
3
+ module Proxy
4
+ module OpenSCAP
5
+ class PolicyParser < ShellWrapper
6
+
7
+ def initialize(policy)
8
+ @script_name = "smart-proxy-policy-guide"
9
+ @policy = policy
10
+ end
11
+
12
+ def guide(scap_file)
13
+ execute_shell_command scap_file
14
+ end
15
+
16
+ def in_filename
17
+ super
18
+ end
19
+
20
+ def out_filename
21
+ "#{in_filename}json-"
22
+ end
23
+
24
+ def failure_message
25
+ "Failure when running script which renders policy guide"
26
+ end
27
+
28
+ def command(in_file, out_file)
29
+ "#{script_location} #{in_file.path} #{out_file.path} #{@policy}"
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,32 @@
1
+ require 'smart_proxy_openscap/shell_wrapper'
2
+
3
+ module Proxy
4
+ module OpenSCAP
5
+ class ProfilesParser < ShellWrapper
6
+ def initialize(type)
7
+ @type = type
8
+ @script_name = 'smart-proxy-scap-profiles'
9
+ end
10
+
11
+ def profiles(scap_file)
12
+ execute_shell_command scap_file
13
+ end
14
+
15
+ def out_filename
16
+ "#{in_filename}json-"
17
+ end
18
+
19
+ def in_filename
20
+ "#{super}-#{@type}-profiles-"
21
+ end
22
+
23
+ def failure_message
24
+ "Failure when running script which extracts profiles from scap file"
25
+ end
26
+
27
+ def command(in_file, out_file)
28
+ "#{script_location} #{in_file.path} #{out_file.path} #{@type}"
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,49 @@
1
+ require 'openscap'
2
+ require 'openscap/ds/sds'
3
+ require 'openscap/source'
4
+ require 'openscap/xccdf/benchmark'
5
+ require 'openscap/xccdf/tailoring'
6
+ require 'json'
7
+
8
+ module Proxy
9
+ module OpenSCAP
10
+ class ScapProfiles
11
+ def profiles(in_file, out_file, type)
12
+ ::OpenSCAP.oscap_init
13
+ source = ::OpenSCAP::Source.new(in_file)
14
+ json = type == 'scap_content' ? scap_content_profiles(source) : tailoring_profiles(source)
15
+ File.write out_file, json
16
+ source.destroy
17
+ ::OpenSCAP.oscap_cleanup
18
+ end
19
+
20
+ def scap_content_profiles(source)
21
+ bench = benchmark_profiles source
22
+ profiles = collect_profiles bench
23
+ bench.destroy
24
+ profiles.to_json
25
+ end
26
+
27
+ def tailoring_profiles(source)
28
+ tailoring = ::OpenSCAP::Xccdf::Tailoring.new(source, nil)
29
+ profiles = collect_profiles tailoring
30
+ tailoring.destroy
31
+ profiles.to_json
32
+ end
33
+
34
+ def collect_profiles(profile_source)
35
+ profile_source.profiles.inject({}) do |memo, (key, profile)|
36
+ memo.tap { |hash| hash[key] = profile.title.strip }
37
+ end
38
+ end
39
+
40
+ def benchmark_profiles(source)
41
+ sds = ::OpenSCAP::DS::Sds.new(source)
42
+ bench_source = sds.select_checklist!
43
+ benchmark = ::OpenSCAP::Xccdf::Benchmark.new(bench_source)
44
+ sds.destroy
45
+ benchmark
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,34 @@
1
+ require 'json'
2
+ require 'openscap'
3
+ require 'openscap/source'
4
+
5
+ module Proxy
6
+ module OpenSCAP
7
+ class ScapValidation
8
+ def allowed_types
9
+ {
10
+ 'tailoring_file' => 'XCCDF Tailoring',
11
+ 'scap_content' => 'SCAP Source Datastream'
12
+ }
13
+ end
14
+
15
+ def validate(in_file, out_file, type)
16
+ errors = []
17
+ ::OpenSCAP.oscap_init
18
+ source = ::OpenSCAP::Source.new(in_file)
19
+ if source.type != allowed_types[type]
20
+ errors << "Uploaded file is #{source.type}, unexpected file type"
21
+ end
22
+
23
+ begin
24
+ source.validate!
25
+ rescue ::OpenSCAP::OpenSCAPError
26
+ errors << "Invalid SCAP file type"
27
+ end
28
+ File.write out_file, { :errors => errors }.to_json
29
+ source.destroy
30
+ ::OpenSCAP.oscap_cleanup
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,77 @@
1
+ require 'tempfile'
2
+
3
+ module Proxy
4
+ module OpenSCAP
5
+ class ShellWrapper
6
+ include ::Proxy::Log
7
+
8
+ attr_reader :script_name
9
+
10
+ def script_location
11
+ raise NotImplementedError, 'Must have @script_name' unless script_name
12
+ path = File.join(File.dirname(File.expand_path(__FILE__)), '../../bin', script_name)
13
+ return path if File.exist? path
14
+ script_name
15
+ end
16
+
17
+ def execute_shell_command(in_file_content = nil)
18
+ out_file = Tempfile.new(out_filename, "/var/tmp")
19
+ in_file = prepare_in_file in_file_content
20
+ comm = command(in_file, out_file)
21
+ logger.debug "Executing: #{comm}"
22
+ output = nil
23
+ begin
24
+ `#{comm}`
25
+ output = out_file.read
26
+ rescue => e
27
+ logger.debug failure_message
28
+ logger.debug e.message
29
+ logger.debug e.backtrace.join("\n\t")
30
+ ensure
31
+ close_unlink out_file, in_file
32
+ end
33
+ raise OpenSCAPException, exception_message if output.nil? || output.empty?
34
+ output
35
+ end
36
+
37
+ def close_unlink(*files)
38
+ files.compact.each do |file|
39
+ file.close
40
+ file.unlink
41
+ end
42
+ end
43
+
44
+ def prepare_in_file(in_file_content)
45
+ return unless in_file_content
46
+ file = Tempfile.new(in_filename, "/var/tmp")
47
+ file.write in_file_content
48
+ file.rewind
49
+ file
50
+ end
51
+
52
+ def in_filename
53
+ @in_filename ||= unique_filename
54
+ end
55
+
56
+ def out_filename
57
+ @out_filename ||= unique_filename
58
+ end
59
+
60
+ def unique_filename
61
+ SecureRandom.uuid
62
+ end
63
+
64
+ def command(in_file, out_file)
65
+ raise NotImplementedError, "Must be implemented"
66
+ end
67
+
68
+ def failure_message
69
+ raise NotImplementedError, "Must be implemented"
70
+ end
71
+
72
+ def exception_message
73
+ failure_message
74
+ end
75
+ end
76
+ end
77
+ end
@@ -51,7 +51,7 @@ module Proxy::OpenSCAP
51
51
  post_to_foreman = ForemanForwarder.new.post_arf_report(cname, policy_id, date, data)
52
52
  Proxy::OpenSCAP::StorageFS.new(Proxy::OpenSCAP::Plugin.settings.reportsdir, cname, post_to_foreman['id'], date).store_archive(data)
53
53
  File.delete arf_file_path
54
- rescue OpenSCAP::OpenSCAPError => e
54
+ rescue Proxy::OpenSCAP::OpenSCAPException => e
55
55
  logger.error "Failed to parse Arf Report at #{arf_file_path}, moving to #{Proxy::OpenSCAP::Plugin.settings.corrupted_dir}"
56
56
 
57
57
  Proxy::OpenSCAP::StorageFS.new(Proxy::OpenSCAP::Plugin.settings.corrupted_dir, cname, policy_id, date).
@@ -1,6 +1,4 @@
1
1
  require 'smart_proxy_openscap/openscap_exception'
2
- require 'openscap'
3
- require 'openscap/ds/arf'
4
2
 
5
3
  module Proxy::OpenSCAP
6
4
  class Storage
@@ -27,15 +27,6 @@ module Proxy::OpenSCAP
27
27
  get_arf_file(digest)[:xml]
28
28
  end
29
29
 
30
- def get_arf_html(digest)
31
- xml = get_arf_file(digest)[:xml]
32
- size = get_arf_file(digest)[:size]
33
- arf_object = OpenSCAP::DS::Arf.new(:content => xml, :path => 'arf.xml.bz2', :length => size)
34
- # @TODO: Drop this when support for 1.8.7 ends
35
- return arf_object.html if RUBY_VERSION.start_with? '1.8'
36
- arf_object.html.force_encoding('UTF-8')
37
- end
38
-
39
30
  def delete_arf_file
40
31
  path = "#{@path_to_dir}/#{@namespace}/#{@cname}/#{@id}"
41
32
  raise FileNotFound, "Can't find path #{path}" if !File.directory?(path) || File.zero?(path)
@@ -43,6 +34,17 @@ module Proxy::OpenSCAP
43
34
  {:id => @id, :deleted => true}.to_json
44
35
  end
45
36
 
37
+ def get_arf_file(digest)
38
+ file = File.open(get_path digest)
39
+ { :size => File.size(file), :xml => file.read }
40
+ end
41
+
42
+ def get_path(digest)
43
+ full_path = @path + digest
44
+ raise FileNotFound, "Can't find path #{full_path}" if !File.file?(full_path) || File.zero?(full_path)
45
+ full_path
46
+ end
47
+
46
48
  private
47
49
 
48
50
  def store_arf(spool_arf_dir, data)
@@ -86,12 +88,5 @@ module Proxy::OpenSCAP
86
88
 
87
89
  logger.debug "File #{target_path} stored in reports dir."
88
90
  end
89
-
90
- def get_arf_file(digest)
91
- full_path = @path + digest
92
- raise FileNotFound, "Can't find path #{full_path}" if !File.file?(full_path) || File.zero?(full_path)
93
- file = File.open(full_path)
94
- { :size => File.size(file), :xml => file.read }
95
- end
96
91
  end
97
92
  end
@@ -10,6 +10,6 @@
10
10
 
11
11
  module Proxy
12
12
  module OpenSCAP
13
- VERSION = '0.6.5'
13
+ VERSION = '0.6.6'
14
14
  end
15
15
  end
@@ -39,9 +39,7 @@ class OpenSCAPGetArfTest < Test::Unit::TestCase
39
39
  end
40
40
 
41
41
  def test_get_html_arf
42
- OpenSCAP.oscap_init
43
42
  get "/arf/#{@arf_id}/#{@cname}/#{@date}/#{@filename}/html"
44
- OpenSCAP.oscap_cleanup
45
43
  assert(last_response.successful?, "Should return OK")
46
44
  assert(last_response.body.start_with?('<!DOCTYPE'), 'File should start with html')
47
45
  end
@@ -28,7 +28,7 @@ class ScapContentParserApiTest < Test::Unit::TestCase
28
28
 
29
29
  def test_invalid_scap_content_policies
30
30
  post '/scap_content/policies', '<xml>blah</xml>', 'CONTENT_TYPE' => 'text/xml'
31
- assert(last_response.body.include?('Could not create Source DataStream session'))
31
+ assert(last_response.body.include?('Failure when running script which extracts profiles from scap file'))
32
32
  end
33
33
 
34
34
  def test_scap_content_validator
@@ -0,0 +1,94 @@
1
+ require 'test_helper'
2
+ require 'smart_proxy_openscap/arf_html'
3
+ require 'smart_proxy_openscap/arf_json'
4
+ require 'smart_proxy_openscap/policy_guide'
5
+ require 'smart_proxy_openscap/scap_profiles'
6
+ require 'smart_proxy_openscap/arf_json'
7
+ require 'smart_proxy_openscap/scap_validation'
8
+
9
+ class ScriptClassTest < Test::Unit::TestCase
10
+ def test_arf_generate_html
11
+ carry_out do |tmp|
12
+ Proxy::OpenSCAP::ArfHtml.new.generate_html("#{Dir.getwd}/test/data/arf_report", tmp.path)
13
+ content = File.read tmp
14
+ assert content.start_with?('<!DOCTYPE'), "File should be html"
15
+ end
16
+ end
17
+
18
+ def test_arf_as_json
19
+ carry_out do |tmp|
20
+ Proxy::OpenSCAP::ArfJson.new.as_json("#{Dir.getwd}/test/data/arf_report", tmp.path)
21
+ json = read_json tmp
22
+ refute json['logs'].empty?
23
+ refute json['metrics'].empty?
24
+ end
25
+ end
26
+
27
+ def test_policy_guide
28
+ carry_out do |tmp|
29
+ profile = "xccdf_org.ssgproject.content_profile_stig-rhel7-workstation-upstream"
30
+ Proxy::OpenSCAP::PolicyGuide.new.generate_guide("#{Dir.getwd}/test/data/ssg-rhel7-ds.xml", tmp.path, profile)
31
+ guide = read_json tmp
32
+ assert guide['html'].start_with?('<!DOCTYPE'), "File should be html"
33
+ end
34
+ end
35
+
36
+ def test_scap_file_profiles
37
+ carry_out do |tmp|
38
+ Proxy::OpenSCAP::ScapProfiles.new.profiles("#{Dir.getwd}/test/data/ssg-rhel7-ds.xml", tmp.path, 'scap_content')
39
+ profiles = read_json tmp
40
+ refute profiles.empty?
41
+ assert profiles["xccdf_org.ssgproject.content_profile_common"]
42
+ end
43
+ end
44
+
45
+ def test_tailoring_file_profiles
46
+ carry_out do |tmp|
47
+ Proxy::OpenSCAP::ScapProfiles.new.profiles("#{Dir.getwd}/test/data/tailoring.xml", tmp.path, 'tailoring_file')
48
+ profiles = read_json tmp
49
+ refute profiles.empty?
50
+ assert profiles["xccdf_org.ssgproject.content_profile_stig-firefox-upstream_customized"]
51
+ end
52
+ end
53
+
54
+ def test_arf_json
55
+ carry_out do |tmp|
56
+ Proxy::OpenSCAP::ArfJson.new.as_json("#{Dir.getwd}/test/data/arf_report", tmp.path)
57
+ json = read_json tmp
58
+ refute json['logs'].empty?
59
+ refute json['metrics'].empty?
60
+ end
61
+ end
62
+
63
+ def test_scap_content_validation
64
+ carry_out do |tmp|
65
+ Proxy::OpenSCAP::ScapValidation.new.validate("#{Dir.getwd}/test/data/ssg-rhel7-ds.xml", tmp.path, 'scap_content')
66
+ res = read_json tmp
67
+ assert res['errors'].empty?
68
+ end
69
+ end
70
+
71
+ def test_tailoring_file_validation
72
+ carry_out do |tmp|
73
+ Proxy::OpenSCAP::ScapValidation.new.validate("#{Dir.getwd}/test/data/tailoring.xml", tmp.path, 'tailoring_file')
74
+ res = read_json tmp
75
+ assert res['errors'].empty?
76
+ end
77
+ end
78
+
79
+ private
80
+
81
+ def carry_out
82
+ tmp = Tempfile.new('test')
83
+ begin
84
+ yield tmp if block_given?
85
+ ensure
86
+ tmp.close
87
+ tmp.unlink
88
+ end
89
+ end
90
+
91
+ def read_json(file)
92
+ JSON.parse(File.read file)
93
+ end
94
+ end
data/test/test_helper.rb CHANGED
@@ -4,6 +4,7 @@ require 'webmock/test_unit'
4
4
  require 'mocha/setup'
5
5
  require 'json'
6
6
  require 'ostruct'
7
+ require 'tempfile'
7
8
 
8
9
  require 'smart_proxy_for_testing'
9
10
 
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smart_proxy_openscap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.5
4
+ version: 0.6.6
5
5
  platform: ruby
6
6
  authors:
7
- - "Šimon Lukašík"
7
+ - Šimon Lukašík
8
8
  - Shlomi Zadok
9
9
  - Marek Hulan
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2017-07-27 00:00:00.000000000 Z
13
+ date: 2017-09-07 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rake
@@ -97,27 +97,37 @@ files:
97
97
  - Gemfile
98
98
  - README.md
99
99
  - Rakefile
100
+ - bin/smart-proxy-arf-html
101
+ - bin/smart-proxy-arf-json
100
102
  - bin/smart-proxy-openscap-send
101
- - bin/smart-proxy-parse-arf
103
+ - bin/smart-proxy-policy-guide
104
+ - bin/smart-proxy-scap-profiles
105
+ - bin/smart-proxy-scap-validation
102
106
  - bundler.d/openscap.rb
103
107
  - extra/rubygem-smart_proxy_openscap.spec
104
108
  - extra/smart-proxy-openscap-send.cron
105
109
  - lib/smart_proxy_openscap.rb
110
+ - lib/smart_proxy_openscap/arf_html.rb
111
+ - lib/smart_proxy_openscap/arf_json.rb
106
112
  - lib/smart_proxy_openscap/arf_parser.rb
113
+ - lib/smart_proxy_openscap/content_parser.rb
107
114
  - lib/smart_proxy_openscap/fetch_file.rb
108
115
  - lib/smart_proxy_openscap/fetch_scap_content.rb
109
116
  - lib/smart_proxy_openscap/fetch_tailoring_file.rb
110
117
  - lib/smart_proxy_openscap/foreman_forwarder.rb
111
118
  - lib/smart_proxy_openscap/http_config.ru
112
119
  - lib/smart_proxy_openscap/openscap_api.rb
113
- - lib/smart_proxy_openscap/openscap_content_parser.rb
114
120
  - lib/smart_proxy_openscap/openscap_exception.rb
121
+ - lib/smart_proxy_openscap/openscap_html_generator.rb
115
122
  - lib/smart_proxy_openscap/openscap_import_api.rb
116
- - lib/smart_proxy_openscap/openscap_initializer.rb
117
123
  - lib/smart_proxy_openscap/openscap_lib.rb
118
124
  - lib/smart_proxy_openscap/openscap_plugin.rb
119
- - lib/smart_proxy_openscap/openscap_report_parser.rb
120
- - lib/smart_proxy_openscap/plugin_configuration.rb
125
+ - lib/smart_proxy_openscap/policy_guide.rb
126
+ - lib/smart_proxy_openscap/policy_parser.rb
127
+ - lib/smart_proxy_openscap/profiles_parser.rb
128
+ - lib/smart_proxy_openscap/scap_profiles.rb
129
+ - lib/smart_proxy_openscap/scap_validation.rb
130
+ - lib/smart_proxy_openscap/shell_wrapper.rb
121
131
  - lib/smart_proxy_openscap/spool_forwarder.rb
122
132
  - lib/smart_proxy_openscap/storage.rb
123
133
  - lib/smart_proxy_openscap/storage_fs.rb
@@ -139,6 +149,7 @@ files:
139
149
  - test/get_report_xml_html_test.rb
140
150
  - test/post_report_api_test.rb
141
151
  - test/scap_content_parser_api_test.rb
152
+ - test/script_class_test.rb
142
153
  - test/spool_forwarder_test.rb
143
154
  - test/test_helper.rb
144
155
  homepage: http://github.com/OpenSCAP/smart_proxy_openscap
@@ -161,9 +172,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
161
172
  version: '0'
162
173
  requirements: []
163
174
  rubyforge_project:
164
- rubygems_version: 2.4.6
175
+ rubygems_version: 2.6.8
165
176
  signing_key:
166
177
  specification_version: 4
167
178
  summary: OpenSCAP plug-in for Foreman's smart-proxy.
168
179
  test_files: []
169
- has_rdoc:
@@ -1,77 +0,0 @@
1
- require 'openscap/ds/sds'
2
- require 'openscap/source'
3
- require 'openscap/xccdf/benchmark'
4
- require 'openscap/xccdf/tailoring'
5
-
6
- module Proxy::OpenSCAP
7
- class ContentParser
8
- def initialize(scap_file, type = 'scap_content')
9
- @source = OpenSCAP::Source.new(:content => scap_file)
10
- @type = type
11
- end
12
-
13
- def cleanup
14
- @source.destroy if @source
15
- end
16
-
17
- def allowed_types
18
- {
19
- 'tailoring_file' => 'XCCDF Tailoring',
20
- 'scap_content' => 'SCAP Source Datastream'
21
- }
22
- end
23
-
24
- def extract_policies
25
- policies = {}
26
- bench = benchmark_profiles
27
- bench.profiles.each do |key, profile|
28
- policies[key] = profile.title
29
- end
30
- bench.destroy
31
- policies.to_json
32
- end
33
-
34
- def get_profiles
35
- tailoring = ::OpenSCAP::Xccdf::Tailoring.new(@source, nil)
36
- profiles = tailoring.profiles.inject({}) do |memo, (key, profile)|
37
- memo.tap { |hash| hash[key] = profile.title }
38
- end
39
- tailoring.destroy
40
- profiles.to_json
41
- end
42
-
43
- def validate
44
- errors = []
45
-
46
- if @source.type != allowed_types[@type]
47
- errors << "Uploaded file is #{@source.type}, unexpected file type"
48
- end
49
-
50
- begin
51
- @source.validate!
52
- rescue OpenSCAP::OpenSCAPError
53
- errors << "Invalid SCAP file type"
54
- end
55
- {:errors => errors}.to_json
56
- end
57
-
58
- def guide(policy)
59
- sds = OpenSCAP::DS::Sds.new @source
60
- sds.select_checklist
61
- profile_id = policy ? nil : policy
62
- html = sds.html_guide profile_id
63
- sds.destroy
64
- {:html => html.force_encoding('UTF-8')}.to_json
65
- end
66
-
67
- private
68
-
69
- def benchmark_profiles
70
- sds = ::OpenSCAP::DS::Sds.new(@source)
71
- bench_source = sds.select_checklist!
72
- benchmark = ::OpenSCAP::Xccdf::Benchmark.new(bench_source)
73
- sds.destroy
74
- benchmark
75
- end
76
- end
77
- end
@@ -1,21 +0,0 @@
1
- require 'openscap'
2
-
3
- module Proxy::OpenSCAP
4
- class OpenscapInitializer
5
- include ::Proxy::Log
6
-
7
- def initialize
8
- @mutex = Mutex.new
9
- end
10
-
11
- def start
12
- logger.debug "Initializing openscap component"
13
- @mutex.synchronize { OpenSCAP.oscap_init }
14
- end
15
-
16
- def stop
17
- logger.debug "Stopping openscap component"
18
- @mutex.synchronize { OpenSCAP.oscap_cleanup }
19
- end
20
- end
21
- end
@@ -1,48 +0,0 @@
1
- # encoding=utf-8
2
- require 'tempfile'
3
-
4
- module Proxy
5
- module OpenSCAP
6
- class Parse
7
- include ::Proxy::Log
8
- include ::Proxy::Util
9
-
10
- def initialize(cname, policy_id, date)
11
- @cname = cname
12
- @policy_id = policy_id
13
- @date = date
14
- end
15
-
16
- def as_json(arf_data)
17
- in_file = Tempfile.new("#{filename}json-", "/var/tmp")
18
- json_file = Tempfile.new(filename, "/var/tmp")
19
- begin
20
- in_file.write arf_data
21
- command = "#{script_location} #{in_file.path} #{json_file.path}"
22
- logger.debug "Executing: #{command}"
23
- `#{command}`
24
- json_file.read
25
- rescue => e
26
- logger.debug "Failure when running script which parses reports"
27
- logger.debug e.backtrace.join("\n\t")
28
- return nil
29
- ensure
30
- in_file.close
31
- in_file.unlink
32
- json_file.close
33
- json_file.unlink
34
- end
35
- end
36
-
37
- def filename
38
- "#{@cname}-#{@policy_id}-#{@date}-"
39
- end
40
-
41
- def script_location
42
- path = File.join(File.dirname(File.expand_path(__FILE__)), '../..','bin/smart-proxy-parse-arf')
43
- return path if File.exist? path
44
- "smart-proxy-parse-arf"
45
- end
46
- end
47
- end
48
- end
@@ -1,13 +0,0 @@
1
- module Proxy::OpenSCAP
2
- class PluginConfiguration
3
- def load_dependency_injection_wirings(container, settings)
4
- container.singleton_dependency :openscap_initializer, ( lambda do
5
- ::Proxy::OpenSCAP::OpenscapInitializer.new
6
- end)
7
- end
8
-
9
- def load_classes
10
- require 'smart_proxy_openscap/openscap_initializer'
11
- end
12
- end
13
- end