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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1ac835296c563ed8d45dd417494aaeab11221a6b
4
- data.tar.gz: 5d76a53e2bc1a5256c41a820659581d9ed0499e2
3
+ metadata.gz: baa7b2b2078f4a6d89936a205aecb57c9d5f2f4b
4
+ data.tar.gz: e670900a889bab053e1adb4b8fb6d90e9275c102
5
5
  SHA512:
6
- metadata.gz: a89c19cca9552a89c0c0dc36947afc0f79818b40127b6fdae049eff08ad94f79200523eb81a554b93d5e964aeb2ce195d406dae315f0bbd8f4013a9825894f5e
7
- data.tar.gz: d2896d44f2e55b7aa5754857a39f816924e63e0ef208f1b576579134d5579e3252b5ea505b47ca09561a79e549a7bffcdc8ecdcc33d89fdbb9c1e2fcac86d589
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
- load 'tasks/kinetic-ruby.rake'
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
- kr = KineticRuby::Proto.new
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
- kr = KineticRuby::Proto.new(KineticRuby::Logger::LOG_LEVEL_NONE)
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
- kr = KineticRuby::Proto.new(KineticRuby::Logger::LOG_LEVEL_VERBOSE)
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 :default => [:example]
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
- banner "Building kinetic-ruby gem v#{KineticRuby::VERSION} using Kinetic Protocol #{KineticRuby::KINETIC_PROTOCOL_VERSION}"
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
- puts
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
- banner "Publishing kinetic-ruby gem v#{KineticRuby::VERSION} to RubyGems"
41
- proto_ver = KineticRuby::KINETIC_PROTOCOL_VERSION
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
- puts "Releasing gem built w/ Kinetic Protocol #{proto_ver}"
91
+ report "Releasing gem built w/ Kinetic Protocol #{proto_ver}"
47
92
  sh "gem push kinetic-ruby-#{KineticRuby::VERSION}.gem"
48
- puts
93
+ report
49
94
  end
50
95
 
51
- task :ci =>[:clobber, :example, :example_no_log, :build]
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 banner(msg)
57
- puts
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
- puts "-"*msg.length
113
+ $stdout.flush
60
114
  end
data/lib/kinetic-ruby.rb CHANGED
@@ -1,18 +1,19 @@
1
- require_relative 'kinetic_logger'
2
- require_relative 'kinetic_proto'
3
- require_relative 'kinetic_server'
1
+ # Preload all library files
2
+ require 'fileutils'
4
3
 
5
- module KineticRuby
6
-
7
- VERSION = '0.3.8'
8
- DEFAULT_KINETIC_PORT = 8123
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
- KINETIC_PROTOCOL_VERSION = kp_tag
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
@@ -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 set_log_level(level)
16
- if !LOG_LEVELS.include? level
17
- raise "\nInvalid LOG_LEVEL specified!\nValid levels:\n\t" +
18
- LOG_LEVELS.map{|l|"#{self.class}::#{l}"}.join("\n\t") + "\n\n"
19
- end
20
- @level = level
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, $stderr) if @level >= LOG_LEVEL_ERROR
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
- def log_message(msg='')
37
- $stderr.flush
38
- @stream.flush
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
@@ -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
- def initialize(log_level = KineticRuby::Logger::LOG_LEVEL_INFO)
11
- require_relative "protobuf/kinetic.pb"
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 "#{@message_in.class} - Decoding"
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
- @logger.log "#{pb.class} - Encoding"
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: "The specified HMAC security algorithm does not exist!",
59
- detailedMessage: "YOUCH!"
41
+ statusMessage: 'The specified HMAC security algorithm does not exist!',
42
+ detailedMessage: 'YOUCH!'
60
43
  ),
61
44
  )
62
- pb.command.to_yaml.each_line{|l| @logger.log(" #{l}")}
63
- @logger.log
64
-
45
+ encoded = pb.encode
65
46
  @message_out = pb
66
47
 
67
- @logger.log " encoded:"
68
- encoded = pb.encode
69
- @logger.log_verbose
70
- @logger.log_verbose " Inspection: #{encoded.inspect}"
71
- @logger.log_verbose
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{|l| @logger.log_verbose " #{l}"}
74
- @logger.log_verbose
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 "Kinetic Protocol protobuf encode/decode test passed!"
76
+ @logger.log 'Kinetic Protocol protobuf encode/decode test passed!'
92
77
  @logger.log
93
78
  end
94
79
 
@@ -1,47 +1,46 @@
1
- require_relative 'kinetic-ruby'
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
- def initialize(port = nil, logger = nil)
10
- port ||= DEFAULT_KINETIC_PORT
11
- raise "Invalid Kinetic test server port specified (port: #{port})" if !port || port < 0
12
- @port = port
13
- @logger = logger
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
- @listeners = []
17
- end
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 report_banner(message)
28
- report "\n#{message}\n#{'='*message.length}\n\n"
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
- report "Raw Data (length=#{buf.count}):"
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
- report " row_len: #{row_len}"
36
+ @logger.log " row_len: #{row_len}"
38
37
  row = bytes.slice!(row_len)
39
- report " row: #{row.inspect}"
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
- report msg
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
- report "Kinetic Test Server: INT triggered Kintic Test Server shutdown"
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
- report "Kinetic Test Server: Listening for Kinetic clients..."
61
+ @logger.log "Kinetic Test Server: Listening for Kinetic clients..."
64
62
  loop do
65
- @listeners << Thread.start(@server.accept) do |client|
66
- report "Kinetic Test Server: Connected to #{client.inspect}"
67
- request = ""
68
- while request += client.getc # Read characters from socket
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
- request_match = request.match(/^read\((\d+)\)/)
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 = "G"*len
75
- report "Kinetic Test Server: Responding to 'read(#{len})' w/ '#{response}'"
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
- proto = KineticRuby::Proto.new
81
- response = proto.test_encode
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
- report "Kinetic Test Server: Client #{client.inspect} disconnected!"
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
- report "Kinetic Test Server: shutting down..."
104
- @listeners.each do |client|
105
- client.join(0.3) if client.alive?
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
- @listeners = []
108
- @worker.exit
109
- @worker = nil
110
- @server.close
111
- @server = nil
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
@@ -0,0 +1,4 @@
1
+ module KineticRuby
2
+ VERSION = '0.5.0'
3
+ PROTOCOL_VERSION = 'v2.0.4'
4
+ end
@@ -0,0 +1,4 @@
1
+ module KineticRuby
2
+ VERSION = '0.5.0'
3
+ PROTOCOL_VERSION = '<%= proto_ver %>'
4
+ end
@@ -1,21 +1,31 @@
1
1
  require 'rake'
2
- require 'socket'
3
2
  require_relative '../kinetic-ruby' unless defined? KineticRuby
4
3
 
5
- namespace :server do
4
+ namespace :kinetic do
5
+ namespace :server do
6
6
 
7
- desc "Start Kinetic Test Server"
8
- task :start, :port, :log do |t, args|
9
- $kinetic_server ||= KineticRuby::Server.new(args[:port], args[:log])
10
- $kinetic_server.start
11
- end
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
- desc "Shutdown Kinetic Test Server"
14
- task :shutdown do
15
- $kinetic_server.shutdown unless $kinetic_server.nil?
16
- $kinetic_server = nil
17
- end
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.3.8
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-29 00:00:00.000000000 Z
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: greg.williams@atomicobject.com
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
- - ./lib/kinetic-ruby.rb
66
- - ./lib/kinetic_logger.rb
67
- - ./lib/kinetic_proto.rb
68
- - ./lib/kinetic_server.rb
69
- - ./lib/protobuf/kinetic.pb.rb
70
- - ./tasks/kinetic-ruby.rake
71
- - ./vendor/kinetic-protocol/kinetic.proto
72
- - ./vendor/kinetic-protocol/README.md
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
- - tasks
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: 2
100
+ specification_version: 4
98
101
  summary: Seagate Kinetic Protocol library for Ruby using Kinetic Protocol v2.0.4
99
102
  test_files: []