pushyd 0.6.0 → 0.7.0
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 +4 -4
- data/Gemfile.lock +4 -2
- data/bin/pushyd +10 -6
- data/lib/pushyd/proxy.rb +52 -14
- data/lib/shared/conf.rb +47 -45
- data/pushyd.gemspec +2 -1
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: de49b896a3b942b2babca81aa547804008fe7e39
|
4
|
+
data.tar.gz: b31568f729c9bf37c5b423f578c94a68ffaef429
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 73bafb1821c8c3d52f59c5202f24ee18c367c472eb2b80c082e5b81a5b7f2fa1b7568a882b46c1b4d9558b013cb99de8090dc2a30a054f57e685a08454148a77
|
7
|
+
data.tar.gz: bcd83b4f5351c6eee60798bf37fcf2d85f5c9ada8a7d0bcce64907aa32cf8ec347140f2e8cc2de56f3f055685eedd354e6c4b17c726bf2a0911514b92934f304
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
pushyd (0.
|
4
|
+
pushyd (0.7.0)
|
5
|
+
api-auth
|
5
6
|
bunny (~> 2.3)
|
6
7
|
chamber (~> 2.9)
|
7
8
|
daemons
|
@@ -15,6 +16,7 @@ GEM
|
|
15
16
|
specs:
|
16
17
|
addressable (2.4.0)
|
17
18
|
amq-protocol (2.0.1)
|
19
|
+
api-auth (2.0.0)
|
18
20
|
ast (2.3.0)
|
19
21
|
bunny (2.4.0)
|
20
22
|
amq-protocol (>= 2.0.1)
|
@@ -38,7 +40,7 @@ GEM
|
|
38
40
|
json (1.8.3)
|
39
41
|
mime-types (2.99.2)
|
40
42
|
netrc (0.11.0)
|
41
|
-
newrelic_rpm (3.
|
43
|
+
newrelic_rpm (3.16.0.318)
|
42
44
|
parser (2.3.1.2)
|
43
45
|
ast (~> 2.2)
|
44
46
|
powerpack (0.1.1)
|
data/bin/pushyd
CHANGED
@@ -23,13 +23,14 @@ begin
|
|
23
23
|
Conf.app_env = "production"
|
24
24
|
|
25
25
|
# Parse options and check compliance
|
26
|
-
OptionParser.new do |opts|
|
26
|
+
parser = OptionParser.new do |opts|
|
27
27
|
opts.banner = "Usage: #{File.basename $PROGRAM_NAME} [options] start|stop"
|
28
28
|
opts.on("-l", "--log LOGFILE") { |path| cmd_logfile = File.expand_path(path)}
|
29
29
|
opts.on("-c", "--config CONFIGFILE") { |path| cmd_config = File.expand_path(path)}
|
30
30
|
opts.on("-e", "--environment ENV") { |env| Conf.app_env = env }
|
31
31
|
opts.on("", "--dev") { Conf.app_env = "development" }
|
32
|
-
end
|
32
|
+
end
|
33
|
+
parser.order!(ARGV)
|
33
34
|
|
34
35
|
# Load Chamber-based configuration
|
35
36
|
Conf.prepare config: cmd_config, logfile: cmd_logfile
|
@@ -53,17 +54,20 @@ puts "Environment \t #{Conf.app_env}"
|
|
53
54
|
puts "Config files \t #{Conf.files}"
|
54
55
|
puts "Started at \t #{Conf.app_started}"
|
55
56
|
puts "Loging to file \t #{Conf[:log][:file]}" if Conf[:log].is_a? Enumerable
|
56
|
-
puts "Process name \t #{Conf.
|
57
|
+
puts "Process name \t #{Conf.generate(:process_name)}"
|
57
58
|
puts
|
58
59
|
puts Conf.dump
|
59
60
|
|
60
61
|
# Run daemon
|
61
62
|
run_options = {
|
63
|
+
monitor: false,
|
62
64
|
ontop: false,
|
63
|
-
:
|
64
|
-
:
|
65
|
+
backtrace: true,
|
66
|
+
multiple: false,
|
67
|
+
dir_mode: :normal,
|
68
|
+
dir: '/tmp/'
|
65
69
|
}
|
66
|
-
Daemons.run_proc(Conf.
|
70
|
+
Daemons.run_proc(Conf.generate(:process_name), run_options) do
|
67
71
|
# Load code
|
68
72
|
puts "--- load code"
|
69
73
|
require_relative "../lib/pushyd"
|
data/lib/pushyd/proxy.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'api_auth'
|
1
2
|
require 'rest_client'
|
2
3
|
require 'terminal-table'
|
3
4
|
|
@@ -47,7 +48,6 @@ module PushyDaemon
|
|
47
48
|
def handle_message rule, delivery_info, metadata, payload
|
48
49
|
# Prepare data
|
49
50
|
rule_name = rule[:name]
|
50
|
-
rule_relay = rule[:relay]
|
51
51
|
msg_exchange = delivery_info.exchange
|
52
52
|
msg_rkey = delivery_info.routing_key.force_encoding('UTF-8')
|
53
53
|
msg_headers = metadata.headers || {}
|
@@ -63,7 +63,7 @@ module PushyDaemon
|
|
63
63
|
}
|
64
64
|
|
65
65
|
# Build notification payload
|
66
|
-
|
66
|
+
propagate_data = {
|
67
67
|
exchange: msg_exchange,
|
68
68
|
route: msg_rkey,
|
69
69
|
sent_at: msg_headers['sent_at'],
|
@@ -72,25 +72,63 @@ module PushyDaemon
|
|
72
72
|
}
|
73
73
|
|
74
74
|
# Propagate data if needed
|
75
|
-
propagate
|
75
|
+
propagate rule, propagate_data
|
76
76
|
end
|
77
77
|
|
78
|
-
def propagate
|
78
|
+
def propagate rule, data
|
79
79
|
# Nothing more to do if no relay
|
80
|
-
return if
|
80
|
+
return if rule[:relay].nil? || rule[:relay].empty?
|
81
81
|
|
82
|
-
#
|
82
|
+
# Prepare stuff
|
83
|
+
relay_auth = rule[:auth].to_s
|
84
|
+
relay_uri = URI(rule[:relay])
|
85
|
+
relay_url = relay_uri.to_s
|
83
86
|
id = identifier(6)
|
87
|
+
# log_info "propagate: user[#{relay_uri.user}] url[#{relay_url}]"
|
88
|
+
|
89
|
+
# Build POST body and log message
|
90
|
+
post_body = JSON.pretty_generate(data)
|
91
|
+
log_message WAY_PROP, id, relay_url, data
|
92
|
+
|
93
|
+
# Prepare request
|
94
|
+
request = RestClient::Request.new url: relay_url,
|
95
|
+
method: :post,
|
96
|
+
payload: post_body,
|
97
|
+
headers: {
|
98
|
+
content_type: :json,
|
99
|
+
accept: :json,
|
100
|
+
user_agent: Conf.generate(:user_agent),
|
101
|
+
}
|
102
|
+
|
103
|
+
# Accordong to auth type
|
104
|
+
# log_info "propagate: auth[#{relay_auth}] class[#{relay_auth.class}]"
|
105
|
+
|
106
|
+
if !rule["hmac-user"]
|
107
|
+
# log_info "propagate: normal"
|
108
|
+
|
109
|
+
elsif !rule["hmac-secret"]
|
110
|
+
log_error "propagate: hmac: missing secret"
|
111
|
+
return
|
112
|
+
else
|
113
|
+
log_info "propagate: hmac: signing request"
|
114
|
+
request = ApiAuth.sign!(request, rule["hmac-user"].to_s, rule["hmac-secret"].to_s)
|
115
|
+
end
|
84
116
|
|
85
|
-
#
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
117
|
+
# Send request
|
118
|
+
log_info "propagate: url", request.headers
|
119
|
+
response = request.execute
|
120
|
+
|
121
|
+
# Handle exceptions
|
122
|
+
rescue RestClient::ExceptionWithResponse, URI::InvalidURIError => e
|
123
|
+
log_error "propagate: rest-client: #{e.message}"
|
124
|
+
rescue RestClient::InternalServerError => e
|
125
|
+
log_error "propagate: rest-client: #{e.message}"
|
126
|
+
rescue ApiAuth::ApiAuthError, ApiAuth::UnknownHTTPRequest => e
|
127
|
+
log_error "propagate: api-auth: #{e.message}"
|
128
|
+
rescue Errno::ECONNREFUSED => e
|
129
|
+
log_error "propagate: connection refused: #{e.message}"
|
92
130
|
rescue StandardError => e
|
93
|
-
log_error "propagate: #{e.message}"
|
131
|
+
log_error "propagate: unknown: #{e.message}, #{e.inspect}", e.backtrace
|
94
132
|
end
|
95
133
|
|
96
134
|
def parse payload, content_type #, fields = []
|
data/lib/shared/conf.rb
CHANGED
@@ -10,6 +10,7 @@ module Shared
|
|
10
10
|
|
11
11
|
class Conf
|
12
12
|
extend Chamber
|
13
|
+
PIDFILE_DIR = "/tmp/"
|
13
14
|
|
14
15
|
class << self
|
15
16
|
attr_accessor :app_env
|
@@ -21,7 +22,6 @@ module Shared
|
|
21
22
|
attr_reader :app_spec
|
22
23
|
attr_reader :files
|
23
24
|
attr_reader :host
|
24
|
-
|
25
25
|
end
|
26
26
|
|
27
27
|
def self.init app_root
|
@@ -51,11 +51,12 @@ module Shared
|
|
51
51
|
fail ConfigMissingParameter, "gemspec: missing version" unless @app_ver
|
52
52
|
|
53
53
|
# Now we know app_name, initalize app_libs
|
54
|
-
@app_libs = File.expand_path(
|
54
|
+
@app_libs = File.expand_path("lib/#{@app_name}/", @app_root)
|
55
55
|
|
56
56
|
# Add other config files
|
57
|
-
add_default_config
|
58
|
-
|
57
|
+
#add_default_config
|
58
|
+
add_config generate(:config_defaults)
|
59
|
+
add_config generate(:config_etc)
|
59
60
|
|
60
61
|
# Return something
|
61
62
|
return @app_name
|
@@ -64,17 +65,20 @@ module Shared
|
|
64
65
|
def self.prepare args = {}
|
65
66
|
ensure_init
|
66
67
|
|
67
|
-
# Add extra config file
|
68
|
-
|
69
|
-
|
70
|
-
# Load configuration files
|
71
|
-
load_files
|
68
|
+
# Add extra config file and load them all
|
69
|
+
add_config args[:config]
|
70
|
+
reload!
|
72
71
|
|
73
72
|
# Set Rack env
|
74
73
|
ENV["RACK_ENV"] = @app_env.to_s
|
75
74
|
|
75
|
+
# Set up encodings
|
76
|
+
Encoding.default_internal = "utf-8"
|
77
|
+
Encoding.default_external = "utf-8"
|
78
|
+
|
76
79
|
# Init New Relic
|
77
|
-
|
80
|
+
newrelic_logfile = File.expand_path(Conf[:logs][:newrelic], Conf[:logs][:path])
|
81
|
+
prepare_newrelic self[:newrelic], newrelic_logfile
|
78
82
|
|
79
83
|
# Try to access any key to force parsing of the files
|
80
84
|
self[:dummy]
|
@@ -104,57 +108,55 @@ module Shared
|
|
104
108
|
|
105
109
|
def self.newrelic_enabled?
|
106
110
|
ensure_init
|
107
|
-
|
111
|
+
self[:newrelic] && self[:newrelic][:licence]
|
108
112
|
end
|
109
113
|
|
110
114
|
# Defaults generators
|
111
|
-
def self.
|
115
|
+
def self.generate what
|
112
116
|
ensure_init
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
117
|
+
return case what
|
118
|
+
|
119
|
+
when :user_agent
|
120
|
+
"#{@app_name}/#{@app_ver}" if @app_name && @app_ver
|
121
|
+
|
122
|
+
when :config_defaults
|
123
|
+
"#{@app_root}/defaults.yml" if @app_root
|
124
|
+
|
125
|
+
when :config_etc
|
126
|
+
"/etc/#{@app_name}.yml" if @app_name
|
127
|
+
|
128
|
+
when :process_name
|
129
|
+
parts = [@app_name, @app_env]
|
130
|
+
parts << self[:port] if self[:port]
|
131
|
+
parts.join('-')
|
132
|
+
|
133
|
+
when :pidfile
|
134
|
+
process_name = self.generate(:process_name)
|
135
|
+
File.expand_path "#{process_name}.pid", PIDFILE_DIR
|
136
|
+
|
137
|
+
when :config_message
|
138
|
+
config_defaults = self.generate(:config_defaults)
|
139
|
+
config_etc = self.generate(:config_etc)
|
140
|
+
|
141
|
+
"A default configuration is available (#{config_defaults}) and can be copied to the default location (#{config_etc}): \n sudo cp #{config_defaults} #{config_etc}"
|
142
|
+
|
143
|
+
end
|
135
144
|
end
|
136
145
|
|
146
|
+
|
137
147
|
protected
|
138
148
|
|
139
149
|
def self.load_files
|
140
150
|
load files: @files, namespaces: { environment: @app_env }
|
141
151
|
end
|
142
152
|
|
143
|
-
def self.
|
144
|
-
@files <<
|
145
|
-
end
|
146
|
-
|
147
|
-
def self.add_etc_config
|
148
|
-
@files << File.expand_path("/etc/#{@app_name}.yml") if @app_name
|
149
|
-
end
|
150
|
-
|
151
|
-
def self.add_extra_config path
|
152
|
-
@files << File.expand_path(path) if path
|
153
|
+
def self.add_config path
|
154
|
+
@files << File.expand_path(path) if path && File.readable?(path)
|
153
155
|
end
|
154
156
|
|
155
157
|
def self.prepare_newrelic section, logfile
|
156
158
|
# Disable NewRelic if no config present
|
157
|
-
unless
|
159
|
+
unless self.newrelic_enabled?
|
158
160
|
ENV["NEWRELIC_AGENT_ENABLED"] = "false"
|
159
161
|
return
|
160
162
|
end
|
data/pushyd.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
Gem::Specification.new do |spec|
|
3
3
|
# Project version
|
4
|
-
spec.version = "0.
|
4
|
+
spec.version = "0.7.0"
|
5
5
|
|
6
6
|
# Project description
|
7
7
|
spec.name = "pushyd"
|
@@ -33,6 +33,7 @@ Gem::Specification.new do |spec|
|
|
33
33
|
spec.add_runtime_dependency "json"
|
34
34
|
spec.add_runtime_dependency "bunny", "~> 2.3"
|
35
35
|
spec.add_runtime_dependency "rest-client", "~> 1.8"
|
36
|
+
spec.add_runtime_dependency "api-auth"
|
36
37
|
spec.add_runtime_dependency "terminal-table"
|
37
38
|
spec.add_runtime_dependency "newrelic_rpm"
|
38
39
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pushyd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bruno MEDICI
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-06-
|
11
|
+
date: 2016-06-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -150,6 +150,20 @@ dependencies:
|
|
150
150
|
- - "~>"
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '1.8'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: api-auth
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
153
167
|
- !ruby/object:Gem::Dependency
|
154
168
|
name: terminal-table
|
155
169
|
requirement: !ruby/object:Gem::Requirement
|