pushyd 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|