smart_proxy_abrt 0.0.1

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.
@@ -0,0 +1,12 @@
1
+ require 'smart_proxy_abrt/abrt_version'
2
+
3
+ module Proxy::Abrt
4
+ class Plugin < ::Proxy::Plugin
5
+ plugin :abrt, Proxy::Abrt::VERSION
6
+
7
+ http_rackup_path File.expand_path("http_config.ru", File.expand_path("../", __FILE__))
8
+ https_rackup_path File.expand_path("http_config.ru", File.expand_path("../", __FILE__))
9
+
10
+ #default settings
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ module Proxy
2
+ module Abrt
3
+ VERSION = '0.0.1'
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'smart_proxy_abrt/abrt_api'
2
+
3
+ map '/abrt' do
4
+ run Proxy::Abrt::Api
5
+ end
@@ -0,0 +1,26 @@
1
+ ---
2
+ :enabled: true
3
+
4
+ # Log file for the forwarding script.
5
+ :abrt_send_log_file: /var/log/foreman-proxy/abrt-send.log
6
+
7
+ # Directory where uReports are stored before they are sent
8
+ :spooldir: /var/spool/foreman-proxy-abrt
9
+
10
+ # Merge duplicate reports before sending (requires the satyr gem)
11
+ :aggregate_reports: true
12
+
13
+ # Period (in seconds) after which collected reports are forwarded. Meaningful
14
+ # only if smart-proxy-abrt-send is run as a daemon (not from cron).
15
+ #:send_period: 600
16
+
17
+ # FAF server instance the reports will be forwarded to (optional)
18
+ #:server_url: https://retrace.fedoraproject.org/faf
19
+
20
+ # Set to true if FAF server uses self-signed certificate
21
+ #:server_ssl_noverify: true
22
+
23
+ # Following two options enable client authentication to FAF server
24
+ #:server_ssl_cert: /etc/foreman-proxy/faf_client_cert.pem
25
+ #:server_ssl_key: /etc/foreman-proxy/faf_cleint_key.pem
26
+
@@ -0,0 +1,90 @@
1
+ require 'json'
2
+ require 'ostruct'
3
+ require 'webrick'
4
+ require 'tmpdir'
5
+ require 'sinatra'
6
+
7
+ require 'test_helper'
8
+ require 'smart_proxy_abrt/abrt_api'
9
+
10
+ ENV['RACK_ENV'] = 'test'
11
+
12
+ class AbrtApiTest < Test::Unit::TestCase
13
+ include Rack::Test::Methods
14
+
15
+ def app
16
+ Proxy::Abrt::Api.new
17
+ end
18
+
19
+ def setup
20
+ ureport_file = "test/fixtures/ureport1.json"
21
+ @post_data = {
22
+ "file" => Rack::Test::UploadedFile.new(ureport_file, "application/json")
23
+ }
24
+ Proxy::Abrt.stubs(:common_name).returns('localhost')
25
+ end
26
+
27
+ def assert_dir_contains_report(dir)
28
+ files = Dir[File.join(dir, "ureport-*")]
29
+ assert_equal files.size, 1
30
+ report_json = IO.read(files[0])
31
+ report = JSON.parse report_json
32
+ assert report.has_key?("host"), "On disk report has no host key"
33
+ assert report.has_key?("report"), "On disk report does not contain report"
34
+ end
35
+
36
+ def test_forwarding_to_foreman
37
+ Dir.mktmpdir do |tmpdir|
38
+ Proxy::Abrt::Plugin.settings.stubs(:spooldir).returns(tmpdir)
39
+
40
+ post "/reports/new/", @post_data
41
+
42
+ assert last_response.successful?
43
+ assert_equal last_response.status, 202
44
+ data = JSON.parse(last_response.body)
45
+ assert_equal data['result'], false
46
+ assert data['message'].is_a?(String), "Response message is not string"
47
+
48
+ assert_dir_contains_report tmpdir
49
+ end
50
+ end
51
+
52
+ def test_forwarding_to_foreman_and_faf
53
+ response_body = {
54
+ "result" => true,
55
+ "message" => "Hi!"
56
+ }.to_json
57
+ response_status = 202
58
+ faf_response = OpenStruct.new(:code => response_status, :body => response_body)
59
+
60
+ Proxy::Abrt.expects(:faf_request).returns(faf_response)
61
+ Proxy::Abrt::Plugin.settings.stubs(:server_url).returns('https://doesnt.matter/')
62
+
63
+ Dir.mktmpdir do |tmpdir|
64
+ Proxy::Abrt::Plugin.settings.stubs(:spooldir).returns(tmpdir)
65
+
66
+ post "/reports/new/", @post_data
67
+
68
+ assert last_response.successful?
69
+ assert_equal last_response.status, response_status
70
+ assert_equal last_response.body, response_body
71
+
72
+ assert_dir_contains_report tmpdir
73
+ end
74
+ end
75
+
76
+ def test_forwarding_other_endpoints
77
+ post "/reports/attach/", @post_data
78
+
79
+ assert_equal last_response.status, 501
80
+
81
+ faf_response = OpenStruct.new(:code => 201, :body => "Whatever!")
82
+ Proxy::Abrt.expects(:faf_request).returns(faf_response)
83
+ Proxy::Abrt::Plugin.settings.stubs(:server_url).returns('https://doesnt.matter/')
84
+
85
+ post "/reports/attach/", @post_data
86
+
87
+ assert_equal last_response.status, faf_response.code
88
+ assert_equal last_response.body, faf_response.body
89
+ end
90
+ end
@@ -0,0 +1,125 @@
1
+ require 'tmpdir'
2
+ require 'fileutils'
3
+
4
+ require 'test_helper'
5
+ require 'smart_proxy_abrt'
6
+ require 'smart_proxy_abrt/abrt_lib'
7
+
8
+ class AbrtTest < Test::Unit::TestCase
9
+ def setup
10
+ @tmpdir = Dir.mktmpdir "foreman-proxy-test"
11
+ FileUtils.cp Dir["test/fixtures/ureport-ondisk-*"], @tmpdir
12
+
13
+ Proxy::Abrt::Plugin.settings.stubs(:aggregate_reports).returns(false)
14
+ Proxy::Abrt::Plugin.settings.stubs(:spooldir).returns(@tmpdir)
15
+ end
16
+
17
+ def teardown
18
+ FileUtils.rm_rf @tmpdir
19
+ end
20
+
21
+ def test_multipart_form_data_file
22
+ file_contents = '{"foo":"bar"}'
23
+ headers, body = Proxy::Abrt.form_data_file(file_contents, 'application/json')
24
+ request_text = "POST /abrt/whatever/ HTTP/1.1\r\n"
25
+ headers.each do |key,value|
26
+ request_text << key + ": " + value + "\r\n"
27
+ end
28
+ request_text << "\r\n"
29
+ request_text << body
30
+
31
+ req = WEBrick::HTTPRequest.new(WEBrick::Config::HTTP)
32
+ req.parse(StringIO.new(request_text))
33
+
34
+ assert_equal req.request_method, "POST"
35
+ assert_equal req.query["file"], file_contents
36
+ end
37
+
38
+ def test_hostreport_open
39
+ file = File.join @tmpdir, "ureport-ondisk-host1-01"
40
+ hr = Proxy::Abrt::HostReport.new file
41
+ assert_equal "f19-managed.virtnet", hr.host
42
+ assert_equal [file], hr.files
43
+ assert_equal 1, hr.reports.size
44
+ end
45
+
46
+ def test_hostreport_load_directory
47
+ reports = Proxy::Abrt::HostReport.load_from_spool
48
+ assert_equal 4, reports.size
49
+ reports.each { |r| assert r.is_a?(Proxy::Abrt::HostReport) }
50
+ end
51
+
52
+ def test_hostreport_merge_without_duphash
53
+ reports = []
54
+ Dir[File.join(@tmpdir, "ureport-ondisk-host1-*")].each do |file|
55
+ reports << Proxy::Abrt::HostReport.new(file)
56
+ end
57
+
58
+ assert_equal 3, reports.size
59
+ r = reports[0]
60
+ r.merge(reports[1])
61
+ r.merge(reports[2])
62
+
63
+ # no merging by duphash
64
+ assert_equal 3, r.reports.size
65
+ end
66
+
67
+ def test_hostreport_merge_with_duphash
68
+ base = File.join(@tmpdir, "ureport-ondisk-host1-")
69
+ reports = []
70
+ Proxy::Abrt::HostReport.stubs(:duphash).returns("aaa")
71
+ reports << Proxy::Abrt::HostReport.new(base + "01")
72
+ reports << Proxy::Abrt::HostReport.new(base + "02")
73
+ Proxy::Abrt::HostReport.stubs(:duphash).returns("bbb")
74
+ reports << Proxy::Abrt::HostReport.new(base + "03")
75
+ Proxy::Abrt::HostReport.unstub(:duphash)
76
+
77
+ r = reports[0]
78
+ r.merge(reports[1])
79
+ r.merge(reports[2])
80
+
81
+ # first two reports should be merged
82
+ assert_equal 2, r.reports.size
83
+ end
84
+
85
+ def test_hostreport_send_to_foreman
86
+ Proxy::HttpRequest::ForemanRequest.any_instance.expects(:send_request).once
87
+
88
+ reports = []
89
+ Dir[File.join(@tmpdir, "ureport-ondisk-host1-*")].each do |file|
90
+ reports << Proxy::Abrt::HostReport.new(file)
91
+ end
92
+
93
+ r = reports[0]
94
+ r.merge(reports[1])
95
+ r.merge(reports[2])
96
+
97
+ r.send_to_foreman
98
+ end
99
+
100
+ def test_hostreport_unlink
101
+ # single report
102
+ r1 = Proxy::Abrt::HostReport.new File.join(@tmpdir, "ureport-ondisk-host2-01")
103
+ r1.unlink
104
+
105
+ # merged reports
106
+ r2 = Proxy::Abrt::HostReport.new File.join(@tmpdir, "ureport-ondisk-host1-01")
107
+ r2.merge Proxy::Abrt::HostReport.new(File.join(@tmpdir, "ureport-ondisk-host1-02"))
108
+ r2.merge Proxy::Abrt::HostReport.new(File.join(@tmpdir, "ureport-ondisk-host1-03"))
109
+ r2.unlink
110
+
111
+ dir_contents = Dir[File.join(@tmpdir, "*")]
112
+ assert dir_contents.empty?, "Not all files were deleted"
113
+ end
114
+
115
+ def test_hostreport_save
116
+ Dir[File.join(@tmpdir, "*")].each { |file| File.unlink file }
117
+ ureport = IO.read "test/fixtures/ureport1.json"
118
+ ureport = JSON.parse ureport
119
+ Proxy::Abrt::HostReport.save "localhost", ureport
120
+
121
+ hr = Proxy::Abrt::HostReport.new Dir[File.join(@tmpdir, "*")][0]
122
+ assert_equal "localhost", hr.host
123
+ assert_equal 1, hr.reports.size
124
+ end
125
+ end
@@ -0,0 +1 @@
1
+ {"host":"f19-managed.virtnet","report":{"ureport_version":2,"reason":"ZeroDivisionError in /bin/will_python_raise:3","reporter":{"name":"satyr","version":"0.13"},"os":{"name":"fedora","version":"19","architecture":"x86_64","cpe":"cpe:/o:fedoraproject:fedora:19"},"problem":{"type":"python","component":"will-crash","user":{"root":false,"local":true},"exception_name":"ZeroDivisionError","stacktrace":[{"file_name":"/bin/will_python_raise","file_line":3,"special_function":"module","line_contents":"0/0"}]},"packages":[{"name":"will-crash","epoch":0,"version":"0.4","release":"1.fc19","architecture":"x86_64","package_role":"affected"}]},"reported_at":"2014-06-30 08:42:44 UTC"}
@@ -0,0 +1 @@
1
+ {"host":"f19-managed.virtnet","report":{"ureport_version":2,"reason":"ZeroDivisionError in /bin/will_python_raise:3","reporter":{"name":"satyr","version":"0.13"},"os":{"name":"fedora","version":"19","architecture":"x86_64","cpe":"cpe:/o:fedoraproject:fedora:19"},"problem":{"type":"python","component":"will-crash","user":{"root":false,"local":true},"exception_name":"ZeroDivisionError","stacktrace":[{"file_name":"/bin/will_python_raise","file_line":3,"special_function":"module","line_contents":"0/0"}]},"packages":[{"name":"will-crash","epoch":0,"version":"0.4","release":"1.fc19","architecture":"x86_64","package_role":"affected"}]},"reported_at":"2014-06-30 09:42:44 UTC"}
@@ -0,0 +1 @@
1
+ {"host":"f19-managed.virtnet","report":{"ureport_version":2,"reason":"Program /usr/bin/will_segfault was terminated by signal 11","reporter":{"name":"satyr","version":"0.13"},"os":{"name":"fedora","version":"19","architecture":"x86_64","cpe":"cpe:/o:fedoraproject:fedora:19"},"problem":{"type":"core","component":"will-crash","user":{"root":false,"local":true},"signal":11,"executable":"/usr/bin/will_segfault","stacktrace":[{"crash_thread":true,"frames":[{"address":4195406,"build_id":"e8c1fa14411a04623afbfac93a5cbab39767cfb2","build_id_offset":1102,"function_name":"main","file_name":"/usr/bin/will_segfault","fingerprint":"27fec48d69579748149aa1a5456ea2d906ff5744"}]}]},"packages":[{"name":"glibc","epoch":0,"version":"2.17","release":"20.fc19","architecture":"x86_64","install_time":1389354420},{"name":"will-crash","epoch":0,"version":"0.4","release":"1.fc19","architecture":"x86_64","install_time":1391527642,"package_role":"affected"}]},"reported_at":"2014-06-30 10:42:42 UTC"}
@@ -0,0 +1 @@
1
+ {"host":"someotherhost.virtnet","report":{"ureport_version":2,"reason":"ZeroDivisionError in /bin/will_python_raise:3","reporter":{"name":"satyr","version":"0.13"},"os":{"name":"fedora","version":"19","architecture":"x86_64","cpe":"cpe:/o:fedoraproject:fedora:19"},"problem":{"type":"python","component":"will-crash","user":{"root":false,"local":true},"exception_name":"ZeroDivisionError","stacktrace":[{"file_name":"/bin/will_python_raise","file_line":3,"special_function":"module","line_contents":"0/0"}]},"packages":[{"name":"will-crash","epoch":0,"version":"0.4","release":"1.fc19","architecture":"x86_64","package_role":"affected"}]},"reported_at":"2014-06-30 18:42:44 UTC"}
@@ -0,0 +1,45 @@
1
+ { "ureport_version": 2
2
+ , "reason": "Program /usr/bin/will_segfault was terminated by signal 11"
3
+ , "reporter": { "name": "satyr"
4
+ , "version": "0.13"
5
+ }
6
+ , "os": { "name": "fedora"
7
+ , "version": "19"
8
+ , "architecture": "x86_64"
9
+ , "cpe": "cpe:/o:fedoraproject:fedora:19"
10
+ }
11
+ , "problem": { "type": "core"
12
+ , "component": "will-crash"
13
+ , "user": { "root": false
14
+ , "local": true
15
+ }
16
+ , "signal": 11
17
+ , "executable": "/usr/bin/will_segfault"
18
+ , "stacktrace":
19
+ [ { "crash_thread": true
20
+ , "frames":
21
+ [ { "address": 4195406
22
+ , "build_id": "e8c1fa14411a04623afbfac93a5cbab39767cfb2"
23
+ , "build_id_offset": 1102
24
+ , "function_name": "main"
25
+ , "file_name": "/usr/bin/will_segfault"
26
+ , "fingerprint": "27fec48d69579748149aa1a5456ea2d906ff5744"
27
+ } ]
28
+ } ]
29
+ }
30
+ , "packages": [ { "name": "glibc"
31
+ , "epoch": 0
32
+ , "version": "2.17"
33
+ , "release": "20.fc19"
34
+ , "architecture": "x86_64"
35
+ , "install_time": 1389354420
36
+ }
37
+ , { "name": "will-crash"
38
+ , "epoch": 0
39
+ , "version": "0.4"
40
+ , "release": "1.fc19"
41
+ , "architecture": "x86_64"
42
+ , "install_time": 1391527642
43
+ , "package_role": "affected"
44
+ } ]
45
+ }
@@ -0,0 +1,10 @@
1
+ path_to_smart_proxy_repo = '../smart-proxy'
2
+ $LOAD_PATH.unshift File.join(path_to_smart_proxy_repo, 'test')
3
+
4
+ # create log directory in our (not smart-proxy) repo
5
+ logdir = File.join(File.dirname(__FILE__), '..', 'logs')
6
+ FileUtils.mkdir_p(logdir) unless File.exists?(logdir)
7
+
8
+ require 'test_helper'
9
+
10
+ APP_ROOT = File.join(File.dirname(__FILE__), '..')
metadata ADDED
@@ -0,0 +1,67 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: smart_proxy_abrt
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Martin Milata
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-15 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: This smart proxy plugin, together with a Foreman plugin, add the capability
14
+ to send ABRT micro-reports from your managed hosts to Foreman.
15
+ email: mmilata@redhat.com
16
+ executables:
17
+ - smart-proxy-abrt-send
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - bin/smart-proxy-abrt-send
22
+ - lib/smart_proxy_abrt/abrt_api.rb
23
+ - lib/smart_proxy_abrt/abrt_plugin.rb
24
+ - lib/smart_proxy_abrt/abrt_lib.rb
25
+ - lib/smart_proxy_abrt/http_config.ru
26
+ - lib/smart_proxy_abrt/abrt_version.rb
27
+ - lib/smart_proxy_abrt.rb
28
+ - settings.d/abrt.yml.example
29
+ - bundler.d/abrt.rb
30
+ - test/test_helper.rb
31
+ - test/fixtures/ureport-ondisk-host1-02
32
+ - test/fixtures/ureport-ondisk-host2-01
33
+ - test/fixtures/ureport1.json
34
+ - test/fixtures/ureport-ondisk-host1-03
35
+ - test/fixtures/ureport-ondisk-host1-01
36
+ - test/abrt_test.rb
37
+ - test/abrt_api_test.rb
38
+ - extra/foreman-proxy-abrt-send.cron
39
+ - extra/rubygem-smart_proxy_abrt.spec
40
+ - README
41
+ - LICENSE
42
+ - Rakefile
43
+ homepage: http://github.com/abrt/smart-proxy-abrt
44
+ licenses:
45
+ - GPL-3
46
+ metadata: {}
47
+ post_install_message:
48
+ rdoc_options: []
49
+ require_paths:
50
+ - lib
51
+ required_ruby_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - '>='
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ requirements: []
62
+ rubyforge_project:
63
+ rubygems_version: 2.1.11
64
+ signing_key:
65
+ specification_version: 4
66
+ summary: Automatic Bug Reporting Tool plugin for Foreman's smart proxy
67
+ test_files: []