torigoya_kit 0.0.11 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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