da_funk 0.28.0 → 1.0.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/Gemfile.lock +2 -2
- data/RELEASE_NOTES.md +17 -0
- data/Rakefile +25 -26
- data/lib/{device → da_funk}/application.rb +39 -19
- data/lib/da_funk/engine.rb +0 -1
- data/lib/da_funk/file_parameter.rb +30 -12
- data/lib/da_funk/helper.rb +8 -8
- data/lib/da_funk/notification.rb +38 -0
- data/lib/{device → da_funk}/notification_callback.rb +1 -1
- data/lib/da_funk/notification_event.rb +27 -0
- data/lib/{device → da_funk}/params_dat.rb +17 -17
- data/lib/{device → da_funk}/transaction/download.rb +2 -2
- data/lib/{device → da_funk}/transaction/iso.rb +1 -1
- data/lib/da_funk/version.rb +1 -1
- data/lib/da_funk.rb +34 -19
- data/lib/device/io.rb +1 -1
- data/lib/device/runtime.rb +1 -7
- data/lib/device/setting.rb +2 -2
- data/out/da_funk.mrb +0 -0
- data/test/integration/mrb_eval_test.rb +3 -3
- data/test/integration/notification_test.rb +6 -6
- data/test/integration/params_dat_test.rb +2 -2
- data/test/unit/device/application_test.rb +3 -3
- data/test/unit/device/notification_event_test.rb +3 -3
- data/test/unit/device/notification_test.rb +1 -1
- data/test/unit/params_dat_test.rb +2 -2
- metadata +9 -16
- data/lib/device/helper.rb +0 -5
- data/lib/device/notification.rb +0 -173
- data/lib/device/notification_event.rb +0 -39
- data/lib/device/transaction/emv.rb +0 -45
- data/lib/serfx/commands.rb +0 -193
- data/lib/serfx/connection.rb +0 -165
- data/lib/serfx/exceptions.rb +0 -5
- data/lib/serfx/response.rb +0 -28
- data/lib/serfx.rb +0 -27
data/lib/device/setting.rb
CHANGED
@@ -112,11 +112,11 @@ class Device
|
|
112
112
|
|
113
113
|
# Custom Attributes
|
114
114
|
def self.tcp_recv_timeout
|
115
|
-
|
115
|
+
DaFunk::ParamsDat.file["tcp_recv_timeout"] || method_missing(:tcp_recv_timeout)
|
116
116
|
end
|
117
117
|
|
118
118
|
def self.attach_gprs_timeout
|
119
|
-
value = (
|
119
|
+
value = (DaFunk::ParamsDat.file["attach_gprs_timeout"] || method_missing(:attach_gprs_timeout))
|
120
120
|
value.to_s.empty? ? nil : value.to_s.to_i
|
121
121
|
end
|
122
122
|
end
|
data/out/da_funk.mrb
CHANGED
Binary file
|
@@ -6,8 +6,8 @@ class MrbEvalTest < DaFunk::Test.case
|
|
6
6
|
Device::Setting.company_name = "pc1"
|
7
7
|
Device::Setting.logical_number = "1234"
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
DaFunk::Notification.start
|
10
|
+
DaFunk::Notification.check
|
11
11
|
|
12
12
|
http = SimpleHttp.new('http', 'http://google.com', 443)
|
13
13
|
http.socket = Device::Network.socket.call
|
@@ -33,4 +33,4 @@ EOF
|
|
33
33
|
|
34
34
|
assert_equal 302, mrb_eval(command)
|
35
35
|
end
|
36
|
-
end
|
36
|
+
end
|
@@ -2,15 +2,15 @@
|
|
2
2
|
class NotificationTest < DaFunk::Test.case
|
3
3
|
def test_notification
|
4
4
|
Device::Setting.company_name = "pc1"
|
5
|
-
|
6
|
-
notification =
|
5
|
+
DaFunk::Notification.setup
|
6
|
+
notification = DaFunk::Notification.new
|
7
7
|
|
8
8
|
assert_equal nil, notification.check
|
9
9
|
notification.check
|
10
10
|
notification.check
|
11
11
|
assert notification.close
|
12
12
|
assert notification.closed?
|
13
|
-
notification =
|
13
|
+
notification = DaFunk::Notification.new
|
14
14
|
assert_equal nil, notification.check
|
15
15
|
notification.check
|
16
16
|
notification.check
|
@@ -21,12 +21,12 @@ class NotificationTest < DaFunk::Test.case
|
|
21
21
|
def test_notification_SHOW_MESSAGE
|
22
22
|
$status = nil
|
23
23
|
Device::Setting.company_name = "pc1"
|
24
|
-
|
25
|
-
|
24
|
+
DaFunk::Notification.setup
|
25
|
+
DaFunk::NotificationCallback.new "SHOW_MESSAGE", :on => Proc.new { |message,datetime|
|
26
26
|
$status = message
|
27
27
|
}
|
28
28
|
|
29
|
-
notification =
|
29
|
+
notification = DaFunk::Notification.new
|
30
30
|
|
31
31
|
p "Must create message AAAA"
|
32
32
|
p "Remember to Press Enter after message appears"
|
@@ -5,7 +5,7 @@ class ParamsDatTest < DaFunk::Test.case
|
|
5
5
|
Device::Setting.host = Device::Setting::HOST_STAGING
|
6
6
|
Device::Setting.company_name = "pc1"
|
7
7
|
Device::Setting.logical_number = "1410"
|
8
|
-
|
9
|
-
|
8
|
+
DaFunk::ParamsDat.update_apps
|
9
|
+
DaFunk::ParamsDat.application_menu
|
10
10
|
end
|
11
11
|
end
|
@@ -11,17 +11,17 @@ class ApplicationTest < DaFunk::Test.case
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def test_check_crc_true
|
14
|
-
application =
|
14
|
+
application = DaFunk::Application.new("TTT", @file_path, "ruby", nil)
|
15
15
|
assert_equal true, application.outdated?
|
16
16
|
end
|
17
17
|
|
18
18
|
def test_check_crc_false
|
19
|
-
application =
|
19
|
+
application = DaFunk::Application.new("TTT", @file_path, "ruby", @crc)
|
20
20
|
assert_equal false, application.outdated?
|
21
21
|
end
|
22
22
|
|
23
23
|
def test_check_crc_non_file
|
24
|
-
application =
|
24
|
+
application = DaFunk::Application.new("TTT", "./non_exists", "ruby", "1111")
|
25
25
|
assert_equal true, application.outdated?
|
26
26
|
end
|
27
27
|
|
@@ -8,7 +8,7 @@ class NotificationEventTest < DaFunk::Test.case
|
|
8
8
|
"Name" => "pc1;0101",
|
9
9
|
"Event" => "user"
|
10
10
|
}
|
11
|
-
@event =
|
11
|
+
@event = DaFunk::NotificationEvent.new(@stream_event)
|
12
12
|
end
|
13
13
|
|
14
14
|
def test_attr_coalesce
|
@@ -59,14 +59,14 @@ class NotificationEventTest < DaFunk::Test.case
|
|
59
59
|
def test_attr_one_parameter
|
60
60
|
stream_event = @stream_event.dup
|
61
61
|
stream_event["Payload"].gsub!("a", "|")
|
62
|
-
event =
|
62
|
+
event = DaFunk::NotificationEvent.new(stream_event)
|
63
63
|
assert_equal ["ge 62"], event.parameters
|
64
64
|
end
|
65
65
|
|
66
66
|
def test_attr_multiple_parameters
|
67
67
|
stream_event = @stream_event.dup
|
68
68
|
stream_event["Payload"].gsub!("e", "|")
|
69
|
-
event =
|
69
|
+
event = DaFunk::NotificationEvent.new(stream_event)
|
70
70
|
assert_equal ["ssag", " 62"], event.parameters
|
71
71
|
end
|
72
72
|
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
|
2
2
|
class ParamsDatTest < DaFunk::Test.case
|
3
3
|
def test_params_dat_not_nil_file
|
4
|
-
assert_equal false,
|
4
|
+
assert_equal false, DaFunk::ParamsDat.file.nil?
|
5
5
|
end
|
6
6
|
|
7
7
|
def test_params_dat_initialize_calling_file
|
8
|
-
assert
|
8
|
+
assert DaFunk::ParamsDat.file.hash.is_a? Hash
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: da_funk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thiago Scalone
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -152,6 +152,7 @@ files:
|
|
152
152
|
- guides/sample_transaction_iso8583.rb
|
153
153
|
- imgs/daft-punk-da-funk.jpg
|
154
154
|
- lib/da_funk.rb
|
155
|
+
- lib/da_funk/application.rb
|
155
156
|
- lib/da_funk/callback_flow.rb
|
156
157
|
- lib/da_funk/engine.rb
|
157
158
|
- lib/da_funk/event_handler.rb
|
@@ -162,33 +163,30 @@ files:
|
|
162
163
|
- lib/da_funk/i18n.rb
|
163
164
|
- lib/da_funk/i18n_error.rb
|
164
165
|
- lib/da_funk/iso8583.rb
|
166
|
+
- lib/da_funk/notification.rb
|
167
|
+
- lib/da_funk/notification_callback.rb
|
168
|
+
- lib/da_funk/notification_event.rb
|
169
|
+
- lib/da_funk/params_dat.rb
|
165
170
|
- lib/da_funk/rake_task.rb
|
166
171
|
- lib/da_funk/screen.rb
|
167
172
|
- lib/da_funk/screen_flow.rb
|
168
173
|
- lib/da_funk/struct.rb
|
169
174
|
- lib/da_funk/test.rb
|
175
|
+
- lib/da_funk/transaction/download.rb
|
176
|
+
- lib/da_funk/transaction/iso.rb
|
170
177
|
- lib/da_funk/version.rb
|
171
178
|
- lib/device.rb
|
172
|
-
- lib/device/application.rb
|
173
179
|
- lib/device/audio.rb
|
174
180
|
- lib/device/crypto.rb
|
175
181
|
- lib/device/display.rb
|
176
|
-
- lib/device/helper.rb
|
177
182
|
- lib/device/io.rb
|
178
183
|
- lib/device/magnetic.rb
|
179
184
|
- lib/device/network.rb
|
180
|
-
- lib/device/notification.rb
|
181
|
-
- lib/device/notification_callback.rb
|
182
|
-
- lib/device/notification_event.rb
|
183
|
-
- lib/device/params_dat.rb
|
184
185
|
- lib/device/printer.rb
|
185
186
|
- lib/device/runtime.rb
|
186
187
|
- lib/device/setting.rb
|
187
188
|
- lib/device/support.rb
|
188
189
|
- lib/device/system.rb
|
189
|
-
- lib/device/transaction/download.rb
|
190
|
-
- lib/device/transaction/emv.rb
|
191
|
-
- lib/device/transaction/iso.rb
|
192
190
|
- lib/device/version.rb
|
193
191
|
- lib/ext/array.rb
|
194
192
|
- lib/ext/float.rb
|
@@ -206,11 +204,6 @@ files:
|
|
206
204
|
- lib/iso8583/message.rb
|
207
205
|
- lib/iso8583/util.rb
|
208
206
|
- lib/iso8583/version.rb
|
209
|
-
- lib/serfx.rb
|
210
|
-
- lib/serfx/commands.rb
|
211
|
-
- lib/serfx/connection.rb
|
212
|
-
- lib/serfx/exceptions.rb
|
213
|
-
- lib/serfx/response.rb
|
214
207
|
- lib/zip.rb
|
215
208
|
- out/da_funk.mrb
|
216
209
|
- test/integration/getc_test.rb
|
data/lib/device/helper.rb
DELETED
data/lib/device/notification.rb
DELETED
@@ -1,173 +0,0 @@
|
|
1
|
-
|
2
|
-
class Device
|
3
|
-
class Notification
|
4
|
-
DEFAULT_TIMEOUT = 20
|
5
|
-
DEFAULT_INTERVAL = 10
|
6
|
-
DEFAULT_STREAM_TIMEOUT = 0
|
7
|
-
DEFAULT_CREATION_INTERVAL = 180
|
8
|
-
|
9
|
-
class << self
|
10
|
-
attr_accessor :callbacks, :current, :last_creation, :creation_interval, :last_event
|
11
|
-
end
|
12
|
-
|
13
|
-
self.callbacks = Hash.new
|
14
|
-
self.creation_interval = DEFAULT_CREATION_INTERVAL
|
15
|
-
|
16
|
-
attr_reader :fiber, :timeout, :interval, :last_check, :stream_timeout
|
17
|
-
|
18
|
-
def self.check
|
19
|
-
self.current.check if self.current
|
20
|
-
end
|
21
|
-
|
22
|
-
def self.execute(event)
|
23
|
-
calls = self.callbacks[event.callback]
|
24
|
-
return unless calls
|
25
|
-
[:before, :on, :after].each do |moment|
|
26
|
-
calls.each{|callback| callback.call(event, moment)}
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def self.schedule(callback)
|
31
|
-
self.callbacks[callback.description] ||= []
|
32
|
-
self.callbacks[callback.description] << callback
|
33
|
-
end
|
34
|
-
|
35
|
-
def self.config
|
36
|
-
self.creation_interval = Device::Setting.notification_socket_timeout.empty? ? DEFAULT_CREATION_INTERVAL : Device::Setting.notification_socket_timeout.to_i
|
37
|
-
notification_timeout = Device::Setting.notification_timeout.empty? ? DEFAULT_TIMEOUT : Device::Setting.notification_timeout.to_i
|
38
|
-
notification_interval = Device::Setting.notification_interval.empty? ? DEFAULT_INTERVAL : Device::Setting.notification_interval.to_i
|
39
|
-
notification_stream_timeout = Device::Setting.notification_stream_timeout.empty? ? DEFAULT_STREAM_TIMEOUT : Device::Setting.notification_stream_timeout.to_i
|
40
|
-
[notification_timeout, notification_interval, notification_stream_timeout]
|
41
|
-
end
|
42
|
-
|
43
|
-
def self.start
|
44
|
-
if create_fiber? && Device::Network.connected?
|
45
|
-
unless Device::Notification.current && Device::Notification.current.closed?
|
46
|
-
self.new(*self.config)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def self.create_fiber?(force = false)
|
52
|
-
(! Device::Setting.company_name.empty?) &&
|
53
|
-
(! Device::Setting.logical_number.empty?) &&
|
54
|
-
(force || self.valid_creation_interval?) &&
|
55
|
-
Device::ParamsDat.file["notification_enabled"] == "1"
|
56
|
-
end
|
57
|
-
|
58
|
-
def self.valid_creation_interval?
|
59
|
-
if @last_creation
|
60
|
-
(@last_creation + self.creation_interval) < Time.now
|
61
|
-
else
|
62
|
-
true
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def initialize(timeout = DEFAULT_TIMEOUT, interval = DEFAULT_INTERVAL, stream_timeout = DEFAULT_STREAM_TIMEOUT)
|
67
|
-
@timeout = timeout
|
68
|
-
@stream_timeout = stream_timeout
|
69
|
-
@interval = interval
|
70
|
-
Device::Notification.current = self
|
71
|
-
@fiber = create_fiber
|
72
|
-
end
|
73
|
-
|
74
|
-
# Check if there is any notification
|
75
|
-
def check
|
76
|
-
# TODO check if should execute this(because of connection exception)
|
77
|
-
if valid_check_interval? && Device::Network.connected?
|
78
|
-
if @fiber.alive?
|
79
|
-
if (notification = @fiber.resume)
|
80
|
-
Notification.execute(NotificationEvent.new(notification))
|
81
|
-
end
|
82
|
-
else
|
83
|
-
if Device::Notification.create_fiber?(true)
|
84
|
-
self.close
|
85
|
-
@fiber = create_fiber
|
86
|
-
end
|
87
|
-
end
|
88
|
-
@last_check = Time.now
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
# Close socket and finish Fiber execution
|
93
|
-
def close
|
94
|
-
if closed?
|
95
|
-
true
|
96
|
-
else
|
97
|
-
! @fiber.resume "close"
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
def closed?
|
102
|
-
! @fiber.alive?
|
103
|
-
end
|
104
|
-
|
105
|
-
def valid_check_interval?
|
106
|
-
if @last_check
|
107
|
-
(@last_check + self.interval) < Time.now
|
108
|
-
else
|
109
|
-
true
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
def valid_event_interval?
|
114
|
-
if @last_event
|
115
|
-
(@last_event + Notification.creation_interval) < Time.now
|
116
|
-
else
|
117
|
-
true
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
private
|
122
|
-
def reply(conn, ev)
|
123
|
-
if ev.is_a?(Hash)
|
124
|
-
if ev["Event"] == "user" && ev["Payload"] && ev["Payload"].include?("Id")
|
125
|
-
index = ev["Payload"].index("\"Id")
|
126
|
-
id = ev["Payload"][(index+7)..(index+38)]
|
127
|
-
@last_event = Time.now
|
128
|
-
conn.event(event_name, "{\"Id\"=>\"#{id}\"}", false)
|
129
|
-
end
|
130
|
-
elsif ev.nil?
|
131
|
-
if self.valid_event_interval?
|
132
|
-
@last_event = Time.now
|
133
|
-
conn.event(event_name, "", false)
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
def check_errors(exception)
|
139
|
-
case exception.message
|
140
|
-
when "Invalid authentication token"
|
141
|
-
Device::Setting.cw_pos_timezone = "" # Clear timezone if authentication error
|
142
|
-
when "Socket closed"
|
143
|
-
else
|
144
|
-
end
|
145
|
-
false
|
146
|
-
end
|
147
|
-
|
148
|
-
def create_fiber
|
149
|
-
Fiber.new do
|
150
|
-
begin
|
151
|
-
Serfx.connect(socket_block: Device::Network.socket, timeout: timeout, stream_timeout: stream_timeout) do |conn|
|
152
|
-
@last_event = Time.now
|
153
|
-
conn.auth(CloudwalkTOTP.at)
|
154
|
-
Device::Notification.last_creation = Time.now
|
155
|
-
conn.stream(subscription) { |ev| reply(conn, ev) }
|
156
|
-
end
|
157
|
-
true
|
158
|
-
rescue => exception
|
159
|
-
check_errors(exception)
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
def subscription
|
165
|
-
"user:#{event_name}"
|
166
|
-
end
|
167
|
-
|
168
|
-
def event_name
|
169
|
-
"#{Device::Setting.company_name};#{Device::Setting.logical_number}"
|
170
|
-
end
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
@@ -1,39 +0,0 @@
|
|
1
|
-
class Device
|
2
|
-
class NotificationEvent
|
3
|
-
attr_reader :values, :coalesce, :ltime, :payload, :name, :event, :message, :value, :body, :callback, :parameters
|
4
|
-
|
5
|
-
def initialize(values)
|
6
|
-
@values = values
|
7
|
-
parse(values)
|
8
|
-
end
|
9
|
-
|
10
|
-
def type
|
11
|
-
@event
|
12
|
-
end
|
13
|
-
|
14
|
-
private
|
15
|
-
def parse(values)
|
16
|
-
@coalesce = values["Coalesce"]
|
17
|
-
@ltime = values["LTime"]
|
18
|
-
@payload = values["Payload"]
|
19
|
-
@name = values["Name"]
|
20
|
-
@event = values["Event"]
|
21
|
-
|
22
|
-
@message = payload.to_s.gsub("=>", " : ")
|
23
|
-
@value = JSON.parse(@message) unless @message.empty?
|
24
|
-
@body = extract_body(value)
|
25
|
-
|
26
|
-
@callback, *@parameters = @body.to_s.split("|")
|
27
|
-
end
|
28
|
-
|
29
|
-
def extract_body(value)
|
30
|
-
unless value.nil?
|
31
|
-
return value["Body"] if value["Body"]
|
32
|
-
# TODO: For some reason the JSON parse has a problem
|
33
|
-
# and extract "B" from "Body"
|
34
|
-
return value["ody"] if value["ody"]
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
@@ -1,45 +0,0 @@
|
|
1
|
-
|
2
|
-
class Device
|
3
|
-
class Transaction
|
4
|
-
class EMV
|
5
|
-
class << self
|
6
|
-
attr_accessor :status, :mk_slot, :pinpad_type, :pinpad_wk, :show_amout
|
7
|
-
end
|
8
|
-
|
9
|
-
attr_accessor :data, :info
|
10
|
-
|
11
|
-
def self.open(mk_slot, pinpad_type, pinpad_wk, show_amout)
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.close
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.load_tables(acquirer)
|
18
|
-
end
|
19
|
-
|
20
|
-
def clean
|
21
|
-
@data = {:init => {}, :process => {}, :finish => {}}
|
22
|
-
@info = {:init => {}, :process => {}, :finish => {}}
|
23
|
-
end
|
24
|
-
|
25
|
-
def init
|
26
|
-
end
|
27
|
-
|
28
|
-
def response
|
29
|
-
end
|
30
|
-
|
31
|
-
def parameters
|
32
|
-
end
|
33
|
-
|
34
|
-
def timeout=(seconds)
|
35
|
-
end
|
36
|
-
|
37
|
-
def timeout
|
38
|
-
end
|
39
|
-
|
40
|
-
def remove_card
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
data/lib/serfx/commands.rb
DELETED
@@ -1,193 +0,0 @@
|
|
1
|
-
module Serfx
|
2
|
-
# Implements all of Serf's rpc commands using
|
3
|
-
# Serfx::Connection#request method
|
4
|
-
module Commands
|
5
|
-
# performs initial hanshake of an RPC session. Handshake has to be the
|
6
|
-
# first command to be invoked during an RPC session.
|
7
|
-
#
|
8
|
-
# @return [Response]
|
9
|
-
def handshake
|
10
|
-
tcp_send(:handshake, 'Version' => 1, 'SerialNumber' => Device::System.serial)
|
11
|
-
read_response(:handshake)
|
12
|
-
end
|
13
|
-
|
14
|
-
# authenticate against the serf agent. if RPC credentials are setup, then
|
15
|
-
# `auth` has to be second command, immediately after `handshake`.
|
16
|
-
#
|
17
|
-
# @return [Response]
|
18
|
-
def auth(key = @authkey)
|
19
|
-
tcp_send(:auth, 'AuthKey' => key)
|
20
|
-
read_response(:auth)
|
21
|
-
end
|
22
|
-
# fires an user event
|
23
|
-
#
|
24
|
-
# @param name [String] a string representing name of the event
|
25
|
-
# @param payload [String] payload, default is nil
|
26
|
-
# @param coalesce [Boolena] whether serf should coalesce events within
|
27
|
-
# same name during similar time frame
|
28
|
-
# @return [Response]
|
29
|
-
def event(name, payload = nil, coalesce = true)
|
30
|
-
event = {
|
31
|
-
'Name' => name,
|
32
|
-
'Coalesce' => coalesce
|
33
|
-
}
|
34
|
-
event['Payload'] = payload unless payload.nil?
|
35
|
-
request(:event, event)
|
36
|
-
end
|
37
|
-
|
38
|
-
# force a failed node to leave the cluster
|
39
|
-
#
|
40
|
-
# @param node [String] name of the failed node
|
41
|
-
# @return [Response]
|
42
|
-
def force_leave(node)
|
43
|
-
request(:force_leave, 'Node' => node)
|
44
|
-
end
|
45
|
-
|
46
|
-
# join an existing cluster.
|
47
|
-
#
|
48
|
-
# @param existing [Array] an array of existing serf agents
|
49
|
-
# @param replay [Boolean] Whether events should be replayed upon joining
|
50
|
-
# @return [Response]
|
51
|
-
def join(existing, replay = false)
|
52
|
-
request(:join, 'Existing' => existing, 'Replay' => replay)
|
53
|
-
end
|
54
|
-
|
55
|
-
# obtain the list of existing members
|
56
|
-
#
|
57
|
-
# @return [Response]
|
58
|
-
def members
|
59
|
-
request(:members)
|
60
|
-
end
|
61
|
-
|
62
|
-
# obatin the list of cluster members, filtered by tags.
|
63
|
-
#
|
64
|
-
# @param tags [Array] an array of tags for filter
|
65
|
-
# @param status [Boolean] filter members based on their satatus
|
66
|
-
# @param name [String] filter based on exact name or pattern.
|
67
|
-
#
|
68
|
-
# @return [Response]
|
69
|
-
def members_filtered(tags, status = 'alive', name = nil)
|
70
|
-
filter = {
|
71
|
-
'Tags' => tags,
|
72
|
-
'Status' => status
|
73
|
-
}
|
74
|
-
filter['Name'] = name unless name.nil?
|
75
|
-
request(:members_filtered, filter)
|
76
|
-
end
|
77
|
-
|
78
|
-
# alter the tags on a Serf agent while it is running. A member-update
|
79
|
-
# event will be triggered immediately to notify the other agents in the
|
80
|
-
# cluster of the change. The tags command can add new tags, modify
|
81
|
-
# existing tags, or delete tags
|
82
|
-
#
|
83
|
-
# @param tags [Hash] a hash representing tags as key-value pairs
|
84
|
-
# @param delete_tags [Array] an array of tags to be deleted
|
85
|
-
# @return [Response]
|
86
|
-
def tags(tags, delete_tags = [])
|
87
|
-
request(:tags, 'Tags' => tags, 'DeleteTags' => delete_tags)
|
88
|
-
end
|
89
|
-
|
90
|
-
# subscribe to a stream of all events matching a given type filter.
|
91
|
-
# Events will continue to be sent until the stream is stopped
|
92
|
-
#
|
93
|
-
# @param types [String] comma separated list of events
|
94
|
-
# @return [Thread, Response]
|
95
|
-
def stream(types, &block)
|
96
|
-
res = request(:stream, {'Type' => types})
|
97
|
-
loop do
|
98
|
-
header, ev = read_data(self.stream_timeout)
|
99
|
-
check_rpc_error!(header)
|
100
|
-
block.call(ev) if block_given?
|
101
|
-
break unless fiber_yield!(ev)
|
102
|
-
end
|
103
|
-
res
|
104
|
-
end
|
105
|
-
|
106
|
-
# monitor is similar to the stream command, but instead of events it
|
107
|
-
# subscribes the channel to log messages from the agent
|
108
|
-
#
|
109
|
-
# @param loglevel [String]
|
110
|
-
# @return [Response]
|
111
|
-
def monitor(loglevel = 'debug')
|
112
|
-
request(:monitor, 'LogLevel' => loglevel.upcase)
|
113
|
-
end
|
114
|
-
|
115
|
-
# stop is used to stop either a stream or monitor
|
116
|
-
def stop(sequence_number)
|
117
|
-
tcp_send(:stop, 'Stop' => sequence_number)
|
118
|
-
end
|
119
|
-
|
120
|
-
# leave is used trigger a graceful leave and shutdown of the current agent
|
121
|
-
#
|
122
|
-
# @return [Response]
|
123
|
-
def leave
|
124
|
-
request(:leave)
|
125
|
-
end
|
126
|
-
|
127
|
-
# query is used to issue a new query
|
128
|
-
#
|
129
|
-
# @param name [String] name of the query
|
130
|
-
# @param payload [String] payload for this query event
|
131
|
-
# @param opts [Hash] additional query options
|
132
|
-
# @return [Response]
|
133
|
-
def query(name, payload, opts = {}, &block)
|
134
|
-
params = { 'Name' => name, 'Payload' => payload }
|
135
|
-
params.merge!(opts)
|
136
|
-
res = request(:query, params)
|
137
|
-
loop do
|
138
|
-
header, ev = read_data
|
139
|
-
check_rpc_error!(header)
|
140
|
-
block.call(ev) if block_given?
|
141
|
-
break unless fiber_yield!(ev)
|
142
|
-
end
|
143
|
-
res
|
144
|
-
end
|
145
|
-
|
146
|
-
# respond is used with `stream` to subscribe to queries and then respond.
|
147
|
-
#
|
148
|
-
# @param id [Integer] an opaque value that is assigned by the IPC layer
|
149
|
-
# @param payload [String] payload for the response event
|
150
|
-
# @return [Response]
|
151
|
-
def respond(id, payload)
|
152
|
-
request(:respond, 'ID' => id, 'Payload' => payload)
|
153
|
-
end
|
154
|
-
|
155
|
-
# install a new encryption key onto the cluster's keyring
|
156
|
-
#
|
157
|
-
# @param key [String] 16 bytes of base64-encoded data.
|
158
|
-
# @return [Response]
|
159
|
-
def install_key(key)
|
160
|
-
request(:install_key, 'Key' => key)
|
161
|
-
end
|
162
|
-
|
163
|
-
# change the primary key, which is used to encrypt messages
|
164
|
-
#
|
165
|
-
# @param key [String] 16 bytes of base64-encoded data.
|
166
|
-
# @return [Response]
|
167
|
-
def use_key(key)
|
168
|
-
request(:use_key, 'Key' => key)
|
169
|
-
end
|
170
|
-
|
171
|
-
# remove a key from the cluster's keyring
|
172
|
-
#
|
173
|
-
# @param key [String] 16 bytes of base64-encoded data.
|
174
|
-
# @return [Response]
|
175
|
-
def remove_key(key)
|
176
|
-
request(:remove_key, 'Key' => key)
|
177
|
-
end
|
178
|
-
|
179
|
-
# return a list of all encryption keys currently in use on the cluster
|
180
|
-
#
|
181
|
-
# @return [Response]
|
182
|
-
def list_keys
|
183
|
-
request(:list_keys)
|
184
|
-
end
|
185
|
-
|
186
|
-
# obtain stats about the agent(same as info command)
|
187
|
-
#
|
188
|
-
# @return [Response]
|
189
|
-
def stats
|
190
|
-
request(:stats)
|
191
|
-
end
|
192
|
-
end
|
193
|
-
end
|