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