tamashii-agent 0.2.8 → 0.3.0

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: 5fd9d5c6f30e60812fe77bb31c1c4f867bbdf5ac
4
- data.tar.gz: 6c2b99fe269bb5592d7277b42fafdaf9ff788aa4
3
+ metadata.gz: 5de4cba829b0eab020881898175c0dabd45f9a94
4
+ data.tar.gz: 1700db0dc1f111c39871a195a1fc82919ceef6a7
5
5
  SHA512:
6
- metadata.gz: 3d3809a9b2b9d9d9a8cc562f0b20f2dc20f1ea6d0409cb971057da8c504e8684d233c944ae02abb546ee1242a5d3257dc4d80c420fd1b6d94494fded47b3ec3c
7
- data.tar.gz: 22efd47ced899ab7a920325ff033d3382c3db2375993bbdb09556c79440040924d355c825bd31f003918452e0ad3178fd98477873fb3a5f28eacd4faa941b7d9
6
+ metadata.gz: d5eb697ea55e98cb2fc0dac672e2e4946bb7ba7388255120cc09e9c6cf116f64877df28fabbb7d1a01310494410d88142395e5b55813eefa6f81f54c6ca7f20b
7
+ data.tar.gz: 9d8d9ddd661cb0989a082b9dbba74cf5e645102eab9a8b7289ec8296330bcd937508bc8631ad233753f17cfcbc0d33da0bdd41dc67f1dda044362bcb1b9efa54
@@ -1,15 +1,10 @@
1
1
  require 'tamashii/common'
2
+ require 'tamashii/client'
2
3
  module Tamashii
3
4
  module Agent
4
5
  class Config < Tamashii::Config
5
6
  AUTH_TYPES = [:none, :token]
6
7
 
7
- register :log_file, STDOUT
8
- register :use_ssl, false
9
- register :auth_type, :none
10
- register :entry_point, "/tamashii"
11
- register :manager_host, "localhost"
12
- register :manager_port, 3000
13
8
  register :connection_timeout, 3
14
9
 
15
10
  register :localtime, "+08:00"
@@ -18,6 +13,7 @@ module Tamashii
18
13
  register :lcd_address, 0x27
19
14
  register :lcd_animation_delay, 1
20
15
 
16
+
21
17
  def auth_type(type = nil)
22
18
  return @auth_type ||= :none if type.nil?
23
19
  return unless AUTH_TYPES.include?(type)
@@ -26,8 +22,21 @@ module Tamashii
26
22
 
27
23
  def log_level(level = nil)
28
24
  return Agent.logger.level if level.nil?
25
+ Client.config.log_level(level)
29
26
  Agent.logger.level = level
30
27
  end
28
+
29
+ def log_file(value = nil)
30
+ return @log_file ||= STDOUT if value.nil?
31
+ Client.config.log_file(value)
32
+ @log_file = value
33
+ end
34
+
35
+ [:use_ssl, :host, :port, :entry_point].each do |method_name|
36
+ define_method(method_name) do |*args|
37
+ Tamashii::Client.config.send(method_name, *args)
38
+ end
39
+ end
31
40
  end
32
41
  end
33
42
  end
@@ -1,10 +1,6 @@
1
- require 'socket'
2
- require 'websocket/driver'
3
1
  require 'aasm'
4
- require 'openssl'
5
2
  require 'json'
6
3
  require 'concurrent'
7
- require 'nio'
8
4
 
9
5
  require 'tamashii/common'
10
6
 
@@ -14,54 +10,25 @@ require 'tamashii/agent/component'
14
10
 
15
11
  require 'tamashii/agent/handler'
16
12
 
13
+ require 'tamashii/client'
14
+
17
15
  module Tamashii
18
16
  module Agent
19
17
  class Connection < Component
20
18
 
21
- class RequestTimeoutError < RuntimeError; end
22
-
23
- class RequestObserver
24
- include Common::Loggable
25
- def initialize(connection, id, ev_type, ev_body, future)
26
- @connection = connection
27
- @id = id
28
- @ev_type = ev_type
29
- @ev_body = ev_body
30
- @future = future
31
- end
19
+ autoload :RequestObserver, 'tamashii/agent/connection/request_observer'
32
20
 
33
- def update(time, ev_data, reason)
34
- if @future.fulfilled?
35
- res_ev_type = ev_data[:ev_type]
36
- res_ev_body = ev_data[:ev_body]
37
- case res_ev_type
38
- when Type::RFID_RESPONSE_JSON
39
- logger.debug "Handled: #{res_ev_type}: #{res_ev_body}"
40
- @connection.handle_card_result(JSON.parse(res_ev_body))
41
- else
42
- logger.warn "Unhandled packet result: #{res_ev_type}: #{res_ev_body}"
43
- end
44
- else
45
- logger.error "#{@id} Failed with #{reason}"
46
- @connection.on_request_timeout(@ev_type, @ev_body)
47
- end
48
- end
49
- end
21
+ class RequestTimeoutError < RuntimeError; end
50
22
 
51
23
  include AASM
52
24
 
53
25
  aasm do
54
26
  state :init, initial: true
55
- state :connecting
56
27
  state :auth_pending
57
28
  state :ready
58
29
 
59
- event :connect do
60
- transitions from: :init, to: :connecting, after: Proc.new { logger.info "Start connecting" }
61
- end
62
-
63
30
  event :auth_request do
64
- transitions from: :connecting, to: :auth_pending, after: Proc.new { logger.info "Sending authentication request" }
31
+ transitions from: :init, to: :auth_pending, after: Proc.new { logger.info "Sending authentication request" }
65
32
  end
66
33
 
67
34
  event :auth_success do
@@ -78,24 +45,19 @@ module Tamashii
78
45
 
79
46
  def initialize(master)
80
47
  super
81
- @host = @master.host
82
- @port = @master.port
83
- @url = "#{Config.use_ssl ? "wss" : "ws"}://#{@host}:#{@port}/#{Config.entry_point}"
48
+
84
49
  self.reset
50
+ @client = Tamashii::Client::Base.new
85
51
 
86
52
  @tag = 0
87
53
 
88
54
  @future_ivar_pool = Concurrent::Map.new
89
- @driver_lock = Mutex.new
90
55
 
91
56
  @last_error_report_time = Time.now
57
+ setup_callbacks
92
58
  setup_resolver
93
59
  end
94
60
 
95
- def create_selector
96
- @selector = NIO::Selector.new
97
- end
98
-
99
61
  def setup_resolver
100
62
  env_data = {connection: self}
101
63
  Resolver.config do
@@ -127,9 +89,7 @@ module Tamashii
127
89
 
128
90
  def try_send_request(ev_type, ev_body)
129
91
  if self.ready?
130
- @driver_lock.synchronize do
131
- @driver.binary(Packet.new(ev_type, @tag, ev_body).dump)
132
- end
92
+ @client.transmit(Packet.new(ev_type, @tag, ev_body).dump)
133
93
  true
134
94
  else
135
95
  false
@@ -138,113 +98,43 @@ module Tamashii
138
98
 
139
99
  def stop_threads
140
100
  super
141
- @websocket_thr.exit if @websocket_thr
142
- @websocket_thr = nil
101
+ @client.close
143
102
  end
144
103
 
145
- def run
146
- super
147
- @websocket_thr = Thread.start { run_websocket_loop }
148
- end
149
-
150
- def run_websocket_loop
151
- create_selector
152
- loop do
153
- ready = @selector.select(1)
154
- ready.each { |m| m.value.call } if ready
155
- if @io.nil?
156
- @io = try_create_socket
157
- if @io
158
- # socket io opened
159
- register_socket_io
160
- # start ws
161
- start_web_driver
162
- end
163
- end
164
- end
165
- end
166
104
 
167
105
  def send_auth_request
168
106
  # TODO: other types of auth
169
- @driver.binary(Packet.new(Type::AUTH_TOKEN, 0, [Type::CLIENT[:agent], @master.serial_number,Config.token].join(",")).dump)
107
+ if @client.transmit(Packet.new(Type::AUTH_TOKEN, 0, [Type::CLIENT[:agent], @master.serial_number,Config.token].join(",")).dump)
108
+ logger.debug "Auth sent!"
109
+ else
110
+ logger.error "Cannot sent auth request!"
111
+ end
170
112
  end
171
113
 
172
- def start_web_driver
173
- # TODO: Improve below code
174
- @driver = WebSocket::Driver.client(self)
175
- @driver.on :open, proc { |e|
114
+ def setup_callbacks
115
+ @client.on :open, proc {
176
116
  logger.info "Server opened"
177
117
  self.auth_request
178
118
  send_auth_request
179
119
  }
180
- @driver.on :close, proc { |e|
181
- logger.info "Server closed"
182
- close_socket_io
120
+ @client.on :close, proc {
121
+ # Note: this only called when normally receive the WS close message
122
+ logger.info "Server closed normally"
123
+ }
124
+ @client.on :socket_closed, proc {
125
+ # Note: called when low-level IO is closed
126
+ logger.info "Server socket closed"
183
127
  self.reset
184
128
  }
185
- @driver.on :message, proc { |e|
186
- pkt = Packet.load(e.data)
129
+ @client.on :message, proc { |data|
130
+ pkt = Packet.load(data)
187
131
  process_packet(pkt) if pkt
188
132
  }
189
- @driver.on :error, proc { |e|
133
+ @client.on :error, proc { |e|
190
134
  logger.error("#{e.message}")
191
135
  }
192
- @driver.start
193
- self.connect
194
- end
195
-
196
- def register_socket_io
197
- _monitor = @selector.register(@io, :r)
198
- _monitor.value = proc do
199
- begin
200
- msg = @io.read_nonblock(4096, exception: false)
201
- next if msg == :wait_readable
202
- if msg.nil?
203
- # socket closed
204
- logger.info "No message received from server. Connection reset"
205
- close_socket_io
206
- self.reset
207
- sleep 1
208
- else
209
- @driver.parse(msg)
210
- end
211
- rescue => e
212
- logger.error "#{e.message}"
213
- logger.debug "Backtrace:"
214
- e.backtrace.each {|msg| logger.debug msg}
215
- end
216
- end
217
- end
218
-
219
- def try_create_socket
220
- logger.info "try to open socket..."
221
- if Time.now - @last_error_report_time > 5.0
222
- @master.send_event(Event.new(Event::LCD_MESSAGE, "Initializing\nConnection..."))
223
- @last_error_report_time = Time.now
224
- end
225
- if Config.use_ssl
226
- OpenSSL::SSL::SSLSocket.new(TCPSocket.new(@host, @port)).connect
227
- else
228
- TCPSocket.new(@host, @port)
229
- end
230
- rescue
231
- nil
232
136
  end
233
137
 
234
- def close_socket_io
235
- logger.info "Socket IO Closed and Deregistered"
236
- @selector.deregister(@io)
237
- @io.close
238
- @io = nil
239
- end
240
-
241
- def write(string)
242
- @io.write(string)
243
- rescue
244
- logger.error "Write Error"
245
- close_socket_io
246
- self.reset
247
- end
248
138
 
249
139
  def process_packet(pkt)
250
140
  if self.auth_pending?
@@ -345,16 +235,6 @@ module Tamashii
345
235
  end
346
236
  end
347
237
 
348
- def clean_up
349
- super
350
- if @io
351
- @driver.close
352
- close_socket_io
353
- end
354
- rescue => e
355
- logger.warn "Error occured when clean up: #{e.to_s}"
356
- end
357
-
358
238
  # When data is back
359
239
  def handle_remote_response(ev_type, wrapped_ev_body)
360
240
  logger.debug "Remote packet back: #{ev_type} #{wrapped_ev_body}"
@@ -0,0 +1,39 @@
1
+ require 'tamashii/common'
2
+
3
+ module Tamashii
4
+ module Agent
5
+ class Connection
6
+ class RequestObserver
7
+
8
+ include Common::Loggable
9
+ def initialize(connection, id, ev_type, ev_body, future)
10
+ @connection = connection
11
+ @id = id
12
+ @ev_type = ev_type
13
+ @ev_body = ev_body
14
+ @future = future
15
+ end
16
+
17
+ def update(time, ev_data, reason)
18
+ if @future.fulfilled?
19
+ res_ev_type = ev_data[:ev_type]
20
+ res_ev_body = ev_data[:ev_body]
21
+ case res_ev_type
22
+ when Type::RFID_RESPONSE_JSON
23
+ logger.debug "Handled: #{res_ev_type}: #{res_ev_body}"
24
+ @connection.handle_card_result(JSON.parse(res_ev_body))
25
+ else
26
+ logger.warn "Unhandled packet result: #{res_ev_type}: #{res_ev_body}"
27
+ end
28
+ else
29
+ logger.error "#{@id} Failed with #{reason}"
30
+ @connection.on_request_timeout(@ev_type, @ev_body)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+
39
+
@@ -1,5 +1,5 @@
1
1
  module Tamashii
2
2
  module Agent
3
- VERSION = "0.2.8"
3
+ VERSION = "0.3.0"
4
4
  end
5
5
  end
@@ -40,6 +40,7 @@ Gem::Specification.new do |spec|
40
40
 
41
41
 
42
42
  spec.add_runtime_dependency "tamashii-common", ">=0.1.6"
43
+ spec.add_runtime_dependency "tamashii-client"
43
44
  spec.add_runtime_dependency "websocket-driver"
44
45
  spec.add_runtime_dependency "nio4r"
45
46
  spec.add_runtime_dependency "pi_piper"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tamashii-agent
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.8
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - 蒼時弦也
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2017-08-04 00:00:00.000000000 Z
13
+ date: 2017-09-07 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -138,6 +138,20 @@ dependencies:
138
138
  - - ">="
139
139
  - !ruby/object:Gem::Version
140
140
  version: 0.1.6
141
+ - !ruby/object:Gem::Dependency
142
+ name: tamashii-client
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ type: :runtime
149
+ prerelease: false
150
+ version_requirements: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
141
155
  - !ruby/object:Gem::Dependency
142
156
  name: websocket-driver
143
157
  requirement: !ruby/object:Gem::Requirement
@@ -269,6 +283,7 @@ files:
269
283
  - lib/tamashii/agent/component.rb
270
284
  - lib/tamashii/agent/config.rb
271
285
  - lib/tamashii/agent/connection.rb
286
+ - lib/tamashii/agent/connection/request_observer.rb
272
287
  - lib/tamashii/agent/device/fake_buzzer.rb
273
288
  - lib/tamashii/agent/device/fake_card_reader.rb
274
289
  - lib/tamashii/agent/device/fake_lcd.rb
@@ -304,7 +319,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
304
319
  version: '0'
305
320
  requirements: []
306
321
  rubyforge_project:
307
- rubygems_version: 2.6.11
322
+ rubygems_version: 2.5.1
308
323
  signing_key:
309
324
  specification_version: 4
310
325
  summary: The agent module for RubyConfTW checkin system.