pushyd 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4362764bdd62d5694410dc03443d0c006e69fea2
4
- data.tar.gz: f8e064d388c8812cc9ee8adf260e440ac0e04c01
3
+ metadata.gz: bef5122c9c7a8a4276bc0e1f735c48b65b88f156
4
+ data.tar.gz: 8620fcd2277aafc9ff97c6c65ec4abe25a6f5339
5
5
  SHA512:
6
- metadata.gz: 0fed54ac476319821c9f2eb988e5a07e42c5a4f6af8b5a5ca6029727cbb73bd046760fadc3021c96b2af9e57446a7848c800c8d3bb22ff21cf36eab66a6366bb
7
- data.tar.gz: b90ab861594caa453c0b5b5216c259be7d79d3ca190ff91a6c735df7442e096d63c6ae93f503d0d38cf7b6260325b33e19db682c9e0a5a67de381e5a3683b953
6
+ metadata.gz: dabd44f13d11e6167bb96b1e4c3d5c044bb0394ee386b3fe6ad84882339a518cf941d6f21aaab79090decd982511cbb1b1fe50ce5df124d70ee8d0487000a945
7
+ data.tar.gz: dc9779dfd1b20506840ccc799dbe5f8cac4d43daa30634ad4067a32a5a71b11b03dbdecdf4aa3a2075ba02195a6e40994da125cfb3208b8d234d4e2c6d765e38
data/Gemfile.lock CHANGED
@@ -1,12 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pushyd (0.2.3)
4
+ pushyd (0.2.4)
5
5
  bunny
6
6
  chamber
7
7
  daemons
8
8
  json
9
- rest_client
9
+ rest-client
10
10
  terminal-table
11
11
 
12
12
  GEM
@@ -37,14 +37,17 @@ GEM
37
37
  http-form_data (1.0.1)
38
38
  http_parser.rb (0.6.0)
39
39
  json (1.8.3)
40
- netrc (0.7.9)
40
+ mime-types (2.99.2)
41
+ netrc (0.11.0)
41
42
  parser (2.3.1.2)
42
43
  ast (~> 2.2)
43
44
  powerpack (0.1.1)
44
45
  rainbow (2.1.0)
45
46
  rake (11.1.2)
46
- rest_client (1.8.3)
47
- netrc (~> 0.7.7)
47
+ rest-client (1.8.0)
48
+ http-cookie (>= 1.0.2, < 2.0)
49
+ mime-types (>= 1.16, < 3.0)
50
+ netrc (~> 0.7)
48
51
  rspec (3.4.0)
49
52
  rspec-core (~> 3.4.0)
50
53
  rspec-expectations (~> 3.4.0)
data/bin/pushyd CHANGED
@@ -18,20 +18,22 @@ APP_ROOT = File.expand_path(File.dirname(__FILE__) + "/../")
18
18
  begin
19
19
  # Defaults
20
20
  cmd_config = nil
21
+ cmd_logfile = nil
21
22
  cmd_env = "production"
22
23
  cmd_dump = false
23
24
 
24
25
  # Parse options and check compliance
25
26
  OptionParser.new do |opts|
26
27
  opts.banner = "Usage: #{File.basename $PROGRAM_NAME} [options] start|stop"
27
- opts.on("-c", "--config CONFIGFILE") { |config| cmd_config = File.expand_path(config)}
28
+ opts.on("-l", "--log LOGFILE") { |path| cmd_logfile = File.expand_path(path)}
29
+ opts.on("-c", "--config CONFIGFILE") { |path| cmd_config = File.expand_path(path)}
28
30
  opts.on("-e", "--environment ENV") { |env| cmd_env = env }
29
31
  opts.on("-d", "--dump") { cmd_dump = true }
30
32
  opts.on("", "--dev") { cmd_env = "development" }
31
33
  end.order!(ARGV)
32
34
 
33
35
  # Build Chamber-based configuration from Gemspec with initial context
34
- Conf.prepare root: APP_ROOT, gemspec: "pushyd", env: cmd_env, config: cmd_config
36
+ Conf.prepare root: APP_ROOT, gemspec: "pushyd", env: cmd_env, config: cmd_config, log: cmd_logfile
35
37
 
36
38
  # Display final configuration
37
39
  puts "--- #{Conf.name} #{Conf.version}"
@@ -61,7 +63,7 @@ run_options = {
61
63
  }
62
64
  Daemons.run_proc('pushy-daemon', run_options) do
63
65
  # Load code
64
- puts "--- loading code and logger"
66
+ puts "--- loading code"
65
67
  require_relative "../lib/pushyd"
66
68
 
67
69
  # Start daemon
data/lib/pushyd/conf.rb CHANGED
@@ -43,6 +43,9 @@ module PushyDaemon
43
43
  # Try to access any key to force parsing of the files
44
44
  self[:dummy]
45
45
 
46
+ # Override some values
47
+ self[:log] = args[:log].to_s if args[:log]
48
+
46
49
  rescue Psych::SyntaxError => e
47
50
  raise PushyDaemon::ConfigParseError, e.message
48
51
 
@@ -19,5 +19,3 @@ LOG_NEWLINE = "\n"
19
19
  LOG_INDENT = "\t"
20
20
  LOG_ROTATION = "daily"
21
21
 
22
-
23
- # Constants: shouter
@@ -0,0 +1,198 @@
1
+ #!/usr/bin/env ruby
2
+ require 'terminal-table'
3
+ require 'hashie'
4
+ require 'securerandom'
5
+
6
+ # Log output
7
+ def header rule, sign, topic, route
8
+ puts
9
+ puts SEPARATOR
10
+ puts sprintf "%s | %-20s %1s %-10s | %s",
11
+ DateTime.now.iso8601, rule, sign, topic, route
12
+ puts SEPARATOR
13
+ end
14
+
15
+
16
+ def extract ctype, payload, fields = []
17
+ # Force encoding (pftop...)
18
+ utf8payload = payload.force_encoding('UTF-8')
19
+
20
+ # Parse payload if content-type provided
21
+ case ctype
22
+ when "application/json"
23
+ # if fields = rule[:payload_extract]
24
+ # data = payload_extract(payload, fields)
25
+ # data_source = "extract #{fields.inspect} #{data.keys.count}k"
26
+ return JSON.parse utf8payload
27
+
28
+ when "text/plain"
29
+ return utf8payload.to_s
30
+
31
+ else
32
+ return utf8payload
33
+
34
+ end
35
+
36
+ # Handle body parse errors
37
+ rescue Encoding::UndefinedConversionError => e
38
+ puts "\t JSON PARSE ERROR: #{e.inspect}"
39
+ return {}
40
+
41
+ end
42
+
43
+
44
+ # def payload_extract payload, fields = []
45
+ # new_payload = payload.force_encoding('UTF-8')
46
+ # parsed = JSON.parse new_payload
47
+
48
+ # rescue Encoding::UndefinedConversionError => e
49
+ # puts "\t JSON PARSE ERROR: #{e.inspect}"
50
+ # return {}
51
+
52
+ # else
53
+ # return parsed
54
+ # end
55
+
56
+
57
+
58
+ # def handle_message rule_name, rule, delivery_info, metadata, payload
59
+ # # Prepare data
60
+ # msg_topic = delivery_info.exchange
61
+ # msg_rkey = delivery_info.routing_key.force_encoding('UTF-8')
62
+ # msg_headers = metadata.headers || {}
63
+
64
+ # # Extract fields
65
+ # data = extract metadata.content_type, payload, rule
66
+
67
+ # # Announce match
68
+ # header rule_name, "<", msg_topic, msg_rkey
69
+
70
+ # # Build notification payload
71
+ # body = {
72
+ # # received: msg_topic,
73
+ # exchange: msg_topic,
74
+ # route: msg_rkey,
75
+ # #headers: msg_headers,
76
+ # sent_at: msg_headers['sent_at'],
77
+ # sent_by: msg_headers['sent_by'],
78
+ # data: data,
79
+ # }
80
+ # pretty_body = JSON.pretty_generate(body)
81
+
82
+ # # Dump body data
83
+ # puts "RULE: #{rule.inspect}"
84
+ # puts "APP-ID: #{metadata.app_id}"
85
+ # puts "CONTENT-TYPE: #{metadata.content_type}"
86
+ # puts pretty_body
87
+
88
+ # # Propagate data if needed
89
+ # propagate rule[:relay], pretty_body
90
+ # end
91
+
92
+ def topic channel, name
93
+ @topics ||= {}
94
+ @topics[name] ||= channel.topic(name, durable: true, persistent: true)
95
+ end
96
+
97
+ def shout exchange, keys, body = {}
98
+ # Add timestamp
99
+ headers = {
100
+ sent_at: DateTime.now.iso8601,
101
+ sent_by: PROXY_IDENT
102
+ }
103
+ exchange_name = exchange.name
104
+
105
+ # Prepare key and data
106
+ routing_key = keys.unshift(exchange_name).join('.')
107
+ # payload = data
108
+
109
+ # Announce shout
110
+ header "SHOUT", ">", exchange_name, routing_key
111
+ puts JSON.pretty_generate(body) unless body.empty?
112
+
113
+ # Publish
114
+ exchange.publish(body.to_json,
115
+ routing_key: routing_key,
116
+ headers: headers,
117
+ app_id: "contributor",
118
+ content_type: "application/json",
119
+ )
120
+
121
+ end
122
+
123
+
124
+ # Init ASCII table
125
+ config_table = Terminal::Table.new
126
+ config_table.title = "Message propagation rules"
127
+ config_table.headings = ["queue binding", "topic", "route", "relay", "title"]
128
+ config_table.align_column(5, :right)
129
+
130
+
131
+ # Bind every topic
132
+ config[:rules].each do |rule_name, rule|
133
+ # Extract information
134
+ catch_subscribe = rule[:subscribe] || true
135
+ catch_topic = rule[:topic].to_s
136
+ catch_routes = rule[:routes].to_s.split(' ')
137
+
138
+ if catch_topic.empty? || catch_routes.empty?
139
+ abort "rule [#{rule_name}] is invalid: missing topic / routes"
140
+ end
141
+
142
+ # Build / attach to queue
143
+ rule_queue_name = "#{PROXY_IDENT}-#{QUEUE_HOST}-#{rule_name}"
144
+
145
+ begin
146
+ # Bind to this topic if not already done
147
+ listen_exchange = topic(channel, catch_topic)
148
+
149
+ # Pour this into a queue
150
+ queue = channel.queue(rule_queue_name, auto_delete: false, durable: true)
151
+
152
+ # Bind to these events on each route
153
+ catch_routes.each do |route|
154
+ # Bind with this routing key
155
+ queue.bind listen_exchange, routing_key: route
156
+ puts "BIND \t[#{rule_queue_name}] to [#{catch_topic}] / [#{route}] (subscribe: #{catch_subscribe})"
157
+
158
+ # Add row to table
159
+ config_table.add_row [rule_queue_name, catch_topic, route, rule[:relay].to_s, rule[:title].to_s ]
160
+ end
161
+
162
+ end
163
+
164
+
165
+ # Subscribe
166
+
167
+ queue.subscribe(block: false, manual_ack: SUB_USE_ACK, message_max: SUB_MSG_MAX) do |delivery_info, metadata, payload|
168
+
169
+ # Handle the message
170
+ handle_message rule_name, rule, delivery_info, metadata, payload
171
+
172
+ # Ack the msg
173
+ # puts "> #{delivery_info.delivery_tag}: nack"
174
+ # channel.nack(delivery_info.delivery_tag)
175
+
176
+ # if !SUB_USE_ACK
177
+ # puts "> #{delivery_info.delivery_tag}: no ack"
178
+ # elsif (100*rand) <= ACK_PERCENT
179
+ # channel.ack(delivery_info.delivery_tag)
180
+ # puts "> #{delivery_info.delivery_tag}: ACKED"
181
+ # else
182
+ # channel.nack(delivery_info.delivery_tag)
183
+ # puts "> #{delivery_info.delivery_tag}: NOT_ACKED"
184
+ # end
185
+
186
+ end
187
+
188
+ # End of loop
189
+ end
190
+
191
+
192
+ # Display config and susbcribe to queue
193
+ puts config_table
194
+
195
+
196
+
197
+ puts
198
+ puts "ENDED"
data/lib/pushyd/proxy.rb CHANGED
@@ -4,9 +4,6 @@ require 'json'
4
4
  require 'terminal-table'
5
5
 
6
6
  module PushyDaemon
7
-
8
- # class ProxyConnexionContext < StandardError; end
9
-
10
7
  class Proxy < Endpoint
11
8
 
12
9
  attr_accessor :table
@@ -118,10 +115,8 @@ module PushyDaemon
118
115
  # data = payload_extract(payload, fields)
119
116
  # data_source = "extract #{fields.inspect} #{data.keys.count}k"
120
117
  return JSON.parse utf8payload
121
-
122
118
  when "text/plain"
123
119
  return utf8payload.to_s
124
-
125
120
  else
126
121
  return utf8payload
127
122
  end
@@ -133,6 +128,4 @@ module PushyDaemon
133
128
  end
134
129
 
135
130
  end
136
-
137
131
  end
138
-
@@ -39,10 +39,6 @@ module PushyDaemon
39
39
  raise PushyDaemon::EndpointTopicContext unless @topic
40
40
  @exchange = @channel.topic(@topic, durable: true, persistent: true)
41
41
 
42
- # if shout_config.is_a? Hash
43
- # shout_keys = shout_config[:keys] if config_shout[:keys].is_a? Array
44
- # end
45
-
46
42
  rescue Bunny::TCPConnectionFailedForAllHosts => e
47
43
  error "ERROR: cannot connect to RabbitMQ hosts (#{e.inspect})"
48
44
  end
@@ -72,14 +68,14 @@ module PushyDaemon
72
68
  private
73
69
 
74
70
  def channel_shout keys, body = {}
75
- # Add timestamp
71
+ # Prepare headers
76
72
  headers = {
77
73
  sent_at: DateTime.now.iso8601,
78
74
  sent_by: Conf.name
79
75
  }
80
- exchange_name = @exchange.name
81
76
 
82
- # Prepare key and data
77
+ # Prepare exchange_name and routing_key
78
+ exchange_name = @exchange.name
83
79
  routing_key = keys.unshift(exchange_name).join('.')
84
80
 
85
81
  # Announce shout
@@ -97,4 +93,3 @@ module PushyDaemon
97
93
 
98
94
  end
99
95
  end
100
-
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.2.3"
4
+ spec.version = "0.2.4"
5
5
 
6
6
  # Project description
7
7
  spec.name = "pushyd"
@@ -32,7 +32,7 @@ Gem::Specification.new do |spec|
32
32
  spec.add_runtime_dependency "chamber"
33
33
  spec.add_runtime_dependency "json"
34
34
  spec.add_runtime_dependency "bunny"
35
- spec.add_runtime_dependency "rest_client"
35
+ spec.add_runtime_dependency "rest-client"
36
36
  spec.add_runtime_dependency "terminal-table"
37
37
  # spec.add_runtime_dependency "newrelic_rpm"
38
38
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pushyd
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bruno MEDICI
@@ -137,7 +137,7 @@ dependencies:
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
139
  - !ruby/object:Gem::Dependency
140
- name: rest_client
140
+ name: rest-client
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
143
  - - ">="
@@ -183,6 +183,7 @@ files:
183
183
  - lib/pushyd/constants.rb
184
184
  - lib/pushyd/daemon.rb
185
185
  - lib/pushyd/endpoint.rb
186
+ - lib/pushyd/proxy.orig.rb
186
187
  - lib/pushyd/proxy.rb
187
188
  - lib/pushyd/pushy_logger.rb
188
189
  - lib/pushyd/shouter.rb