kinetic-ruby 0.3.8 → 0.5.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/Rakefile +73 -19
- data/lib/kinetic-ruby.rb +15 -14
- data/lib/kinetic_logger.rb +36 -19
- data/lib/kinetic_pdu.rb +71 -0
- data/lib/kinetic_proto.rb +25 -40
- data/lib/kinetic_server.rb +87 -54
- data/lib/version.rb +4 -0
- data/lib/version.rb.erb +4 -0
- data/tasks/kinetic-ruby.rake +22 -12
- metadata +18 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: baa7b2b2078f4a6d89936a205aecb57c9d5f2f4b
|
4
|
+
data.tar.gz: e670900a889bab053e1adb4b8fb6d90e9275c102
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a875dd98f18161bdd2de90b117ac7d572186228bc595f707fbf4ab383af0e14a629ee0e62af76f00b133a1037f9c264e2cd478d7908863722b99f5a2208a353c
|
7
|
+
data.tar.gz: 8d77c7d4b5693adc2c584891989b45cbca2f2da239a24ca8e95cb9275ef7f9fbb3067b30bf1ba311c38d04c2a95ff46bd5303b27d3b12348f6e0843dee3f612c
|
data/Rakefile
CHANGED
@@ -1,60 +1,114 @@
|
|
1
|
-
HERE = File.expand_path(File.dirname(__FILE__))
|
2
|
-
$LOAD_PATH.unshift File.join(HERE, 'lib')
|
3
|
-
|
4
1
|
require 'rake'
|
5
2
|
require 'rake/clean'
|
3
|
+
$LOAD_PATH.unshift File.expand_path('lib')
|
6
4
|
require 'kinetic-ruby'
|
7
5
|
|
8
|
-
|
6
|
+
KineticRuby::Rake::load_tasks()
|
9
7
|
|
10
8
|
CLEAN.include ['*.gem', '*.log']
|
11
9
|
|
10
|
+
namespace :test do
|
11
|
+
desc "Test Kinetic Ruby server"
|
12
|
+
task :server => 'kinetic:server:start' do
|
13
|
+
report "Started Kinetic Ruby server!"
|
14
|
+
sleep 2.0
|
15
|
+
client = Thread.new do
|
16
|
+
report "Connecting test client to #{$kinetic_server.host}:#{$kinetic_server.port}..."
|
17
|
+
sh "telnet #{$kinetic_server.host} #{$kinetic_server.port}"
|
18
|
+
end
|
19
|
+
sleep 1.0
|
20
|
+
raise "Failed connecting a client to Kinetic Ruby server!" unless $kinetic_server.connected
|
21
|
+
client.exit
|
22
|
+
client.join(2.0)
|
23
|
+
$kinetic_server.shutdown unless $kinetic_server.nil?
|
24
|
+
$kinetic_server = nil
|
25
|
+
sleep 2.0
|
26
|
+
report "Kinetic Ruby server test successful!"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
12
30
|
desc "Run example"
|
13
31
|
task :example do
|
14
|
-
|
32
|
+
kl = KineticRuby::Logger.new
|
33
|
+
kr = KineticRuby::Proto.new(kl)
|
15
34
|
kr.test_kinetic_proto
|
16
35
|
end
|
17
36
|
|
18
37
|
desc "Run example w/o logging"
|
19
38
|
task :example_no_log do
|
20
|
-
|
39
|
+
kl = KineticRuby::Logger.new(KineticRuby::Logger::LOG_LEVEL_NONE)
|
40
|
+
kr = KineticRuby::Proto.new(kl)
|
21
41
|
kr.test_kinetic_proto
|
22
42
|
end
|
23
43
|
|
24
44
|
desc "Run example w/ verbose logging"
|
25
45
|
task :example_verbose_log do
|
26
|
-
|
46
|
+
kl = KineticRuby::Logger.new(KineticRuby::Logger::LOG_LEVEL_VERBOSE)
|
47
|
+
kr = KineticRuby::Proto.new(kl)
|
27
48
|
kr.test_kinetic_proto
|
28
49
|
end
|
29
50
|
|
30
|
-
task :
|
51
|
+
task :update_version_info do
|
52
|
+
require 'erb'
|
53
|
+
proto_ver = ''
|
54
|
+
FileUtils.cd 'vendor/kinetic-protocol' do
|
55
|
+
proto_ver = 'v' + `git describe --tags 2> /dev/null`.strip
|
56
|
+
proto_ver = 'v<Unknown!>' if proto_ver !~ /^v\d+\.\d+\.\d+/
|
57
|
+
end
|
58
|
+
template = File.read('lib/version.rb.erb')
|
59
|
+
content = ERB.new(template).result(binding)
|
60
|
+
File.open('lib/version.rb', "w+"){|f| f.write(content) }
|
61
|
+
new_ver = content.match(/ VERSION = '(.+)'.+ PROTOCOL_VERSION = '(.+)'/m)
|
62
|
+
raise "Failed to parse updated version info!" unless new_ver
|
63
|
+
if ((new_ver[1] != KineticRuby::VERSION) ||
|
64
|
+
(new_ver[2] != KineticRuby::PROTOCOL_VERSION))
|
65
|
+
report "Kinetic Ruby version info has changed! You must re-run Rake to resync!\nExiting..."
|
66
|
+
exit 1
|
67
|
+
end
|
68
|
+
end
|
31
69
|
|
32
70
|
desc "Build kinetic-ruby gem"
|
33
|
-
task :build do
|
34
|
-
|
71
|
+
task :build => :update_version_info do
|
72
|
+
report("Building kinetic-ruby gem v#{KineticRuby::VERSION} w/ Kinetic Protocol #{KineticRuby::PROTOCOL_VERSION}", true)
|
35
73
|
sh "gem build kinetic-ruby.gemspec"
|
36
|
-
|
74
|
+
report
|
75
|
+
end
|
76
|
+
|
77
|
+
# desc "Build and install kinetic-ruby gem"
|
78
|
+
task :install => :build do
|
79
|
+
report("Installing KineticRuby gem v#{KineticRuby::VERSION}", true)
|
80
|
+
sh "sudo gem uninstall --all kinetic-ruby"
|
81
|
+
sh "sudo gem install --no-doc kinetic-ruby-#{KineticRuby::VERSION}.gem"
|
37
82
|
end
|
38
83
|
|
39
84
|
task :release => :ci do
|
40
|
-
|
41
|
-
proto_ver = KineticRuby::
|
85
|
+
report("Publishing kinetic-ruby gem v#{KineticRuby::VERSION} to RubyGems", true)
|
86
|
+
proto_ver = KineticRuby::PROTOCOL_VERSION
|
42
87
|
if proto_ver !~ /v\d+\.\d+\.\d+/
|
43
88
|
raise "Can only publish gem with a release tag of Kinetic Protocol!\n" +
|
44
89
|
" reported Kinetic Protocol version: "
|
45
90
|
end
|
46
|
-
|
91
|
+
report "Releasing gem built w/ Kinetic Protocol #{proto_ver}"
|
47
92
|
sh "gem push kinetic-ruby-#{KineticRuby::VERSION}.gem"
|
48
|
-
|
93
|
+
report
|
49
94
|
end
|
50
95
|
|
51
|
-
task :
|
96
|
+
task :default => [:example, 'test:server']
|
97
|
+
|
98
|
+
task :ci =>[:clobber, :example, :example_no_log, 'test:server', :build] do
|
99
|
+
report("Kinetic Ruby Test Results", true)
|
100
|
+
report "SUCCESSFUL!"
|
101
|
+
end
|
52
102
|
|
53
103
|
#############################################
|
54
104
|
# Helper methods and goodies
|
55
105
|
|
56
|
-
def
|
57
|
-
|
106
|
+
def report(msg='', banner=false)
|
107
|
+
$stderr.flush
|
108
|
+
if banner
|
109
|
+
len = msg.length
|
110
|
+
msg = "\n#{msg}\n#{'-'*len}"
|
111
|
+
end
|
58
112
|
puts msg
|
59
|
-
|
113
|
+
$stdout.flush
|
60
114
|
end
|
data/lib/kinetic-ruby.rb
CHANGED
@@ -1,18 +1,19 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require_relative 'kinetic_server'
|
1
|
+
# Preload all library files
|
2
|
+
require 'fileutils'
|
4
3
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
TEST_KINETIC_PORT = 8999
|
10
|
-
|
11
|
-
kp_tag = ''
|
12
|
-
FileUtils.cd "./vendor/kinetic-protocol" do
|
13
|
-
kp_tag = 'v' + `git describe --tags`.strip
|
14
|
-
kp_tag = "<Unknown Kinetic Protocol version!>" if kp_tag !~ /^v\d+\.\d+\.\d+/
|
4
|
+
FileUtils.cd(File.dirname(__FILE__)) do
|
5
|
+
Dir['./**/*.rb'].each do |f|
|
6
|
+
mod = f.sub(/.rb/, '')
|
7
|
+
require mod
|
15
8
|
end
|
16
|
-
|
9
|
+
end
|
17
10
|
|
11
|
+
module KineticRuby
|
12
|
+
module Rake
|
13
|
+
def self.load_tasks
|
14
|
+
Dir["#{File.dirname(__FILE__)}/../tasks/**/*.rake"].each do |tasks|
|
15
|
+
load tasks
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
18
19
|
end
|
data/lib/kinetic_logger.rb
CHANGED
@@ -1,9 +1,6 @@
|
|
1
1
|
module KineticRuby
|
2
|
+
|
2
3
|
class Logger
|
3
|
-
def initialize(logging_level=LOG_LEVEL_INFO, stream=$stdout)
|
4
|
-
set_log_level(logging_level)
|
5
|
-
@stream = stream
|
6
|
-
end
|
7
4
|
|
8
5
|
LOG_LEVELS = [
|
9
6
|
LOG_LEVEL_NONE = 0,
|
@@ -12,32 +9,52 @@ module KineticRuby
|
|
12
9
|
LOG_LEVEL_VERBOSE = 3,
|
13
10
|
]
|
14
11
|
|
15
|
-
def
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
12
|
+
def initialize(log_level=LOG_LEVEL_INFO, stream=$stdout)
|
13
|
+
set_level log_level
|
14
|
+
@stream = stream
|
15
|
+
end
|
16
|
+
|
17
|
+
def level=(log_level)
|
18
|
+
set_level(log_level)
|
19
|
+
end
|
20
|
+
|
21
|
+
def level
|
22
|
+
@level.dup
|
21
23
|
end
|
22
24
|
|
23
|
-
def log_info(msg='')
|
24
|
-
log_message(msg) if @level >= LOG_LEVEL_INFO
|
25
|
+
def log_info(msg='', banner=nil)
|
26
|
+
log_message(msg, banner) if @level >= LOG_LEVEL_INFO
|
25
27
|
end
|
28
|
+
alias logi log_info
|
26
29
|
alias log log_info
|
27
30
|
|
28
|
-
def log_err(msg='')
|
29
|
-
log_message(msg,
|
31
|
+
def log_err(msg='', banner=nil)
|
32
|
+
log_message(msg, banner) if @level >= LOG_LEVEL_ERROR
|
30
33
|
end
|
34
|
+
alias loge log_err
|
31
35
|
|
32
|
-
def log_verbose(msg='')
|
33
|
-
log_message(msg) if @level >= LOG_LEVEL_VERBOSE
|
36
|
+
def log_verbose(msg='', banner=nil)
|
37
|
+
log_message(msg, banner) if @level >= LOG_LEVEL_VERBOSE
|
34
38
|
end
|
39
|
+
alias logv log_verbose
|
35
40
|
|
36
|
-
|
37
|
-
|
38
|
-
|
41
|
+
private
|
42
|
+
|
43
|
+
def set_level(log_level)
|
44
|
+
if !LOG_LEVELS.include? log_level
|
45
|
+
raise "\nInvalid LOG_LEVEL specified: #{log_level}\nValid levels:\n " +
|
46
|
+
LOG_LEVELS.map{|l|"#{self.class}::#{l}"}.join("\n ") + "\n\n"
|
47
|
+
end
|
48
|
+
@level = log_level
|
49
|
+
end
|
50
|
+
|
51
|
+
LOG_BANNER = "\n----------------------------------------"
|
52
|
+
|
53
|
+
def log_message(msg, banner)
|
54
|
+
msg += LOG_BANNER if (banner && msg && !msg.empty?)
|
39
55
|
@stream.puts msg
|
40
56
|
@stream.flush
|
41
57
|
end
|
58
|
+
|
42
59
|
end
|
43
60
|
end
|
data/lib/kinetic_pdu.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
module KineticRuby
|
2
|
+
|
3
|
+
attr_reader :header, :protobuf, :value
|
4
|
+
|
5
|
+
class PDU
|
6
|
+
|
7
|
+
def initialize(logger, raw=nil)
|
8
|
+
raise "Invalid logger specified!" unless logger
|
9
|
+
@logger = logger
|
10
|
+
parse(raw)
|
11
|
+
end
|
12
|
+
|
13
|
+
def parse(raw)
|
14
|
+
@header = parse_header(raw)
|
15
|
+
@protobuf = parse_protobuf(raw) if @header
|
16
|
+
@value = parse_value(raw) if (@header && @protobuf)
|
17
|
+
return (@header && @protobuf && @value)
|
18
|
+
end
|
19
|
+
|
20
|
+
def length
|
21
|
+
len = 0
|
22
|
+
len += HEADER_LENGTH if @header
|
23
|
+
len += @header[:protobuf_length] if @protobuf
|
24
|
+
len += @header[:value_length] if @value
|
25
|
+
return len
|
26
|
+
end
|
27
|
+
alias size length
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
HEADER_LENGTH = 1 + 4 + 4 # version_prefix + protobuf_length + value_length
|
32
|
+
|
33
|
+
def parse_header(raw)
|
34
|
+
return nil unless (raw && raw.length <= HEADER_LENGTH)
|
35
|
+
{
|
36
|
+
version_prefix: raw[0],
|
37
|
+
protobuf_length: parse_nbo_int32(raw.byteslice(1..4)),
|
38
|
+
value_length: parse_nbo_int32(raw.byteslice(5..9))
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
def parse_protobuf(raw)
|
43
|
+
min_length = (HEADER_LENGTH + @header[:protobuf_length])
|
44
|
+
return nil unless (@header && raw.length >= min_length)
|
45
|
+
start_idx = HEADER_LENGTH
|
46
|
+
end_idx = HEADER_LENGTH + min_length - 1
|
47
|
+
protobuf = raw.byteslice(start_idx, end_idx)
|
48
|
+
Seagate::Kinetic::Message.decode(protobuf)
|
49
|
+
end
|
50
|
+
|
51
|
+
def parse_value(raw)
|
52
|
+
min_length = (HEADER_LENGTH + @header[:protobuf_length] + @header[:value_length])
|
53
|
+
return nil unless (@header && @protobuf && raw.length >= min_length)
|
54
|
+
start_idx = HEADER_LENGTH + @header[:protobuf_length]
|
55
|
+
end_idx = start_idx + @header[:protobuf_length] - 1
|
56
|
+
@value = raw.byteslice(start_idx, end_idx)
|
57
|
+
end
|
58
|
+
|
59
|
+
def parse_nbo_int32(data)
|
60
|
+
raise "Not enough data to parse NBO integer!" unless data.length >= 4
|
61
|
+
val = 0
|
62
|
+
data.each_byte do |byte|
|
63
|
+
val <<= 8
|
64
|
+
val += byte
|
65
|
+
end
|
66
|
+
return val
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
data/lib/kinetic_proto.rb
CHANGED
@@ -1,48 +1,31 @@
|
|
1
1
|
require 'yaml'
|
2
|
-
require 'fileutils'
|
3
|
-
require_relative 'kinetic_logger'
|
4
|
-
require_relative 'kinetic_server'
|
5
2
|
|
6
3
|
module KineticRuby
|
7
4
|
|
8
5
|
class Proto
|
9
6
|
|
10
|
-
|
11
|
-
|
7
|
+
VERSION_PREFIX = 'F'
|
8
|
+
|
9
|
+
def initialize(logger)
|
10
|
+
@logger = logger
|
12
11
|
@message_out = nil
|
13
12
|
@message_in = nil
|
14
|
-
@logger = KineticRuby::Logger.new(log_level)
|
15
13
|
end
|
16
14
|
|
17
15
|
def decode(buf)
|
18
16
|
@message_in = Seagate::Kinetic::Message.decode(buf)
|
19
|
-
|
20
17
|
@logger.log
|
21
|
-
@logger.log
|
22
|
-
@logger.log
|
23
|
-
|
24
|
-
@logger.log " command:"
|
25
|
-
@message_in.command.to_yaml.each_line{|l| @logger.log " #{l}"}
|
18
|
+
@logger.log("\n#{@message_in.class} - Decoding", true)
|
19
|
+
@logger.log ' command:'
|
20
|
+
@message_in.command.to_yaml.each_line{|line| @logger.log ' ' + line}
|
26
21
|
@logger.log
|
27
22
|
end
|
28
23
|
|
29
24
|
def test_encode
|
30
25
|
pb = Seagate::Kinetic::Message.new
|
31
26
|
|
32
|
-
@logger.log
|
33
|
-
|
34
|
-
@logger.log "---------------------------------------"
|
35
|
-
|
36
|
-
@logger.log_verbose " fields:"
|
37
|
-
pb.fields.sort.each{|f| @logger.log_verbose " #{f}"}
|
38
|
-
@logger.log_verbose
|
39
|
-
|
40
|
-
@logger.log_verbose " hmac:"
|
41
|
-
pb.hmac = "0123456789ABCDEF0123"
|
42
|
-
@logger.log_verbose " #{pb.hmac.inspect}"
|
43
|
-
@logger.log_verbose
|
44
|
-
|
45
|
-
@logger.log " command:"
|
27
|
+
@logger.log("\n#{pb.class} - Encoding", true)
|
28
|
+
pb.hmac = '0123456789ABCDEF0123'
|
46
29
|
pb.command = Seagate::Kinetic::Message::Command.new(
|
47
30
|
header: Seagate::Kinetic::Message::Header.new(
|
48
31
|
clusterVersion: 0x1122334455667788,
|
@@ -55,24 +38,26 @@ module KineticRuby
|
|
55
38
|
),
|
56
39
|
status: Seagate::Kinetic::Message::Status.new(
|
57
40
|
code: Seagate::Kinetic::Message::Status::StatusCode::NO_SUCH_HMAC_ALGORITHM,
|
58
|
-
statusMessage:
|
59
|
-
detailedMessage:
|
41
|
+
statusMessage: 'The specified HMAC security algorithm does not exist!',
|
42
|
+
detailedMessage: 'YOUCH!'
|
60
43
|
),
|
61
44
|
)
|
62
|
-
pb.
|
63
|
-
@logger.log
|
64
|
-
|
45
|
+
encoded = pb.encode
|
65
46
|
@message_out = pb
|
66
47
|
|
67
|
-
@logger.
|
68
|
-
|
69
|
-
@logger.log_verbose
|
70
|
-
|
71
|
-
@logger.
|
48
|
+
@logger.log_verbose ' fields:'
|
49
|
+
pb.fields.sort.each{|f| @logger.log_verbose(" #{f}")}
|
50
|
+
@logger.log_verbose " hmac:\n #{pb.hmac}"
|
51
|
+
|
52
|
+
@logger.log ' command:'
|
53
|
+
pb.command.to_yaml.each_line{|l| @logger.log(" #{l}")}
|
54
|
+
@logger.log ' encoded:'
|
55
|
+
@logger.log ' Length: ' + encoded.length.to_s + ' bytes'
|
56
|
+
|
57
|
+
@logger.log_verbose " Raw:\n #{encoded.inspect}"
|
72
58
|
@logger.log_verbose " Content:"
|
73
|
-
encoded.to_yaml.each_line{|
|
74
|
-
|
75
|
-
@logger.log " Length: #{encoded.length} bytes"
|
59
|
+
encoded.to_yaml.each_line{|line| @logger.log_verbose " #{line}"}
|
60
|
+
|
76
61
|
@logger.log
|
77
62
|
|
78
63
|
return encoded
|
@@ -88,7 +73,7 @@ module KineticRuby
|
|
88
73
|
end
|
89
74
|
|
90
75
|
@logger.log
|
91
|
-
@logger.log
|
76
|
+
@logger.log 'Kinetic Protocol protobuf encode/decode test passed!'
|
92
77
|
@logger.log
|
93
78
|
end
|
94
79
|
|
data/lib/kinetic_server.rb
CHANGED
@@ -1,47 +1,46 @@
|
|
1
|
-
|
1
|
+
require 'socket'
|
2
2
|
|
3
3
|
$kinetic_server = nil
|
4
4
|
|
5
5
|
module KineticRuby
|
6
6
|
|
7
|
+
DEFAULT_KINETIC_PORT = 8123
|
8
|
+
TEST_KINETIC_PORT = 8999
|
9
|
+
|
7
10
|
class Server
|
8
11
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
@
|
13
|
-
@
|
12
|
+
attr_reader :host, :port, :connected
|
13
|
+
|
14
|
+
def initialize(port = DEFAULT_KINETIC_PORT, log_level=Logger::LOG_LEVEL_INFO)
|
15
|
+
@host = 'localhost'
|
16
|
+
@port ||= DEFAULT_KINETIC_PORT
|
17
|
+
raise "Invalid Kinetic test server port specified (port: #{port})" if !@port || @port < 0
|
18
|
+
@logger = Logger.new(log_level)
|
19
|
+
@proto = Proto.new(@logger)
|
14
20
|
@server = nil
|
15
21
|
@worker = nil
|
16
|
-
@
|
17
|
-
|
18
|
-
|
19
|
-
def report(message='')
|
20
|
-
$stderr.flush
|
21
|
-
$stdout.flush
|
22
|
-
puts message
|
23
|
-
$stderr.flush
|
24
|
-
$stdout.flush
|
22
|
+
@clients = []
|
23
|
+
@logger.log "Kinetic Ruby test device server started!"
|
25
24
|
end
|
26
25
|
|
27
|
-
def
|
28
|
-
|
26
|
+
def connected
|
27
|
+
!@server.nil?
|
29
28
|
end
|
30
29
|
|
31
30
|
def report_buffer(buf)
|
32
31
|
bytes = buf.bytes
|
33
32
|
row_len = 16
|
34
|
-
|
33
|
+
@logger.log "Raw Data (length=#{buf.count}):"
|
35
34
|
while !bytes.empty?
|
36
35
|
row_len = bytes.count >= row_len ? row_len : bytes.count
|
37
|
-
|
36
|
+
@logger.log " row_len: #{row_len}"
|
38
37
|
row = bytes.slice!(row_len)
|
39
|
-
|
38
|
+
@logger.log " row: #{row.inspect}"
|
40
39
|
msg = " "
|
41
40
|
row.each do |b|
|
42
41
|
msg += sprintf("0x%02X", b)
|
43
42
|
end
|
44
|
-
|
43
|
+
@logger.log msg
|
45
44
|
end
|
46
45
|
report
|
47
46
|
end
|
@@ -49,67 +48,101 @@ module KineticRuby
|
|
49
48
|
def start
|
50
49
|
return unless @server.nil?
|
51
50
|
|
52
|
-
@server = TCPServer.new @port
|
53
|
-
@listeners = []
|
51
|
+
@server = TCPServer.new(@host, @port)
|
54
52
|
|
55
53
|
# Setup handler for signaled shutdown (via ctrl+c)
|
56
54
|
trap("INT") do
|
57
|
-
|
55
|
+
@logger.log "Kinetic Test Server: INT triggered Kintic Test Server shutdown"
|
58
56
|
shutdown
|
59
57
|
end
|
60
58
|
|
61
59
|
# Create worker thread for test server to run in so we can continue
|
62
60
|
@worker = Thread.new do
|
63
|
-
|
61
|
+
@logger.log "Kinetic Test Server: Listening for Kinetic clients..."
|
64
62
|
loop do
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
63
|
+
client = nil
|
64
|
+
begin
|
65
|
+
client, client_info = @server.accept
|
66
|
+
rescue Exception => e
|
67
|
+
@logger.log "Kinetic Test Server: EXCEPTION during accept!\n" +
|
68
|
+
" #{e.inspect}\n" +
|
69
|
+
" #{e.message}\n #{e.backtrace.join(" \n")}"
|
70
|
+
next if client.nil?
|
71
|
+
end
|
69
72
|
|
70
|
-
|
73
|
+
next if client.nil?
|
74
|
+
|
75
|
+
@logger.log "Kinetic Test Server: Connected to #{client.inspect}"
|
76
|
+
request = ''
|
77
|
+
data = nil
|
78
|
+
pdu = nil
|
79
|
+
disconnect = false
|
80
|
+
|
81
|
+
while !disconnect
|
82
|
+
begin
|
83
|
+
data = client.recv(1024)
|
84
|
+
rescue IO::WaitReadable
|
85
|
+
@logger.log("IO:WaitReadable");
|
86
|
+
IO.select([client])
|
87
|
+
retry
|
88
|
+
rescue Exception => e
|
89
|
+
@logger.logv "Kinetic Test Server: EXCEPTION during receive!\n" +
|
90
|
+
" #{e.inspect}\n" +
|
91
|
+
" #{e.message}\n #{e.backtrace.join(" \n")}"
|
92
|
+
disconnect = true
|
93
|
+
next
|
94
|
+
end
|
95
|
+
|
96
|
+
if (data.nil? || data.empty?)
|
97
|
+
@logger.log "Kinetic Test Server: Client #{client.inspect} disconnected!"
|
98
|
+
disconnect = true
|
99
|
+
next
|
100
|
+
end
|
101
|
+
|
102
|
+
# Incrementally parse PDU until complete
|
103
|
+
if request[0] == KineticRuby::Proto::VERSION_PREFIX && request.length >= 9
|
104
|
+
pdu ||= PDU.new(@Logger)
|
105
|
+
pdu.update(request)
|
106
|
+
end
|
71
107
|
|
108
|
+
# Otherwise, handle custom test requests
|
109
|
+
if pdu.nil?
|
110
|
+
request_match = request.match(/^read\((\d+)\)/)
|
72
111
|
if request_match
|
73
112
|
len = request_match[1].to_i
|
74
|
-
response =
|
75
|
-
|
113
|
+
response = 'G'*len
|
114
|
+
@logger.log "Kinetic Test Server: Responding to 'read(#{len})' w/ '#{response}'"
|
76
115
|
client.write response
|
77
116
|
request = ''
|
78
|
-
|
79
117
|
elsif request =~ /^readProto()/
|
80
|
-
|
81
|
-
|
82
|
-
report "Kinetic Test Server: Responding to 'read(#{len})' w/ dummy protobuf (#{response.length} bytes)"
|
118
|
+
response = @proto.test_encode
|
119
|
+
@logger.log "Kinetic Test Server: Responding to 'read(#{len})' w/ dummy @protobuf (#{response.length} bytes)"
|
83
120
|
client.write response
|
84
121
|
request = ''
|
85
|
-
|
86
|
-
# elsif request.length > 20
|
87
|
-
# report_banner "Received unknown data: length=#{request.length}"
|
88
|
-
# report " requst.inspect"
|
89
|
-
# report_buffer(request)
|
90
|
-
|
91
122
|
end
|
92
|
-
|
93
123
|
end
|
94
|
-
|
124
|
+
|
125
|
+
@logger.log "Kinetic Test Server: Client #{client.inspect} disconnected!"
|
126
|
+
client.close
|
127
|
+
@logger.log "Kinetic Test Server: Client connection shutdown successfully"
|
95
128
|
end
|
96
129
|
end
|
97
130
|
end
|
98
|
-
|
99
131
|
end
|
100
132
|
|
101
133
|
def shutdown
|
102
134
|
return if @server.nil?
|
103
|
-
|
104
|
-
@
|
105
|
-
|
135
|
+
@logger.log "Kinetic Test Server: shutting down..."
|
136
|
+
if @worker
|
137
|
+
@worker.exit
|
138
|
+
@worker.join(2)
|
139
|
+
@worker = nil
|
106
140
|
end
|
107
|
-
@
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
@
|
112
|
-
report "Kinetic Test Server: shutdown complete"
|
141
|
+
if @server
|
142
|
+
@server.close
|
143
|
+
@server = nil
|
144
|
+
end
|
145
|
+
@logger.log "Kinetic Test Server: shutdown complete"
|
113
146
|
end
|
114
147
|
|
115
148
|
end
|
data/lib/version.rb
ADDED
data/lib/version.rb.erb
ADDED
data/tasks/kinetic-ruby.rake
CHANGED
@@ -1,21 +1,31 @@
|
|
1
1
|
require 'rake'
|
2
|
-
require 'socket'
|
3
2
|
require_relative '../kinetic-ruby' unless defined? KineticRuby
|
4
3
|
|
5
|
-
namespace :
|
4
|
+
namespace :kinetic do
|
5
|
+
namespace :server do
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
desc "Start Kinetic Test Server"
|
8
|
+
task :start, :port, :log do |t, args|
|
9
|
+
if args[:port]
|
10
|
+
if args[:log]
|
11
|
+
$kinetic_server ||= KineticRuby::Server.new(args[:port], args[:log])
|
12
|
+
else
|
13
|
+
$kinetic_server ||= KineticRuby::Server.new(args[:port])
|
14
|
+
end
|
15
|
+
else
|
16
|
+
$kinetic_server ||= KineticRuby::Server.new
|
17
|
+
end
|
18
|
+
$kinetic_server.start
|
19
|
+
sleep 2.0
|
20
|
+
end
|
12
21
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
22
|
+
desc "Shutdown Kinetic Test Server"
|
23
|
+
task :shutdown do
|
24
|
+
$kinetic_server.shutdown unless $kinetic_server.nil?
|
25
|
+
$kinetic_server = nil
|
26
|
+
end
|
18
27
|
|
28
|
+
end
|
19
29
|
end
|
20
30
|
|
21
31
|
# This block of code will be run prior to Rake instance terminating
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kinetic-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Greg Williams
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-07-
|
11
|
+
date: 2014-07-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -54,7 +54,8 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
description: Seagate Kinetic Protocol implementation and examples for developing Kinetic
|
56
56
|
clients in Ruby
|
57
|
-
email:
|
57
|
+
email:
|
58
|
+
- greg.williams@atomicobject.com
|
58
59
|
executables: []
|
59
60
|
extensions: []
|
60
61
|
extra_rdoc_files: []
|
@@ -62,24 +63,26 @@ files:
|
|
62
63
|
- README.md
|
63
64
|
- Rakefile
|
64
65
|
- LICENSE
|
65
|
-
-
|
66
|
-
-
|
67
|
-
-
|
68
|
-
-
|
69
|
-
-
|
70
|
-
-
|
71
|
-
-
|
72
|
-
-
|
66
|
+
- lib/kinetic-ruby.rb
|
67
|
+
- lib/kinetic_logger.rb
|
68
|
+
- lib/kinetic_pdu.rb
|
69
|
+
- lib/kinetic_proto.rb
|
70
|
+
- lib/kinetic_server.rb
|
71
|
+
- lib/protobuf/kinetic.pb.rb
|
72
|
+
- lib/version.rb
|
73
|
+
- lib/version.rb.erb
|
74
|
+
- tasks/kinetic-ruby.rake
|
75
|
+
- vendor/kinetic-protocol/kinetic.proto
|
76
|
+
- vendor/kinetic-protocol/README.md
|
73
77
|
homepage: http://github.com/atomicobject/kinetic-ruby
|
74
78
|
licenses:
|
75
79
|
- LGPL-2.1
|
76
80
|
metadata: {}
|
77
81
|
post_install_message:
|
78
|
-
rdoc_options:
|
79
|
-
- --charset=UTF-8
|
82
|
+
rdoc_options: []
|
80
83
|
require_paths:
|
81
84
|
- lib
|
82
|
-
-
|
85
|
+
- lib/protobuf
|
83
86
|
required_ruby_version: !ruby/object:Gem::Requirement
|
84
87
|
requirements:
|
85
88
|
- - '>='
|
@@ -94,6 +97,6 @@ requirements: []
|
|
94
97
|
rubyforge_project:
|
95
98
|
rubygems_version: 2.0.14
|
96
99
|
signing_key:
|
97
|
-
specification_version:
|
100
|
+
specification_version: 4
|
98
101
|
summary: Seagate Kinetic Protocol library for Ruby using Kinetic Protocol v2.0.4
|
99
102
|
test_files: []
|