rsmp 0.2.1 → 0.2.2

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
  SHA256:
3
- metadata.gz: 43f928133404e5dbc56e1a45eba044b20783bd2decfd1631a0ae2b66e731e5e2
4
- data.tar.gz: ad786c056a21aa65a65406edfe3200229a5b02a104871e63e656d4dae4c6910c
3
+ metadata.gz: 55265e42f3956b7af530055680da60f82c84d34d7febd19286bf7c78bd2048f8
4
+ data.tar.gz: 445498a67e24c6b63cbfceca009ad736e962717eb89e92239bdd7ad4870cf72f
5
5
  SHA512:
6
- metadata.gz: 453a4f85fbd4985dc300fd6321c2c534723b251410e6a7c577aff53175197aa1e8898234a1086b1d747fe4e093a67007b6ffd426e15a1b0d3a6ebaa489791f2a
7
- data.tar.gz: 7c443d27d2dbc108b5b34af6faf15fa03e145193f83584c465ae685f74de4203db0cd37d06fdee4525a06077cd0a208020e7f9a635b021d20eb92050eeaaa8d5
6
+ metadata.gz: '0854ca1835fc15e8ccd10059c3f6f30638daf54677d215799eabae0f87fa4de11c9f825319f10ba92f9d25052fc90927fb54eb9f5df19cb714ba9ead236effbf'
7
+ data.tar.gz: 5d60090a4de455ca03fcb0fc182977ff938d0c8df9ea0bfb69d1dc985546c6de6ece83296bb25a64cc5f9e3b67d94e7694ec9702e08877bd6d9e05853d700ebd
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rsmp (0.2.1)
4
+ rsmp (0.2.2)
5
5
  async (~> 1.29.1)
6
6
  async-io (~> 1.32.1)
7
7
  colorize (~> 0.8.1)
@@ -24,12 +24,12 @@ GEM
24
24
  cucumber (>= 2.4, < 7.0)
25
25
  rspec-expectations (~> 3.4)
26
26
  thor (~> 1.0)
27
- async (1.29.1)
27
+ async (1.29.2)
28
28
  console (~> 1.10)
29
29
  nio4r (~> 2.3)
30
30
  timers (~> 4.1)
31
- async-io (1.32.1)
32
- async (~> 1.14)
31
+ async-io (1.32.2)
32
+ async
33
33
  builder (3.2.4)
34
34
  childprocess (4.1.0)
35
35
  colorize (0.8.1)
@@ -88,7 +88,7 @@ GEM
88
88
  mime-types-data (3.2021.0225)
89
89
  minitest (5.14.4)
90
90
  multi_test (0.1.2)
91
- nio4r (2.5.7)
91
+ nio4r (2.5.8)
92
92
  protobuf-cucumber (3.10.8)
93
93
  activesupport (>= 3.2)
94
94
  middleware
data/lib/rsmp/logger.rb CHANGED
@@ -96,7 +96,8 @@ module RSMP
96
96
  'statistics' => 'light_black',
97
97
  'not_acknowledged' => 'cyan',
98
98
  'warning' => 'light_yellow',
99
- 'error' => 'red'
99
+ 'error' => 'red',
100
+ 'debug' => 'light_black'
100
101
  }
101
102
  colors.merge! @settings["color"] if @settings["color"].is_a?(Hash)
102
103
  if colors[level.to_s]
data/lib/rsmp/proxy.rb CHANGED
@@ -11,22 +11,32 @@ module RSMP
11
11
  include Notifier
12
12
  include Inspect
13
13
 
14
- attr_reader :state, :archive, :connection_info, :sxl, :task, :collector
14
+ attr_reader :state, :archive, :connection_info, :sxl, :task, :collector, :ip, :port
15
15
 
16
16
  def initialize options
17
17
  initialize_logging options
18
+ setup options
19
+ initialize_distributor
20
+ prepare_collection @settings['collect']
21
+ clear
22
+ end
23
+
24
+ def revive options
25
+ setup options
26
+ end
27
+
28
+ def setup options
18
29
  @settings = options[:settings]
19
30
  @task = options[:task]
20
31
  @socket = options[:socket]
32
+ @stream = options[:stream]
33
+ @protocol = options[:protocol]
21
34
  @ip = options[:ip]
22
35
  @port = options[:port]
23
36
  @connection_info = options[:info]
24
37
  @sxl = nil
25
38
  @site_settings = nil # can't pick until we know the site id
26
- initialize_distributor
27
-
28
- prepare_collection @settings['collect']
29
- clear
39
+ @state = :stopped
30
40
  end
31
41
 
32
42
  def inspect
@@ -105,8 +115,8 @@ module RSMP
105
115
  def start_reader
106
116
  @reader = @task.async do |task|
107
117
  task.annotate "reader"
108
- @stream = Async::IO::Stream.new(@socket)
109
- @protocol = Async::IO::Protocol::Line.new(@stream,WRAPPING_DELIMITER) # rsmp messages are json terminated with a form-feed
118
+ @stream ||= Async::IO::Stream.new(@socket)
119
+ @protocol ||= Async::IO::Protocol::Line.new(@stream,WRAPPING_DELIMITER) # rsmp messages are json terminated with a form-feed
110
120
 
111
121
  while json = @protocol.read_line
112
122
  beginning = Time.now
@@ -15,6 +15,13 @@ module RSMP
15
15
  @site_id = nil
16
16
  end
17
17
 
18
+ def revive options
19
+ super options
20
+ @supervisor = options[:supervisor]
21
+ @settings = @supervisor.supervisor_settings.clone
22
+ end
23
+
24
+
18
25
  def inspect
19
26
  "#<#{self.class.name}:#{self.object_id}, #{inspector(
20
27
  :@acknowledgements,:@settings,:@site_settings,:@components
@@ -82,8 +89,12 @@ module RSMP
82
89
 
83
90
  end
84
91
 
92
+ def validate_ready action
93
+ raise NotReady.new("Can't #{action} because connection is not ready. (Currently #{@state})") unless ready?
94
+ end
95
+
85
96
  def request_aggregated_status component, options={}
86
- raise NotReady unless ready?
97
+ validate_ready 'request aggregated status'
87
98
  m_id = options[:m_id] || RSMP::Message.make_m_id
88
99
 
89
100
  message = RSMP::AggregatedStatusRequest.new({
@@ -163,7 +174,7 @@ module RSMP
163
174
  end
164
175
 
165
176
  def request_status component, status_list, options={}
166
- raise NotReady unless ready?
177
+ validate_ready 'request status'
167
178
  m_id = options[:m_id] || RSMP::Message.make_m_id
168
179
 
169
180
  # additional items can be used when verifying the response,
@@ -203,7 +214,7 @@ module RSMP
203
214
  end
204
215
 
205
216
  def subscribe_to_status component, status_list, options={}
206
- raise NotReady unless ready?
217
+ validate_ready 'subscribe to status'
207
218
  m_id = options[:m_id] || RSMP::Message.make_m_id
208
219
 
209
220
  # additional items can be used when verifying the response,
@@ -238,7 +249,7 @@ module RSMP
238
249
  end
239
250
 
240
251
  def unsubscribe_to_status component, status_list, options={}
241
- raise NotReady unless ready?
252
+ validate_ready 'unsubscribe to status'
242
253
  message = RSMP::StatusUnsubscribe.new({
243
254
  "ntsOId" => '',
244
255
  "xNId" => '',
@@ -269,7 +280,7 @@ module RSMP
269
280
  end
270
281
 
271
282
  def send_command component, command_list, options={}
272
- raise NotReady unless ready?
283
+ validate_ready 'send command'
273
284
  m_id = options[:m_id] || RSMP::Message.make_m_id
274
285
  message = RSMP::CommandRequest.new({
275
286
  "ntsOId" => '',
@@ -136,6 +136,13 @@ module RSMP
136
136
  end
137
137
  end
138
138
 
139
+ def peek_version_message protocol
140
+ json = protocol.peek_line
141
+ attributes = Message.parse_attributes json
142
+ message = Message.build attributes, json
143
+ message.attribute('siteId').first['sId']
144
+ end
145
+
139
146
  def connect socket, info
140
147
  log "Site connected from #{format_ip_and_port(info)}",
141
148
  ip: info[:ip],
@@ -144,25 +151,36 @@ module RSMP
144
151
  timestamp: Clock.now
145
152
 
146
153
  authorize_ip info[:ip]
147
- check_max_sites
148
154
 
149
- proxy = build_proxy({
155
+ stream = Async::IO::Stream.new socket
156
+ protocol = Async::IO::Protocol::Line.new stream, Proxy::WRAPPING_DELIMITER
157
+
158
+ settings = {
150
159
  supervisor: self,
151
160
  ip: info[:ip],
152
161
  port: info[:port],
153
162
  task: @task,
154
163
  settings: {'collect'=>@supervisor_settings['collect']},
155
164
  socket: socket,
165
+ stream: stream,
166
+ protocol: protocol,
156
167
  info: info,
157
168
  logger: @logger,
158
169
  archive: @archive
159
- })
160
- @proxies.push proxy
170
+ }
171
+
172
+ id = peek_version_message protocol
173
+ proxy = find_site id
174
+ if proxy
175
+ proxy.revive settings
176
+ else
177
+ check_max_sites
178
+ proxy = build_proxy settings
179
+ @proxies.push proxy
180
+ end
161
181
  proxy.run # will run until the site disconnects
162
182
  ensure
163
- @proxies.delete proxy
164
183
  site_ids_changed
165
-
166
184
  stop if @supervisor_settings['one_shot']
167
185
  end
168
186
 
@@ -188,7 +206,14 @@ module RSMP
188
206
  return find_site(site_id) != nil
189
207
  end
190
208
 
191
- def find_site site_id
209
+ def find_site_from_ip_port ip, port
210
+ @proxies.each do |site|
211
+ return site if site.ip == ip && site.port == port
212
+ end
213
+ nil
214
+ end
215
+
216
+ def find_site site_id
192
217
  @proxies.each do |site|
193
218
  return site if site_id == :any || site.site_id == site_id
194
219
  end
@@ -210,12 +235,13 @@ module RSMP
210
235
  end
211
236
 
212
237
  def check_site_id site_id
213
- check_site_already_connected site_id
238
+ #check_site_already_connected site_id
214
239
  return site_id_to_site_setting site_id
215
240
  end
216
241
 
217
242
  def check_site_already_connected site_id
218
- raise FatalError.new "Site '#{site_id}' already connected" if find_site(site_id)
243
+ site = find_site(site_id)
244
+ raise FatalError.new "Site '#{site_id}' already connected" if site != nil && site != self
219
245
  end
220
246
 
221
247
  def site_id_to_site_setting site_id
data/lib/rsmp/tlc.rb CHANGED
@@ -798,7 +798,7 @@ module RSMP
798
798
  super options
799
799
  @sxl = 'traffic_light_controller'
800
800
  @security_codes = options[:site_settings]['security_codes']
801
- @interval = options[:site_settings]['intervals']['timer'] || 1
801
+ @interval = options[:site_settings].dig('intervals','timer') || 1
802
802
  unless @main
803
803
  raise ConfigurationError.new "TLC must have a main component"
804
804
  end
data/lib/rsmp/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module RSMP
2
- VERSION = "0.2.1"
2
+ VERSION = "0.2.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rsmp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emil Tin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-07-02 00:00:00.000000000 Z
11
+ date: 2021-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async
@@ -254,7 +254,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
254
254
  - !ruby/object:Gem::Version
255
255
  version: '0'
256
256
  requirements: []
257
- rubygems_version: 3.2.15
257
+ rubygems_version: 3.2.26
258
258
  signing_key:
259
259
  specification_version: 4
260
260
  summary: RoadSide Message Protocol (RSMP) library.