smart_proxy_reports 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,102 @@
1
+ module Proxy::Reports
2
+ class SpooledHttpClient
3
+ include Proxy::Log
4
+ include Singleton
5
+
6
+ def spool_path(state = "temp", filename = nil)
7
+ if filename
8
+ File.join(@spool_dir, state, filename)
9
+ else
10
+ File.join(@spool_dir, state)
11
+ end
12
+ end
13
+
14
+ def spool_move(from_state, to_state, filename)
15
+ # TODO: implement fsync?
16
+ FileUtils.mv(spool_path(from_state, filename), spool_path(to_state, filename))
17
+ end
18
+
19
+ def initialize
20
+ @worker = nil
21
+ end
22
+
23
+ def initialize_directory(spool_dir = Proxy::Reports::Plugin.settings.spool_dir)
24
+ raise("Setting spool_dir uninitialized") unless spool_dir
25
+ @spool_dir = spool_dir
26
+ ["temp", "todo", "done", "fail"].each do |state|
27
+ FileUtils.mkdir_p(spool_path(state))
28
+ end
29
+ self
30
+ end
31
+
32
+ def start
33
+ @worker_running = true
34
+ @worker = Thread.new do
35
+ while @worker_running
36
+ begin
37
+ logger.info "Started host reports spooled http client"
38
+ process
39
+ rescue StandardError => e
40
+ logger.error "Error during spool processing: #{e}", e
41
+ end
42
+ Thread.stop
43
+ end
44
+ logger.info "Stopped host reports spooled http client"
45
+ end
46
+ end
47
+
48
+ # smart proxy currently does not support stopping services
49
+ def stop
50
+ @worker_running = false
51
+ wakeup
52
+ @worker.join
53
+ end
54
+
55
+ def process
56
+ processed = 0
57
+ client = ::Proxy::HttpRequest::ForemanRequest.new
58
+ factory = client.request_factory
59
+ # send all files via a single persistent HTTP connection
60
+ logger.debug "Opening HTTP connection to Foreman"
61
+ client.http.start do |http|
62
+ Dir.glob(spool_path("todo", "*")) do |filename|
63
+ basename = File.basename(filename)
64
+ logger.debug "Sending report #{basename}"
65
+ begin
66
+ post = factory.create_post("/api/v2/host_reports", File.read(filename))
67
+ response = http.request(post)
68
+ logger.info "Report #{basename} sent with HTTP response #{response.code}"
69
+ logger.debug { "Response body: #{response.body}" }
70
+ if response.code.start_with?("2")
71
+ if Proxy::Reports::Plugin.settings.keep_reports
72
+ spool_move("todo", "done", basename)
73
+ else
74
+ FileUtils.rm_f spool_path("todo", basename)
75
+ end
76
+ else
77
+ logger.debug { "Moving failed report to 'fail' spool directory" }
78
+ spool_move("todo", "done", basename)
79
+ end
80
+ processed += 1
81
+ rescue StandardError => e
82
+ logger.warn "Unable to send #{basename}, will try on next request: #{e}", e
83
+ raise if ENV["RACK_ENV"] == "test"
84
+ end
85
+ end
86
+ end
87
+ logger.debug "Finished uploading #{processed} reports, closing connection"
88
+ end
89
+
90
+ def wakeup
91
+ @worker.wakeup if @worker
92
+ end
93
+
94
+ def spool(filename, data)
95
+ filename = filename.gsub(/[^0-9a-z]/i, "")
96
+ file = spool_path("temp", filename)
97
+ File.open(file, "w") { |f| f.write(data) }
98
+ spool_move("temp", "todo", filename)
99
+ wakeup
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,5 @@
1
+ module Proxy
2
+ module Reports
3
+ VERSION = "0.0.5"
4
+ end
5
+ end
@@ -0,0 +1,2 @@
1
+ require "smart_proxy_reports/version"
2
+ require "smart_proxy_reports/reports"
@@ -0,0 +1,22 @@
1
+ ---
2
+ :enabled: true
3
+
4
+ # Proxy hostname to appear in reports JSON
5
+ :reported_proxy_hostname: localhost
6
+
7
+ # Print intput and output to the debug level
8
+ :debug_payload: false
9
+
10
+ # Spool directory with processed reports
11
+ :spool_dir: /var/lib/foreman-proxy/reports
12
+
13
+ # Keep sent reports in spool_dir/done directory
14
+ # - when enabled, move files from the place on
15
+ # a regular basis (e.g. via cronjob).
16
+ :keep_reports: false
17
+
18
+ # Development settings (do not use)
19
+ # Override hostnames of incoming reports
20
+ #:override_hostname: report.example.com
21
+ # Store input payloads in a directory
22
+ #:incoming_save_dir: /var/lib/foreman-proxy/reports/incoming
metadata ADDED
@@ -0,0 +1,85 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: smart_proxy_reports
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.5
5
+ platform: ruby
6
+ authors:
7
+ - Lukas Zapletal
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-10-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.3.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 2.3.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: rack
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 2.1.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 2.1.0
41
+ description: Transform and upload Foreman host reports via REST API
42
+ email: lukas-x@zapletalovi.com
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files:
46
+ - README.md
47
+ - LICENSE
48
+ files:
49
+ - LICENSE
50
+ - README.md
51
+ - bundler.d/reports.rb
52
+ - lib/smart_proxy_reports.rb
53
+ - lib/smart_proxy_reports/ansible_processor.rb
54
+ - lib/smart_proxy_reports/processor.rb
55
+ - lib/smart_proxy_reports/puppet_processor.rb
56
+ - lib/smart_proxy_reports/reports.rb
57
+ - lib/smart_proxy_reports/reports_api.rb
58
+ - lib/smart_proxy_reports/reports_http_config.ru
59
+ - lib/smart_proxy_reports/spooled_http_client.rb
60
+ - lib/smart_proxy_reports/version.rb
61
+ - settings.d/reports.yml.example
62
+ homepage: http://github.com/theforeman/smart_proxy_reports
63
+ licenses:
64
+ - GPL-3.0-or-later
65
+ metadata: {}
66
+ post_install_message:
67
+ rdoc_options: []
68
+ require_paths:
69
+ - lib
70
+ required_ruby_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '2.5'
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ requirements: []
81
+ rubygems_version: 3.1.4
82
+ signing_key:
83
+ specification_version: 4
84
+ summary: Foreman Host Reports processor
85
+ test_files: []