hrr_rb_ssh 0.4.0.pre1 → 0.4.0.pre2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +16 -8
- data/demo/client.rb +1 -3
- data/demo/echo_server.rb +1 -3
- data/demo/more_flexible_auth.rb +1 -3
- data/demo/multi_step_auth.rb +1 -3
- data/demo/server.rb +1 -3
- data/demo/subsystem_echo_server.rb +1 -3
- data/hrr_rb_ssh.gemspec +1 -1
- data/lib/hrr_rb_ssh/algorithm/publickey/ecdsa_sha2.rb +12 -9
- data/lib/hrr_rb_ssh/algorithm/publickey/ssh_dss.rb +10 -7
- data/lib/hrr_rb_ssh/algorithm/publickey/ssh_rsa.rb +9 -6
- data/lib/hrr_rb_ssh/authentication/method/keyboard_interactive/context.rb +9 -8
- data/lib/hrr_rb_ssh/authentication/method/keyboard_interactive/info_request.rb +6 -5
- data/lib/hrr_rb_ssh/authentication/method/keyboard_interactive/info_response.rb +5 -2
- data/lib/hrr_rb_ssh/authentication/method/keyboard_interactive.rb +12 -10
- data/lib/hrr_rb_ssh/authentication/method/none/context.rb +7 -6
- data/lib/hrr_rb_ssh/authentication/method/none.rb +10 -8
- data/lib/hrr_rb_ssh/authentication/method/password/context.rb +7 -6
- data/lib/hrr_rb_ssh/authentication/method/password.rb +10 -8
- data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/functionable.rb +13 -11
- data/lib/hrr_rb_ssh/authentication/method/publickey/context.rb +5 -2
- data/lib/hrr_rb_ssh/authentication/method/publickey.rb +16 -14
- data/lib/hrr_rb_ssh/authentication.rb +28 -27
- data/lib/hrr_rb_ssh/client.rb +58 -56
- data/lib/hrr_rb_ssh/codable.rb +20 -10
- data/lib/hrr_rb_ssh/connection/channel/channel_type/direct_tcpip.rb +20 -18
- data/lib/hrr_rb_ssh/connection/channel/channel_type/forwarded_tcpip.rb +20 -18
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/proc_chain/chain_context.rb +0 -3
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/proc_chain.rb +0 -2
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/env/context.rb +5 -4
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/env.rb +2 -5
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/exec/context.rb +5 -4
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/exec.rb +2 -5
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/pty_req/context.rb +5 -4
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/pty_req.rb +2 -5
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/shell/context.rb +5 -4
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/shell.rb +2 -5
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/subsystem/context.rb +5 -4
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/subsystem.rb +2 -5
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/window_change/context.rb +5 -4
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/window_change.rb +2 -5
- data/lib/hrr_rb_ssh/connection/channel/channel_type/session.rb +14 -12
- data/lib/hrr_rb_ssh/connection/channel.rb +73 -71
- data/lib/hrr_rb_ssh/connection/global_request_handler.rb +14 -12
- data/lib/hrr_rb_ssh/connection/request_handler/reference_env_request_handler.rb +0 -2
- data/lib/hrr_rb_ssh/connection/request_handler/reference_exec_request_handler.rb +4 -6
- data/lib/hrr_rb_ssh/connection/request_handler/reference_pty_req_request_handler.rb +10 -12
- data/lib/hrr_rb_ssh/connection/request_handler/reference_shell_request_handler.rb +4 -6
- data/lib/hrr_rb_ssh/connection/request_handler/reference_window_change_request_handler.rb +0 -2
- data/lib/hrr_rb_ssh/connection/request_handler.rb +1 -3
- data/lib/hrr_rb_ssh/connection.rb +53 -53
- data/lib/hrr_rb_ssh/loggable.rb +42 -0
- data/lib/hrr_rb_ssh/server.rb +11 -9
- data/lib/hrr_rb_ssh/transport/compression_algorithm/functionable.rb +5 -3
- data/lib/hrr_rb_ssh/transport/compression_algorithm/unfunctionable.rb +5 -3
- data/lib/hrr_rb_ssh/transport/encryption_algorithm/functionable.rb +5 -3
- data/lib/hrr_rb_ssh/transport/encryption_algorithm/unfunctionable.rb +5 -3
- data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman.rb +9 -8
- data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange.rb +13 -12
- data/lib/hrr_rb_ssh/transport/kex_algorithm/elliptic_curve_diffie_hellman.rb +9 -8
- data/lib/hrr_rb_ssh/transport/mac_algorithm/functionable.rb +5 -3
- data/lib/hrr_rb_ssh/transport/mac_algorithm/unfunctionable.rb +5 -3
- data/lib/hrr_rb_ssh/transport/receiver.rb +8 -7
- data/lib/hrr_rb_ssh/transport/sender.rb +5 -3
- data/lib/hrr_rb_ssh/transport/sequence_number.rb +0 -4
- data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/functionable.rb +5 -3
- data/lib/hrr_rb_ssh/transport.rb +41 -40
- data/lib/hrr_rb_ssh/version.rb +1 -1
- data/lib/hrr_rb_ssh.rb +0 -1
- metadata +6 -6
- data/lib/hrr_rb_ssh/logger.rb +0 -56
@@ -2,7 +2,6 @@
|
|
2
2
|
# vim: et ts=2 sw=2
|
3
3
|
|
4
4
|
require 'etc'
|
5
|
-
require 'hrr_rb_ssh/logger'
|
6
5
|
require 'hrr_rb_ssh/connection/request_handler'
|
7
6
|
|
8
7
|
module HrrRbSsh
|
@@ -10,7 +9,6 @@ module HrrRbSsh
|
|
10
9
|
class RequestHandler
|
11
10
|
class ReferenceExecRequestHandler < RequestHandler
|
12
11
|
def initialize
|
13
|
-
@logger = Logger.new self.class.name
|
14
12
|
@proc = Proc.new { |context|
|
15
13
|
ptm = context.vars[:ptm]
|
16
14
|
pts = context.vars[:pts]
|
@@ -58,22 +56,22 @@ module HrrRbSsh
|
|
58
56
|
|
59
57
|
begin
|
60
58
|
pid, status = Process.waitpid2 pid
|
61
|
-
context.
|
59
|
+
context.log_info { "program exited with status #{status.inspect}" }
|
62
60
|
status.exitstatus
|
63
61
|
ensure
|
64
62
|
unless status
|
65
|
-
context.
|
63
|
+
context.log_info { "exiting program" }
|
66
64
|
Process.kill :TERM, pid
|
67
65
|
begin
|
68
66
|
Timeout.timeout(1) do
|
69
67
|
pid, status = Process.waitpid2 pid
|
70
68
|
end
|
71
69
|
rescue Timeout::Error
|
72
|
-
context.
|
70
|
+
context.log_warn { "force exiting program" }
|
73
71
|
Process.kill :KILL, pid
|
74
72
|
pid, status = Process.waitpid2 pid
|
75
73
|
end
|
76
|
-
context.
|
74
|
+
context.log_info { "program exited with status #{status.inspect}" }
|
77
75
|
end
|
78
76
|
end
|
79
77
|
end
|
@@ -5,7 +5,6 @@ require 'etc'
|
|
5
5
|
require 'fileutils'
|
6
6
|
require 'pty'
|
7
7
|
require 'io/console'
|
8
|
-
require 'hrr_rb_ssh/logger'
|
9
8
|
require 'hrr_rb_ssh/connection/request_handler'
|
10
9
|
|
11
10
|
module HrrRbSsh
|
@@ -13,7 +12,6 @@ module HrrRbSsh
|
|
13
12
|
class RequestHandler
|
14
13
|
class ReferencePtyReqRequestHandler < RequestHandler
|
15
14
|
def initialize
|
16
|
-
@logger = Logger.new self.class.name
|
17
15
|
@proc = Proc.new { |context|
|
18
16
|
begin
|
19
17
|
ptm, pts = PTY.open
|
@@ -32,16 +30,16 @@ module HrrRbSsh
|
|
32
30
|
begin
|
33
31
|
context.io[1].write ptm.readpartial(10240)
|
34
32
|
rescue EOFError => e
|
35
|
-
context.
|
33
|
+
context.log_info { "ptm is EOF in ptm_read_thread" }
|
36
34
|
break
|
37
35
|
rescue IOError => e
|
38
|
-
context.
|
36
|
+
context.log_warn { "IO Error in ptm_read_thread" }
|
39
37
|
break
|
40
38
|
rescue Errno::EIO => e
|
41
|
-
context.
|
39
|
+
context.log_info { "EIO Error in ptm_read_thread" }
|
42
40
|
break
|
43
41
|
rescue => e
|
44
|
-
context.
|
42
|
+
context.log_error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
|
45
43
|
break
|
46
44
|
end
|
47
45
|
end
|
@@ -51,29 +49,29 @@ module HrrRbSsh
|
|
51
49
|
begin
|
52
50
|
ptm.write context.io[0].readpartial(10240)
|
53
51
|
rescue EOFError => e
|
54
|
-
context.
|
52
|
+
context.log_info { "IO is EOF in ptm_write_thread" }
|
55
53
|
break
|
56
54
|
rescue IOError => e
|
57
|
-
context.
|
55
|
+
context.log_warn { "IO Error in ptm_write_thread" }
|
58
56
|
break
|
59
57
|
rescue Errno::EIO => e
|
60
|
-
context.
|
58
|
+
context.log_info { "EIO Error in ptm_read_thread" }
|
61
59
|
break
|
62
60
|
rescue => e
|
63
|
-
context.
|
61
|
+
context.log_error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
|
64
62
|
break
|
65
63
|
end
|
66
64
|
end
|
67
65
|
}
|
68
66
|
chain.call_next
|
69
67
|
ensure
|
70
|
-
context.
|
68
|
+
context.log_info { "closing pty-req request handler chain_proc" }
|
71
69
|
context.vars[:ptm].close rescue nil
|
72
70
|
context.vars[:pts].close rescue nil
|
73
71
|
ptm_read_thread.join
|
74
72
|
ptm_write_thread.exit
|
75
73
|
ptm_write_thread.join
|
76
|
-
context.
|
74
|
+
context.log_info { "pty-req request handler chain_proc closed" }
|
77
75
|
end
|
78
76
|
}
|
79
77
|
rescue => e
|
@@ -3,7 +3,6 @@
|
|
3
3
|
|
4
4
|
require 'etc'
|
5
5
|
require 'timeout'
|
6
|
-
require 'hrr_rb_ssh/logger'
|
7
6
|
require 'hrr_rb_ssh/connection/request_handler'
|
8
7
|
|
9
8
|
module HrrRbSsh
|
@@ -11,7 +10,6 @@ module HrrRbSsh
|
|
11
10
|
class RequestHandler
|
12
11
|
class ReferenceShellRequestHandler < RequestHandler
|
13
12
|
def initialize
|
14
|
-
@logger = Logger.new self.class.name
|
15
13
|
@proc = Proc.new { |context|
|
16
14
|
ptm = context.vars[:ptm]
|
17
15
|
pts = context.vars[:pts]
|
@@ -49,22 +47,22 @@ module HrrRbSsh
|
|
49
47
|
|
50
48
|
begin
|
51
49
|
pid, status = Process.waitpid2 pid
|
52
|
-
context.
|
50
|
+
context.log_info { "shell exited with status #{status.inspect}" }
|
53
51
|
status.exitstatus
|
54
52
|
ensure
|
55
53
|
unless status
|
56
|
-
context.
|
54
|
+
context.log_info { "exiting shell" }
|
57
55
|
Process.kill :TERM, pid
|
58
56
|
begin
|
59
57
|
Timeout.timeout(1) do
|
60
58
|
pid, status = Process.waitpid2 pid
|
61
59
|
end
|
62
60
|
rescue Timeout::Error
|
63
|
-
context.
|
61
|
+
context.log_warn { "force exiting shell" }
|
64
62
|
Process.kill :KILL, pid
|
65
63
|
pid, status = Process.waitpid2 pid
|
66
64
|
end
|
67
|
-
context.
|
65
|
+
context.log_info { "shell exited with status #{status.inspect}" }
|
68
66
|
end
|
69
67
|
end
|
70
68
|
}
|
@@ -2,7 +2,6 @@
|
|
2
2
|
# vim: et ts=2 sw=2
|
3
3
|
|
4
4
|
require 'io/console'
|
5
|
-
require 'hrr_rb_ssh/logger'
|
6
5
|
require 'hrr_rb_ssh/connection/request_handler'
|
7
6
|
|
8
7
|
module HrrRbSsh
|
@@ -10,7 +9,6 @@ module HrrRbSsh
|
|
10
9
|
class RequestHandler
|
11
10
|
class ReferenceWindowChangeRequestHandler < RequestHandler
|
12
11
|
def initialize
|
13
|
-
@logger = Logger.new self.class.name
|
14
12
|
@proc = Proc.new { |context|
|
15
13
|
context.vars[:ptm].winsize = [context.terminal_height_rows, context.terminal_width_columns, context.terminal_width_pixels, context.terminal_height_pixels]
|
16
14
|
}
|
@@ -1,15 +1,13 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
# vim: et ts=2 sw=2
|
3
3
|
|
4
|
-
require 'hrr_rb_ssh/logger'
|
5
|
-
|
6
4
|
module HrrRbSsh
|
7
5
|
class Connection
|
8
6
|
class RequestHandler
|
9
7
|
def initialize &block
|
10
|
-
@logger = Logger.new self.class.name
|
11
8
|
@proc = block
|
12
9
|
end
|
10
|
+
|
13
11
|
def run context
|
14
12
|
@proc.call context
|
15
13
|
end
|
@@ -1,27 +1,27 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
# vim: et ts=2 sw=2
|
3
3
|
|
4
|
-
require 'hrr_rb_ssh/
|
4
|
+
require 'hrr_rb_ssh/loggable'
|
5
5
|
require 'hrr_rb_ssh/error/closed_connection'
|
6
6
|
require 'hrr_rb_ssh/connection/global_request_handler'
|
7
7
|
require 'hrr_rb_ssh/connection/channel'
|
8
8
|
|
9
9
|
module HrrRbSsh
|
10
10
|
class Connection
|
11
|
+
include Loggable
|
12
|
+
|
11
13
|
attr_reader \
|
12
14
|
:username,
|
13
15
|
:variables,
|
14
16
|
:options,
|
15
17
|
:mode
|
16
18
|
|
17
|
-
def initialize authentication, mode, options={}
|
18
|
-
|
19
|
-
|
19
|
+
def initialize authentication, mode, options={}, logger: nil
|
20
|
+
self.logger = logger
|
20
21
|
@authentication = authentication
|
21
22
|
@mode = mode
|
22
23
|
@options = options
|
23
|
-
|
24
|
-
@global_request_handler = GlobalRequestHandler.new self
|
24
|
+
@global_request_handler = GlobalRequestHandler.new self, logger: logger
|
25
25
|
@channels = Hash.new
|
26
26
|
@username = nil
|
27
27
|
@variables = nil
|
@@ -48,7 +48,7 @@ module HrrRbSsh
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def start foreground: true
|
51
|
-
|
51
|
+
log_info { "start connection" }
|
52
52
|
@authentication.start
|
53
53
|
@closed = false
|
54
54
|
@connection_loop_thread = connection_loop_thread
|
@@ -62,20 +62,20 @@ module HrrRbSsh
|
|
62
62
|
end
|
63
63
|
|
64
64
|
def close
|
65
|
-
|
65
|
+
log_info { "closing connection" }
|
66
66
|
@closed = true
|
67
67
|
@authentication.close
|
68
68
|
@channels.values.each do |channel|
|
69
69
|
begin
|
70
70
|
channel.close
|
71
71
|
rescue => e
|
72
|
-
|
72
|
+
log_error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
|
73
73
|
end
|
74
74
|
end
|
75
75
|
@channels.clear
|
76
76
|
@global_request_handler.close
|
77
77
|
@connection_loop_thread.join unless @connection_loop_thread == Thread.current
|
78
|
-
|
78
|
+
log_info { "connection closed" }
|
79
79
|
end
|
80
80
|
|
81
81
|
def closed?
|
@@ -83,14 +83,14 @@ module HrrRbSsh
|
|
83
83
|
end
|
84
84
|
|
85
85
|
def connection_loop_thread
|
86
|
-
|
86
|
+
log_info { "start connection loop" }
|
87
87
|
Thread.new do
|
88
88
|
begin
|
89
89
|
while true
|
90
90
|
begin
|
91
91
|
payload = @authentication.receive
|
92
92
|
rescue Error::ClosedAuthentication => e
|
93
|
-
|
93
|
+
log_info { "authentication closed" }
|
94
94
|
break
|
95
95
|
end
|
96
96
|
@username ||= @authentication.username
|
@@ -115,22 +115,22 @@ module HrrRbSsh
|
|
115
115
|
when Message::SSH_MSG_CHANNEL_CLOSE::VALUE
|
116
116
|
channel_close payload
|
117
117
|
else
|
118
|
-
|
118
|
+
log_warn { "received unsupported message: id: #{payload[0,1].unpack("C")[0]}" }
|
119
119
|
end
|
120
120
|
end
|
121
121
|
rescue => e
|
122
|
-
|
122
|
+
log_error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
|
123
123
|
ensure
|
124
|
-
|
124
|
+
log_info { "closing connection loop" }
|
125
125
|
close
|
126
|
-
|
126
|
+
log_info { "connection loop closed" }
|
127
127
|
end
|
128
128
|
end
|
129
129
|
end
|
130
130
|
|
131
131
|
def global_request payload
|
132
|
-
|
133
|
-
message = Message::SSH_MSG_GLOBAL_REQUEST.decode payload
|
132
|
+
log_info { 'received ' + Message::SSH_MSG_GLOBAL_REQUEST::ID }
|
133
|
+
message = Message::SSH_MSG_GLOBAL_REQUEST.decode payload, logger: logger
|
134
134
|
begin
|
135
135
|
@global_request_handler.request message
|
136
136
|
rescue
|
@@ -145,10 +145,10 @@ module HrrRbSsh
|
|
145
145
|
end
|
146
146
|
|
147
147
|
def channel_open_start address, port, socket
|
148
|
-
|
149
|
-
channel = Channel.new self, {:'channel type' => "forwarded-tcpip"}, socket
|
148
|
+
log_info { 'channel open start' }
|
149
|
+
channel = Channel.new self, {:'channel type' => "forwarded-tcpip"}, socket, logger: logger
|
150
150
|
@channels[channel.local_channel] = channel
|
151
|
-
|
151
|
+
log_info { 'channel opened' }
|
152
152
|
message = {
|
153
153
|
:'message number' => Message::SSH_MSG_CHANNEL_OPEN::VALUE,
|
154
154
|
:'channel type' => "forwarded-tcpip",
|
@@ -164,25 +164,25 @@ module HrrRbSsh
|
|
164
164
|
end
|
165
165
|
|
166
166
|
def channel_open payload
|
167
|
-
|
168
|
-
message = Message::SSH_MSG_CHANNEL_OPEN.decode payload
|
167
|
+
log_info { 'received ' + Message::SSH_MSG_CHANNEL_OPEN::ID }
|
168
|
+
message = Message::SSH_MSG_CHANNEL_OPEN.decode payload, logger: logger
|
169
169
|
begin
|
170
|
-
channel = Channel.new self, message
|
170
|
+
channel = Channel.new self, message, logger: logger
|
171
171
|
@channels[channel.local_channel] = channel
|
172
172
|
channel.start
|
173
173
|
send_channel_open_confirmation channel
|
174
174
|
rescue => e
|
175
|
-
|
175
|
+
log_error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
|
176
176
|
recipient_channel = message[:'sender channel']
|
177
177
|
send_channel_open_failure recipient_channel, Message::SSH_MSG_CHANNEL_OPEN_FAILURE::ReasonCode::SSH_OPEN_CONNECT_FAILED, e.message
|
178
178
|
end
|
179
179
|
end
|
180
180
|
|
181
181
|
def request_channel_open channel_type, channel_specific_message={}, wait_response=true
|
182
|
-
|
182
|
+
log_info { 'request channel open' }
|
183
183
|
case channel_type
|
184
184
|
when "session"
|
185
|
-
channel = Channel.new self, {:'channel type' => channel_type}
|
185
|
+
channel = Channel.new self, {:'channel type' => channel_type}, logger: logger
|
186
186
|
@channels[channel.local_channel] = channel
|
187
187
|
end
|
188
188
|
message = {
|
@@ -193,13 +193,13 @@ module HrrRbSsh
|
|
193
193
|
:'maximum packet size' => channel.local_maximum_packet_size,
|
194
194
|
}
|
195
195
|
send_channel_open message.merge(channel_specific_message)
|
196
|
-
|
196
|
+
log_info { 'sent channel open' }
|
197
197
|
if wait_response
|
198
|
-
|
198
|
+
log_info { 'wait response' }
|
199
199
|
channel.wait_until_started
|
200
200
|
end
|
201
201
|
unless channel.closed?
|
202
|
-
|
202
|
+
log_info { 'channel opened' }
|
203
203
|
channel
|
204
204
|
else
|
205
205
|
raise "Faild opening channel"
|
@@ -207,67 +207,67 @@ module HrrRbSsh
|
|
207
207
|
end
|
208
208
|
|
209
209
|
def channel_open_confirmation payload
|
210
|
-
|
211
|
-
message = Message::SSH_MSG_CHANNEL_OPEN_CONFIRMATION.decode payload
|
210
|
+
log_info { 'received ' + Message::SSH_MSG_CHANNEL_OPEN_CONFIRMATION::ID }
|
211
|
+
message = Message::SSH_MSG_CHANNEL_OPEN_CONFIRMATION.decode payload, logger: logger
|
212
212
|
channel = @channels[message[:'recipient channel']]
|
213
213
|
channel.set_remote_parameters message
|
214
214
|
channel.start
|
215
215
|
end
|
216
216
|
|
217
217
|
def channel_request payload
|
218
|
-
|
219
|
-
message = Message::SSH_MSG_CHANNEL_REQUEST.decode payload
|
218
|
+
log_info { 'received ' + Message::SSH_MSG_CHANNEL_REQUEST::ID }
|
219
|
+
message = Message::SSH_MSG_CHANNEL_REQUEST.decode payload, logger: logger
|
220
220
|
local_channel = message[:'recipient channel']
|
221
221
|
@channels[local_channel].receive_message_queue.enq message
|
222
222
|
end
|
223
223
|
|
224
224
|
def channel_window_adjust payload
|
225
|
-
|
226
|
-
message = Message::SSH_MSG_CHANNEL_WINDOW_ADJUST.decode payload
|
225
|
+
log_info { 'received ' + Message::SSH_MSG_CHANNEL_WINDOW_ADJUST::ID }
|
226
|
+
message = Message::SSH_MSG_CHANNEL_WINDOW_ADJUST.decode payload, logger: logger
|
227
227
|
local_channel = message[:'recipient channel']
|
228
228
|
@channels[local_channel].receive_message_queue.enq message
|
229
229
|
end
|
230
230
|
|
231
231
|
def channel_data payload
|
232
|
-
|
233
|
-
message = Message::SSH_MSG_CHANNEL_DATA.decode payload
|
232
|
+
log_info { 'received ' + Message::SSH_MSG_CHANNEL_DATA::ID }
|
233
|
+
message = Message::SSH_MSG_CHANNEL_DATA.decode payload, logger: logger
|
234
234
|
local_channel = message[:'recipient channel']
|
235
235
|
@channels[local_channel].receive_message_queue.enq message
|
236
236
|
end
|
237
237
|
|
238
238
|
def channel_extended_data payload
|
239
|
-
|
240
|
-
message = Message::SSH_MSG_CHANNEL_EXTENDED_DATA.decode payload
|
239
|
+
log_info { 'received ' + Message::SSH_MSG_CHANNEL_EXTENDED_DATA::ID }
|
240
|
+
message = Message::SSH_MSG_CHANNEL_EXTENDED_DATA.decode payload, logger: logger
|
241
241
|
local_channel = message[:'recipient channel']
|
242
242
|
@channels[local_channel].receive_message_queue.enq message
|
243
243
|
end
|
244
244
|
|
245
245
|
def channel_eof payload
|
246
|
-
|
247
|
-
message = Message::SSH_MSG_CHANNEL_EOF.decode payload
|
246
|
+
log_info { 'received ' + Message::SSH_MSG_CHANNEL_EOF::ID }
|
247
|
+
message = Message::SSH_MSG_CHANNEL_EOF.decode payload, logger: logger
|
248
248
|
local_channel = message[:'recipient channel']
|
249
249
|
@channels[local_channel].receive_message_queue.enq message
|
250
250
|
end
|
251
251
|
|
252
252
|
def channel_close payload
|
253
|
-
|
254
|
-
message = Message::SSH_MSG_CHANNEL_CLOSE.decode payload
|
253
|
+
log_info { 'received ' + Message::SSH_MSG_CHANNEL_CLOSE::ID }
|
254
|
+
message = Message::SSH_MSG_CHANNEL_CLOSE.decode payload, logger: logger
|
255
255
|
local_channel = message[:'recipient channel']
|
256
256
|
channel = @channels[local_channel]
|
257
257
|
channel.close
|
258
|
-
|
258
|
+
log_info { "wait until threads closed in channel" }
|
259
259
|
channel.wait_until_closed
|
260
|
-
|
261
|
-
|
260
|
+
log_info { "channel closed" }
|
261
|
+
log_info { "deleting channel" }
|
262
262
|
@channels.delete local_channel
|
263
|
-
|
263
|
+
log_info { "channel deleted" }
|
264
264
|
end
|
265
265
|
|
266
266
|
def send_request_success
|
267
267
|
message = {
|
268
268
|
:'message number' => Message::SSH_MSG_REQUEST_SUCCESS::VALUE,
|
269
269
|
}
|
270
|
-
payload = Message::SSH_MSG_REQUEST_SUCCESS.encode message
|
270
|
+
payload = Message::SSH_MSG_REQUEST_SUCCESS.encode message, logger: logger
|
271
271
|
@authentication.send payload
|
272
272
|
end
|
273
273
|
|
@@ -275,12 +275,12 @@ module HrrRbSsh
|
|
275
275
|
message = {
|
276
276
|
:'message number' => Message::SSH_MSG_REQUEST_FAILURE::VALUE,
|
277
277
|
}
|
278
|
-
payload = Message::SSH_MSG_REQUEST_FAILURE.encode message
|
278
|
+
payload = Message::SSH_MSG_REQUEST_FAILURE.encode message, logger: logger
|
279
279
|
@authentication.send payload
|
280
280
|
end
|
281
281
|
|
282
282
|
def send_channel_open message
|
283
|
-
payload = Message::SSH_MSG_CHANNEL_OPEN.encode message
|
283
|
+
payload = Message::SSH_MSG_CHANNEL_OPEN.encode message, logger: logger
|
284
284
|
@authentication.send payload
|
285
285
|
end
|
286
286
|
|
@@ -293,7 +293,7 @@ module HrrRbSsh
|
|
293
293
|
:'initial window size' => channel.local_window_size,
|
294
294
|
:'maximum packet size' => channel.local_maximum_packet_size,
|
295
295
|
}
|
296
|
-
payload = Message::SSH_MSG_CHANNEL_OPEN_CONFIRMATION.encode message
|
296
|
+
payload = Message::SSH_MSG_CHANNEL_OPEN_CONFIRMATION.encode message, logger: logger
|
297
297
|
@authentication.send payload
|
298
298
|
end
|
299
299
|
|
@@ -305,7 +305,7 @@ module HrrRbSsh
|
|
305
305
|
:'description' => description,
|
306
306
|
:'language tag' => "",
|
307
307
|
}
|
308
|
-
payload = Message::SSH_MSG_CHANNEL_OPEN_FAILURE.encode message
|
308
|
+
payload = Message::SSH_MSG_CHANNEL_OPEN_FAILURE.encode message, logger: logger
|
309
309
|
@authentication.send payload
|
310
310
|
end
|
311
311
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
module HrrRbSsh
|
5
|
+
module Loggable
|
6
|
+
attr_accessor :logger, :log_key
|
7
|
+
|
8
|
+
def log_fatal
|
9
|
+
if logger
|
10
|
+
logger.fatal(log_key){ yield }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def log_error
|
15
|
+
if logger
|
16
|
+
logger.error(log_key){ yield }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def log_warn
|
21
|
+
if logger
|
22
|
+
logger.warn(log_key){ yield }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def log_info
|
27
|
+
if logger
|
28
|
+
logger.info(log_key){ yield }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def log_debug
|
33
|
+
if logger
|
34
|
+
logger.debug(log_key){ yield }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def log_key
|
39
|
+
@log_key ||= self.class.to_s + "[%x]" % object_id
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/hrr_rb_ssh/server.rb
CHANGED
@@ -1,28 +1,30 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
# vim: et ts=2 sw=2
|
3
3
|
|
4
|
-
require 'hrr_rb_ssh/
|
4
|
+
require 'hrr_rb_ssh/loggable'
|
5
5
|
require 'hrr_rb_ssh/transport'
|
6
6
|
require 'hrr_rb_ssh/authentication'
|
7
7
|
require 'hrr_rb_ssh/connection'
|
8
8
|
|
9
9
|
module HrrRbSsh
|
10
10
|
class Server
|
11
|
-
|
12
|
-
|
11
|
+
include Loggable
|
12
|
+
|
13
|
+
def self.start io, options={}, logger: nil
|
14
|
+
server = self.new options, logger: logger
|
13
15
|
server.start io
|
14
16
|
end
|
15
17
|
|
16
|
-
def initialize options={}
|
17
|
-
|
18
|
+
def initialize options={}, logger: nil
|
19
|
+
self.logger = logger
|
18
20
|
@options = options
|
19
21
|
end
|
20
22
|
|
21
23
|
def start io
|
22
|
-
|
23
|
-
transport = Transport.new io, Mode::SERVER, @options
|
24
|
-
authentication = Authentication.new transport, Mode::SERVER, @options
|
25
|
-
connection = Connection.new authentication, Mode::SERVER, @options
|
24
|
+
log_info { "start server service" }
|
25
|
+
transport = Transport.new io, Mode::SERVER, @options, logger: logger
|
26
|
+
authentication = Authentication.new transport, Mode::SERVER, @options, logger: logger
|
27
|
+
connection = Connection.new authentication, Mode::SERVER, @options, logger: logger
|
26
28
|
connection.start
|
27
29
|
end
|
28
30
|
end
|
@@ -2,14 +2,16 @@
|
|
2
2
|
# vim: et ts=2 sw=2
|
3
3
|
|
4
4
|
require 'zlib'
|
5
|
-
require 'hrr_rb_ssh/
|
5
|
+
require 'hrr_rb_ssh/loggable'
|
6
6
|
|
7
7
|
module HrrRbSsh
|
8
8
|
class Transport
|
9
9
|
class CompressionAlgorithm
|
10
10
|
module Functionable
|
11
|
-
|
12
|
-
|
11
|
+
include Loggable
|
12
|
+
|
13
|
+
def initialize direction, logger: nil
|
14
|
+
self.logger = logger
|
13
15
|
case direction
|
14
16
|
when Direction::OUTGOING
|
15
17
|
@deflator = ::Zlib::Deflate.new
|
@@ -1,14 +1,16 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
# vim: et ts=2 sw=2
|
3
3
|
|
4
|
-
require 'hrr_rb_ssh/
|
4
|
+
require 'hrr_rb_ssh/loggable'
|
5
5
|
|
6
6
|
module HrrRbSsh
|
7
7
|
class Transport
|
8
8
|
class CompressionAlgorithm
|
9
9
|
module Unfunctionable
|
10
|
-
|
11
|
-
|
10
|
+
include Loggable
|
11
|
+
|
12
|
+
def initialize direction=nil, logger: nil
|
13
|
+
self.logger = logger
|
12
14
|
end
|
13
15
|
|
14
16
|
def deflate data
|
@@ -1,20 +1,22 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
# vim: et ts=2 sw=2
|
3
3
|
|
4
|
-
require 'hrr_rb_ssh/
|
4
|
+
require 'hrr_rb_ssh/loggable'
|
5
5
|
|
6
6
|
module HrrRbSsh
|
7
7
|
class Transport
|
8
8
|
class EncryptionAlgorithm
|
9
9
|
module Functionable
|
10
|
+
include Loggable
|
11
|
+
|
10
12
|
def self.included klass
|
11
13
|
cipher = OpenSSL::Cipher.new(klass::CIPHER_NAME)
|
12
14
|
klass.const_set(:IV_LENGTH, cipher.iv_len)
|
13
15
|
klass.const_set(:KEY_LENGTH, cipher.key_len)
|
14
16
|
end
|
15
17
|
|
16
|
-
def initialize direction, iv, key
|
17
|
-
|
18
|
+
def initialize direction, iv, key, logger: nil
|
19
|
+
self.logger = logger
|
18
20
|
@cipher = OpenSSL::Cipher.new(self.class::CIPHER_NAME)
|
19
21
|
case direction
|
20
22
|
when Direction::OUTGOING
|
@@ -1,19 +1,21 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
# vim: et ts=2 sw=2
|
3
3
|
|
4
|
-
require 'hrr_rb_ssh/
|
4
|
+
require 'hrr_rb_ssh/loggable'
|
5
5
|
|
6
6
|
module HrrRbSsh
|
7
7
|
class Transport
|
8
8
|
class EncryptionAlgorithm
|
9
9
|
module Unfunctionable
|
10
|
+
include Loggable
|
11
|
+
|
10
12
|
def self.included klass
|
11
13
|
klass.const_set(:IV_LENGTH, 0)
|
12
14
|
klass.const_set(:KEY_LENGTH, 0)
|
13
15
|
end
|
14
16
|
|
15
|
-
def initialize direction=nil, iv=nil, key=nil
|
16
|
-
|
17
|
+
def initialize direction=nil, iv=nil, key=nil, logger: nil
|
18
|
+
self.logger = logger
|
17
19
|
end
|
18
20
|
|
19
21
|
def block_size
|