tamashii-agent 0.2.8 → 0.3.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/lib/tamashii/agent/config.rb +15 -6
- data/lib/tamashii/agent/connection.rb +27 -147
- data/lib/tamashii/agent/connection/request_observer.rb +39 -0
- data/lib/tamashii/agent/version.rb +1 -1
- data/tamashii-agent.gemspec +1 -0
- metadata +18 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5de4cba829b0eab020881898175c0dabd45f9a94
|
4
|
+
data.tar.gz: 1700db0dc1f111c39871a195a1fc82919ceef6a7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
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
|
-
|
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: :
|
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
|
-
|
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
|
-
@
|
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
|
-
@
|
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
|
-
@
|
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
|
173
|
-
|
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
|
-
@
|
181
|
-
|
182
|
-
|
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
|
-
@
|
186
|
-
pkt = Packet.load(
|
129
|
+
@client.on :message, proc { |data|
|
130
|
+
pkt = Packet.load(data)
|
187
131
|
process_packet(pkt) if pkt
|
188
132
|
}
|
189
|
-
@
|
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
|
+
|
data/tamashii-agent.gemspec
CHANGED
@@ -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.
|
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-
|
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.
|
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.
|