smart_proxy_reports 0.0.5

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,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: []