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.
- checksums.yaml +7 -0
- data/LICENSE +675 -0
- data/README.md +183 -0
- data/bundler.d/reports.rb +1 -0
- data/lib/smart_proxy_reports/ansible_processor.rb +149 -0
- data/lib/smart_proxy_reports/processor.rb +103 -0
- data/lib/smart_proxy_reports/puppet_processor.rb +142 -0
- data/lib/smart_proxy_reports/reports.rb +30 -0
- data/lib/smart_proxy_reports/reports_api.rb +55 -0
- data/lib/smart_proxy_reports/reports_http_config.ru +10 -0
- data/lib/smart_proxy_reports/spooled_http_client.rb +102 -0
- data/lib/smart_proxy_reports/version.rb +5 -0
- data/lib/smart_proxy_reports.rb +2 -0
- data/settings.d/reports.yml.example +22 -0
- metadata +85 -0
@@ -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,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: []
|