torigoya_kit 0.0.11 → 0.2.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: 77a01b6fe9e41f3b05790e8818d55c831b46fc60
4
- data.tar.gz: 51d22cfa528a46b4597fc83bd3d3695aafa2a9d2
3
+ metadata.gz: fb896dfb27fba5b772fb9c0b2562ca7e2dd2ccd4
4
+ data.tar.gz: 250b1853f23f08d132295b92888597d08b6af0a1
5
5
  SHA512:
6
- metadata.gz: 8fdca898c31ef7f6f8ded53c2457a6eb777217b8c9f32a0074f2a351ac35c8461e12931e63be51dce8dda44d607f054eb00df3dda309c105b590f53434533724
7
- data.tar.gz: 6436e9d9e8f47f280d309c3bb724c1f7d14dc5596d5cdd5ec80785d232e8ddd24548dff35faacd17c9625f1d785f5d045eda8f1f6cfd18bdde08f7657c9279e9
6
+ metadata.gz: 96ccd817a7fed70dadce93175d78deaacee4d87d9ed231b7aaa5de293f92241665043e464473d594e82bb17230390a4de56391b2b472e5109ca39ec9de359a54
7
+ data.tar.gz: 1048f3c0cf79e25fb4b3403b7f160722482999e76af44b41eaec7ce70ab75445bbb6474a81e5634537666960ab074b6175fb8bc1a4edca73206a28d53736575e
@@ -12,33 +12,33 @@ module TorigoyaKit
12
12
 
13
13
  ####
14
14
  def exec_ticket(ticket)
15
- return get_session().exec_ticket(ticket)
15
+ return new_session().exec_ticket(ticket)
16
16
  end
17
17
 
18
18
  def exec_ticket_with_stream(ticket, &block)
19
- return get_session().exec_ticket_with_stream(ticket, &block)
19
+ return new_session().exec_ticket_with_stream(ticket, &block)
20
20
  end
21
21
 
22
22
  ####
23
23
  def update_packages()
24
- return get_session().update_packages()
24
+ return new_session().update_packages()
25
25
  end
26
26
 
27
27
  ####
28
28
  def reload_proc_table()
29
- return get_session().reload_proc_table()
29
+ return new_session().reload_proc_table()
30
30
  end
31
31
 
32
32
  def update_proc_table()
33
- return get_session().update_proc_table()
33
+ return new_session().update_proc_table()
34
34
  end
35
35
 
36
36
  def get_proc_table()
37
- return get_session().get_proc_table()
37
+ return new_session().get_proc_table()
38
38
  end
39
39
 
40
40
  private
41
- def get_session()
41
+ def new_session()
42
42
  return Session.new(@host, @port)
43
43
  end
44
44
  end # class Client
@@ -11,109 +11,114 @@ module TorigoyaKit
11
11
  MessageKindIndexBegin = 0
12
12
 
13
13
  # Sent from client
14
- MessageKindAcceptRequest = 0
15
14
  MessageKindTicketRequest = 1
16
15
  MessageKindUpdateRepositoryRequest = 2
17
- MessageKindReloadProcTableRequest = 3
18
- MessageKindUpdateProcTableRequest = 4
19
- MessageKindGetProcTableRequest = 5
20
16
 
21
17
  # Sent from server
22
- MessageKindAccept = 6
23
18
  MessageKindOutputs = 7
24
19
  MessageKindResult = 8
25
20
  MessageKindSystemError = 9
26
21
  MessageKindExit = 10
27
22
 
28
23
  MessageKindSystemResult = 11
29
- MessageKindProcTable = 12
30
24
 
31
25
  #
32
- MessageKindIndexEnd = 12
26
+ MessageKindIndexEnd = 11
33
27
  MessageKindInvalid = 0xff
34
28
 
35
29
  #
36
- HeaderLength = 5
30
+ HeaderLength = 2 + 1 + 4 + 4
37
31
 
38
32
  #
33
+ # Signature [2]byte //
34
+ # MessageKind byte //
35
+ # Version [4]byte // uint32, little endian
36
+ # Length [4]byte // uint32, little endian
37
+ # Message []byte // data, msgpacked
39
38
  class Packet
40
- def initialize(kind, data)
39
+ Signature = "TG"
40
+
41
+ def initialize(kind, version, data)
41
42
  if kind < MessageKindIndexBegin || kind > MessageKindIndexEnd
42
43
  raise "invalid header"
43
44
  end
44
45
 
45
- @kind = [kind].pack("C*")
46
- @encoded_data = data.to_msgpack
47
- @size = [@encoded_data.size].pack("V*")
46
+ @kind = [kind].pack("C*") # byte
47
+ @version = [version].pack("V*") # little endian, 32bit, unsigned int
48
+ @message = data.to_msgpack # msgpacked
49
+ @length = [@message.size].pack("V*") # little endian, 32bit, unsigned int
48
50
  end
49
- attr_reader :kind, :size, :encoded_data
51
+ attr_reader :kind, :version, :message, :length
50
52
 
51
53
  #
52
54
  def to_binary
53
- return @kind + @size + @encoded_data
55
+ return Signature + @kind + @version + @length + @message
54
56
  end
55
57
  end
56
58
 
57
- #
58
- def self.encode(kind, data = nil)
59
- return Packet.new(kind, data).to_binary
59
+ class Frame
60
+ def initialize(kind, buffer)
61
+ @kind = kind
62
+ @raw_object = MessagePack.unpack(buffer)
63
+ end
64
+ attr_reader :kind, :raw_object
65
+
66
+ def get_object
67
+ case @kind
68
+ when MessageKindOutputs
69
+ return StreamOutputResult.from_hash(@raw_object)
70
+ when MessageKindResult
71
+ return StreamExecutedResult.from_hash(@raw_object)
72
+ when MessageKindSystemError
73
+ return StreamSystemError.new(@raw_object)
74
+ when MessageKindExit
75
+ return StreamExit.new(@raw_object)
76
+
77
+ when MessageKindSystemResult
78
+ return StreamSystemResult.new(@raw_object)
79
+ else
80
+ raise "Protocol :: Result kind(#{kind}) is not supported by clitnt side"
81
+ end
82
+ end
60
83
  end
61
84
 
62
- def self.encode_to(io, kind, data = nil)
63
- io.write(encode(kind, data))
85
+ class InvalidFrame < RuntimeError
64
86
  end
65
87
 
66
- def self.get_responses(io)
67
- results = []
68
- decode_from_stream(io) do |r|
69
- results << r
70
- end
88
+ # ============================================================
71
89
 
72
- return results
90
+ def self.encode(kind, version, data)
91
+ return Packet.new(kind, version, data).to_binary
73
92
  end
74
93
 
75
- #
76
- def self.decode(buffer)
94
+ def self.decode(buffer, expected_version)
77
95
  if buffer.size >= HeaderLength
96
+ # read signature
97
+ signature = buffer[0...2]
98
+ if signature != Packet::Signature
99
+ raise InvalidFrame.new("Invalid Signature")
100
+ end
101
+
78
102
  # read kind
79
- kind = buffer[0].unpack("c")[0] # 8bit char
103
+ kind = buffer[2].unpack("c")[0] # 8bit signed char
104
+
105
+ # read version
106
+ version = buffer[3...7].unpack("I")[0] # 32bit unsigned int(little endian)
107
+ if version != expected_version
108
+ raise InvalidFrame.new("Invalid Version")
109
+ end
80
110
 
81
111
  # read length
82
- length = buffer[1..4].unpack("I")[0] # 32bit unsigned int(little endian)
112
+ length = buffer[7...11].unpack("I")[0] # 32bit unsigned int(little endian)
83
113
 
114
+ # read body
84
115
  if buffer.size >= HeaderLength + length
85
- return true, kind, length, buffer[HeaderLength...(HeaderLength + length)]
116
+ next_buffer = buffer[(HeaderLength + length)...buffer.size]
117
+ return Frame.new(kind, buffer[HeaderLength...(HeaderLength + length)]), next_buffer
86
118
  end
87
119
  end
88
120
 
89
- return false, nil, nil, nil
90
- end
91
-
92
- def self.cat_rest(buffer, length)
93
- return buffer[(HeaderLength + length)..buffer.size]
94
- end
95
-
96
- #
97
- def self.decode_as_client(kind, decoded)
98
- case kind
99
- when MessageKindAccept
100
- return StreamAccept.new
101
- when MessageKindOutputs
102
- return StreamOutputResult.from_tuple(decoded)
103
- when MessageKindResult
104
- return StreamExecutedResult.from_tuple(decoded)
105
- when MessageKindSystemError
106
- return StreamSystemError.from_tuple(decoded)
107
- when MessageKindExit
108
- return StreamExit.from_tuple(decoded)
109
-
110
- when MessageKindSystemResult
111
- return StreamSystemStatusResult.new(decoded)
112
- when MessageKindProcTable
113
- return decoded
114
- else
115
- raise "Protocol :: Result kind(#{kind}) is not supported by clitnt side"
116
- end
121
+ return nil, buffer
117
122
  end
118
123
 
119
124
  end # class Protocol
@@ -10,7 +10,7 @@ require_relative 'protocol'
10
10
 
11
11
  module TorigoyaKit
12
12
  class Session
13
- Version = "v2014/7/5"
13
+ Version = 20150715
14
14
 
15
15
  ########################################
16
16
  #
@@ -83,96 +83,52 @@ module TorigoyaKit
83
83
  ########################################
84
84
  #
85
85
  def exec_ticket_with_stream(ticket, &block)
86
- write(Protocol::MessageKindTicketRequest, ticket)
87
- read_stream(&block)
88
- end
86
+ send(Protocol::MessageKindTicketRequest, ticket)
89
87
 
90
- ########################################
91
- #
92
- def update_packages()
93
- write(Protocol::MessageKindUpdateRepositoryRequest)
94
- res = read()
95
- if res.is_a?(StreamSystemStatusResult)
96
- return
97
- elsif res.is_a?(StreamSystemError)
98
- raise res.message
99
- else
100
- raise "Unexpected error: unknown message was recieved (#{res.class})"
101
- end
88
+ recv_stream(&block)
102
89
  end
103
90
 
104
91
  ########################################
105
92
  #
106
- def reload_proc_table()
107
- write(Protocol::MessageKindReloadProcTableRequest)
108
- res = read()
109
- if res.is_a?(StreamSystemStatusResult)
110
- return
111
- elsif res.is_a?(StreamSystemError)
112
- raise res.message
113
- else
114
- raise "Unexpected error: unknown message was recieved (#{res.class})"
115
- end
116
- end
117
-
118
- ########################################
119
- #
120
- def update_proc_table()
121
- write(Protocol::MessageKindUpdateProcTableRequest)
122
- res = read()
123
- if res.is_a?(StreamSystemStatusResult)
124
- return
125
- elsif res.is_a?(StreamSystemError)
126
- raise res.message
127
- else
128
- raise "Unexpected error: unknown message was recieved (#{res.class})"
129
- end
130
- end
93
+ def update_packages()
94
+ send(Protocol::MessageKindUpdateRepositoryRequest, nil)
131
95
 
132
- ########################################
133
- #
134
- def get_proc_table()
135
- write(Protocol::MessageKindGetProcTableRequest)
136
- res = read()
137
- if res.is_a?(Hash)
138
- return res
139
- elsif res.is_a?(StreamSystemError)
140
- raise res.message
141
- else
142
- raise "Unexpected error: unknown message was recieved (#{res.class})"
96
+ recv_stream() do |res|
97
+ if res.is_a?(StreamSystemResult)
98
+ return res.status
99
+ elsif res.is_a?(StreamSystemError)
100
+ raise res.message
101
+ else
102
+ raise "Unexpected error: unknown message was recieved (#{res.class})"
103
+ end
143
104
  end
144
105
  end
145
106
 
146
107
  ########################################
147
- #########################################
148
108
  private
149
109
 
150
110
  ########################################
151
111
  #
152
- def read()
153
- accepted = false
112
+ def recv_frame_object()
154
113
  is_closed = false
155
114
 
156
115
  loop do
157
116
  begin
158
- @buffer << @socket.readpartial(1024)
117
+ @buffer << @socket.readpartial(8096)
159
118
  rescue EOFError
160
119
  is_closed = true
161
120
  end
162
121
 
163
- is_recieved, kind, length, content = Protocol.decode(@buffer)
164
- unless is_recieved
122
+ frame, @buffer = Protocol.decode(@buffer, Version)
123
+ if frame.nil?
165
124
  if is_closed
166
- break
125
+ break # finish loop
167
126
  else
168
- next
127
+ next # try to read data
169
128
  end
170
129
  end
171
130
 
172
- # set rest
173
- @buffer = Protocol.cat_rest(@buffer, length)
174
-
175
- return Protocol.decode_as_client(kind, MessagePack.unpack(content))
131
+ return frame.get_object()
176
132
  end # loop
177
133
 
178
134
  return nil
@@ -180,35 +136,21 @@ module TorigoyaKit
180
136
 
181
137
  ########################################
182
138
  #
183
- def read_stream(&block)
139
+ def recv_stream(&block)
184
140
  loop do
185
- o = read()
186
- break if o.nil?
141
+ obj = recv_frame_object()
142
+ raise "object is empty" if obj.nil?
187
143
 
188
- break if o.is_a?(StreamExit)
189
- block.call(o) unless block.nil?
144
+ break if obj.is_a?(StreamExit)
145
+ block.call(obj) unless block.nil?
190
146
  end
191
147
  end
192
148
 
193
149
  ########################################
194
150
  #
195
- def write(kind, *args)
196
- expect_accepted_by_server()
197
- Protocol.encode_to(@socket, kind, *args)
151
+ def send(kind, args)
152
+ @socket.write(Protocol.encode(kind, Version, args))
198
153
  end
199
154
 
200
- ########################################
201
- #
202
- def expect_accepted_by_server
203
- Protocol.encode_to(@socket, Protocol::MessageKindAcceptRequest, Version)
204
- res = read()
205
- if res.is_a?(StreamAccept)
206
- return
207
- elsif res.is_a?(StreamSystemError)
208
- raise res.message
209
- else
210
- raise "Unexpected error: unknown message was recieved"
211
- end
212
- end
213
155
  end # class Session
214
156
  end # module TorigoyaKit
@@ -1,6 +1,8 @@
1
- # Copyright (c) 2014 yutopp
1
+ # Copyright (c) 2014 - 2015 yutopp
2
2
  # Licenced under the MIT License (http://www.opensource.org/licenses/mit-license.php)
3
3
 
4
+ require_relative 'typeutil'
5
+
4
6
  module TorigoyaKit
5
7
  class ResultMode
6
8
  CompileMode = 0
@@ -8,10 +10,6 @@ module TorigoyaKit
8
10
  RunMode = 2
9
11
  end
10
12
 
11
- #
12
- class StreamAccept
13
- end
14
-
15
13
  #
16
14
  class StreamOutput
17
15
  StdoutFd = 0
@@ -20,19 +18,24 @@ module TorigoyaKit
20
18
  def initialize(fd, buffer)
21
19
  @fd = fd
22
20
  @buffer = buffer
21
+
22
+ validate
23
23
  end
24
24
  attr_reader :fd, :buffer
25
25
 
26
- def self.from_tuple(tupled)
27
- raise "type error [expected Array but #{message.class}] :: #{self}" unless tupled.is_a?(Array)
28
- raise "invalid format(tuple size is different [expected 2 but #{tupled.size}] :: #{self})" unless tupled.size == 2
29
-
30
- return StreamOutput.new(tupled[0], tupled[1])
26
+ def self.from_hash(hash)
27
+ return StreamOutput.new(hash["fd"], hash["buffer"])
31
28
  end
32
29
 
33
30
  def to_s
34
31
  return "#{self.class}/[#{@fd} #{@buffer}]"
35
32
  end
33
+
34
+ private
35
+ def validate()
36
+ TypeUtil.nonnull_type_check(self, "fd", @fd, Integer)
37
+ TypeUtil.nonnull_type_check(self, "buffer", @buffer, String)
38
+ end
36
39
  end
37
40
 
38
41
  # related to MessageKindOutputs
@@ -41,53 +44,76 @@ module TorigoyaKit
41
44
  @mode = mode
42
45
  @index = index
43
46
  @output = output
47
+
48
+ validate
44
49
  end
45
50
  attr_reader :mode, :index, :output
46
51
 
47
- def self.from_tuple(tupled)
48
- raise "type error [expected Array but #{message.class}] :: #{self}" unless tupled.is_a?(Array)
49
- raise "invalid format(tuple size is different [expected 3 but #{tupled.size}] :: #{self})" unless tupled.size == 3
50
-
51
- return StreamOutputResult.new(tupled[0],
52
- tupled[1],
53
- StreamOutput.from_tuple(tupled[2])
54
- )
52
+ def self.from_hash(hash)
53
+ return StreamOutputResult.new(
54
+ hash["mode"],
55
+ hash["index"],
56
+ StreamOutput.from_hash(hash["output"])
57
+ )
55
58
  end
56
59
 
57
60
  def to_s
58
61
  return "#{self.class}/[#{@mode} #{@index} #{@output.to_s}]"
59
62
  end
63
+
64
+ private
65
+ def validate()
66
+ TypeUtil.nonnull_type_check(self, "mode", @mode, Integer)
67
+ TypeUtil.nonnull_type_check(self, "index", @index, Integer)
68
+ TypeUtil.nonnull_type_check(self, "output", @output, StreamOutput)
69
+ end
60
70
  end
61
71
 
62
72
  #
63
73
  class ExecutedResult
64
- def initialize(cpu_time, memory, signal, return_code, command_line, status, error_message)
74
+ def initialize(exited, exit_status, signaled, signal, cpu_time, memory, s_es, s_em)
75
+ @exited = exited
76
+ @exit_status = exit_status
77
+ @signaled = signaled
78
+ @signal = signal
79
+
65
80
  @used_cpu_time_sec = cpu_time
66
81
  @used_memory_bytes = memory
67
- @signal = signal
68
- @return_code = return_code
69
- @command_line = command_line
70
- @status = status
71
- @system_error_message = error_message
72
- end
73
- attr_reader :used_cpu_time_sec, :used_memory_bytes, :signal, :return_code, :command_line, :status, :system_error_message
74
82
 
75
- def self.from_tuple(tupled)
76
- raise "type error [expected Array but #{message.class}] :: #{self}" unless tupled.is_a?(Array)
77
- raise "invalid format(tuple size is different [expected 7 but #{tupled.size}] :: #{self})" unless tupled.size == 7
83
+ @system_error_status = s_es
84
+ @system_error_message = s_em
78
85
 
79
- return ExecutedResult.new(tupled[0],
80
- tupled[1],
81
- tupled[2],
82
- tupled[3],
83
- tupled[4],
84
- tupled[5],
85
- tupled[6]
86
- )
86
+ validate
87
87
  end
88
+ attr_reader :exited, :exit_status, :signaled, :signal
89
+ attr_reader :used_cpu_time_sec, :used_memory_bytes
90
+ attr_reader :system_error_status, :system_error_message
88
91
 
89
- def to_s
90
- return "#{self.class}/[#{@used_cpu_time_sec} #{@used_memory_bytes} #{@signal} #{@return_code} #{@command_line} #{@status} #{@system_error_message}]"
92
+ def self.from_hash(hash)
93
+ return ExecutedResult.new(
94
+ hash["exited"],
95
+ hash["exit_status"],
96
+ hash["signaled"],
97
+ hash["signal"],
98
+ hash["used_cpu_time_sec"],
99
+ hash["used_memory_bytes"],
100
+ hash["system_error_status"],
101
+ hash["system_error_message"],
102
+ )
103
+ end
104
+
105
+ private
106
+ def validate()
107
+ TypeUtil.nonnull_boolean_type_check(self, "exited", @exited)
108
+ TypeUtil.nonnull_type_check(self, "exit_status", @exit_status, Integer)
109
+ TypeUtil.nonnull_boolean_type_check(self, "signaled", @signaled)
110
+ TypeUtil.nonnull_type_check(self, "signal", @signal, Integer)
111
+
112
+ TypeUtil.nonnull_type_check(self, "used_cpu_time_sec", @used_cpu_time_sec, Float)
113
+ TypeUtil.nonnull_type_check(self, "used_memory_bytes", @used_memory_bytes, Integer)
114
+
115
+ TypeUtil.nonnull_type_check(self, "system_error_status", @system_error_status, Integer)
116
+ TypeUtil.nonnull_type_check(self, "system_error_message", @system_error_message, String)
91
117
  end
92
118
  end
93
119
 
@@ -97,62 +123,71 @@ module TorigoyaKit
97
123
  @mode = mode
98
124
  @index = index
99
125
  @result = result
126
+
127
+ validate
100
128
  end
101
129
  attr_reader :mode, :index, :result
102
130
 
103
- def self.from_tuple(tupled)
104
- raise "type error [expected Array but #{message.class}] :: #{self}" unless tupled.is_a?(Array)
105
- raise "invalid format(tuple size is different [expected 3 but #{tupled.size}] :: #{self})" unless tupled.size == 3
106
-
107
- return StreamExecutedResult.new(tupled[0],
108
- tupled[1],
109
- ExecutedResult.from_tuple(tupled[2])
110
- )
131
+ def self.from_hash(hash)
132
+ return StreamExecutedResult.new(
133
+ hash["mode"],
134
+ hash["index"],
135
+ ExecutedResult.from_hash(hash["result"])
136
+ )
111
137
  end
112
138
 
113
139
  def to_s
114
140
  return "#{self.class}/[#{@mode} #{@index} #{@result.to_s}]"
115
141
  end
142
+
143
+ private
144
+ def validate()
145
+ TypeUtil.nonnull_type_check(self, "mode", @mode, Integer)
146
+ TypeUtil.nonnull_type_check(self, "index", @index, Integer)
147
+ TypeUtil.nonnull_type_check(self, "result", @result, ExecutedResult)
148
+ end
116
149
  end
117
150
 
118
151
  # related to MessageKindSystemError
119
152
  class StreamSystemError
120
153
  def initialize(message)
121
154
  @message = message
122
- end
123
- attr_reader :message
124
-
125
- def self.from_tuple(message)
126
- raise "type error [expected String but #{message.class}] :: #{self}" unless message.is_a?(String)
127
155
 
128
- return StreamSystemError.new(message)
156
+ validate
129
157
  end
158
+ attr_reader :message
130
159
 
131
160
  def to_s
132
161
  return "#{self.class}/[#{@message}]"
133
162
  end
163
+
164
+ private
165
+ def validate()
166
+ TypeUtil.nonnull_type_check(self, "message", @message, String)
167
+ end
134
168
  end
135
169
 
136
170
  # related to MessageKindExit
137
171
  class StreamExit
138
172
  def initialize(message)
139
173
  @message = message
140
- end
141
- attr_reader :message
142
174
 
143
- def self.from_tuple(message)
144
- raise "type error [expected String but #{message.class}] :: #{self}" unless message.is_a?(String)
145
-
146
- return StreamExit.new(message)
175
+ validate
147
176
  end
177
+ attr_reader :message
148
178
 
149
179
  def to_s
150
180
  return "#{self.class}/[#{@message}]"
151
181
  end
182
+
183
+ private
184
+ def validate()
185
+ TypeUtil.nonnull_type_check(self, "message", @message, String)
186
+ end
152
187
  end
153
188
 
154
189
  #
155
- class StreamSystemStatusResult
190
+ class StreamSystemResult
156
191
  def initialize(status)
157
192
  @status = status
158
193
  end