hrr_rb_ssh 0.1.4 → 0.1.5

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.
Files changed (115) hide show
  1. checksums.yaml +4 -4
  2. data/demo/server.rb +10 -2
  3. data/lib/hrr_rb_ssh/authentication/method/none.rb +1 -1
  4. data/lib/hrr_rb_ssh/authentication/method/password.rb +2 -2
  5. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp256/ecdsa_signature_blob.rb +27 -0
  6. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp256/public_key_blob.rb +28 -0
  7. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp256/signature.rb +27 -0
  8. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp256/signature_blob.rb +33 -0
  9. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp256.rb +84 -0
  10. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp384/ecdsa_signature_blob.rb +27 -0
  11. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp384/public_key_blob.rb +28 -0
  12. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp384/signature.rb +27 -0
  13. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp384/signature_blob.rb +33 -0
  14. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp384.rb +84 -0
  15. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp521/ecdsa_signature_blob.rb +27 -0
  16. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp521/public_key_blob.rb +28 -0
  17. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp521/signature.rb +27 -0
  18. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp521/signature_blob.rb +33 -0
  19. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ecdsa_sha2_nistp521.rb +84 -0
  20. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_dss/public_key_blob.rb +5 -5
  21. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_dss/signature.rb +2 -2
  22. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_dss/signature_blob.rb +8 -8
  23. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_dss.rb +24 -24
  24. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_rsa/public_key_blob.rb +3 -3
  25. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_rsa/signature.rb +2 -2
  26. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_rsa/signature_blob.rb +8 -8
  27. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm/ssh_rsa.rb +19 -19
  28. data/lib/hrr_rb_ssh/authentication/method/publickey/algorithm.rb +3 -0
  29. data/lib/hrr_rb_ssh/authentication/method/publickey/context.rb +7 -7
  30. data/lib/hrr_rb_ssh/authentication/method/publickey.rb +7 -7
  31. data/lib/hrr_rb_ssh/authentication.rb +6 -6
  32. data/lib/hrr_rb_ssh/codable.rb +7 -2
  33. data/lib/hrr_rb_ssh/connection/channel/channel_type/direct_tcpip.rb +102 -0
  34. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/proc_chain/chain_context.rb +26 -0
  35. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/proc_chain.rb +29 -0
  36. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/env/context.rb +2 -2
  37. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/exec/context.rb +1 -1
  38. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/pty_req/context.rb +6 -6
  39. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/subsystem/context.rb +1 -1
  40. data/lib/hrr_rb_ssh/connection/channel/channel_type/session/request_type/window_change/context.rb +4 -4
  41. data/lib/hrr_rb_ssh/connection/channel/channel_type/session.rb +42 -0
  42. data/lib/hrr_rb_ssh/connection/channel/channel_type.rb +1 -0
  43. data/lib/hrr_rb_ssh/connection/channel.rb +50 -63
  44. data/lib/hrr_rb_ssh/connection/request_handler/reference_shell_request_handler.rb +29 -9
  45. data/lib/hrr_rb_ssh/connection.rb +22 -27
  46. data/lib/hrr_rb_ssh/message/001_ssh_msg_disconnect.rb +4 -4
  47. data/lib/hrr_rb_ssh/message/002_ssh_msg_ignore.rb +2 -2
  48. data/lib/hrr_rb_ssh/message/003_ssh_msg_unimplemented.rb +2 -2
  49. data/lib/hrr_rb_ssh/message/004_ssh_msg_debug.rb +4 -4
  50. data/lib/hrr_rb_ssh/message/005_ssh_msg_service_request.rb +2 -2
  51. data/lib/hrr_rb_ssh/message/006_ssh_msg_service_accept.rb +2 -2
  52. data/lib/hrr_rb_ssh/message/020_ssh_msg_kexinit.rb +29 -29
  53. data/lib/hrr_rb_ssh/message/021_ssh_msg_newkeys.rb +1 -1
  54. data/lib/hrr_rb_ssh/message/030_ssh_msg_kex_dh_gex_request_old.rb +2 -2
  55. data/lib/hrr_rb_ssh/message/030_ssh_msg_kexdh_init.rb +2 -2
  56. data/lib/hrr_rb_ssh/message/030_ssh_msg_kexecdh_init.rb +24 -0
  57. data/lib/hrr_rb_ssh/message/031_ssh_msg_kex_dh_gex_group.rb +3 -3
  58. data/lib/hrr_rb_ssh/message/031_ssh_msg_kexdh_reply.rb +4 -4
  59. data/lib/hrr_rb_ssh/message/031_ssh_msg_kexecdh_reply.rb +26 -0
  60. data/lib/hrr_rb_ssh/message/032_ssh_msg_kex_dh_gex_init.rb +2 -2
  61. data/lib/hrr_rb_ssh/message/033_ssh_msg_kex_dh_gex_reply.rb +4 -4
  62. data/lib/hrr_rb_ssh/message/034_ssh_msg_kex_dh_gex_request.rb +4 -4
  63. data/lib/hrr_rb_ssh/message/050_ssh_msg_userauth_request.rb +17 -17
  64. data/lib/hrr_rb_ssh/message/051_ssh_msg_userauth_failure.rb +3 -3
  65. data/lib/hrr_rb_ssh/message/052_ssh_msg_userauth_success.rb +1 -1
  66. data/lib/hrr_rb_ssh/message/060_ssh_msg_userauth_pk_ok.rb +3 -3
  67. data/lib/hrr_rb_ssh/message/080_ssh_msg_global_request.rb +12 -12
  68. data/lib/hrr_rb_ssh/message/081_ssh_msg_request_success.rb +5 -5
  69. data/lib/hrr_rb_ssh/message/082_ssh_msg_request_failure.rb +1 -1
  70. data/lib/hrr_rb_ssh/message/090_ssh_msg_channel_open.rb +24 -24
  71. data/lib/hrr_rb_ssh/message/091_ssh_msg_channel_open_confirmation.rb +14 -24
  72. data/lib/hrr_rb_ssh/message/092_ssh_msg_channel_open_failure.rb +5 -5
  73. data/lib/hrr_rb_ssh/message/093_ssh_msg_channel_window_adjust.rb +3 -3
  74. data/lib/hrr_rb_ssh/message/094_ssh_msg_channel_data.rb +3 -3
  75. data/lib/hrr_rb_ssh/message/095_ssh_msg_channel_extended_data.rb +4 -4
  76. data/lib/hrr_rb_ssh/message/096_ssh_msg_channel_eof.rb +2 -2
  77. data/lib/hrr_rb_ssh/message/097_ssh_msg_channel_close.rb +2 -2
  78. data/lib/hrr_rb_ssh/message/098_ssh_msg_channel_request.rb +51 -51
  79. data/lib/hrr_rb_ssh/message/099_ssh_msg_channel_success.rb +2 -2
  80. data/lib/hrr_rb_ssh/message/100_ssh_msg_channel_failure.rb +2 -2
  81. data/lib/hrr_rb_ssh/message.rb +2 -0
  82. data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman/h0.rb +8 -8
  83. data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman.rb +13 -13
  84. data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange/h0.rb +13 -13
  85. data/lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange.rb +24 -24
  86. data/lib/hrr_rb_ssh/transport/kex_algorithm/elliptic_curve_diffie_hellman/h0.rb +29 -0
  87. data/lib/hrr_rb_ssh/transport/kex_algorithm/elliptic_curve_diffie_hellman.rb +132 -0
  88. data/lib/hrr_rb_ssh/transport/kex_algorithm/elliptic_curve_diffie_hellman_sha2_nistp256.rb +18 -0
  89. data/lib/hrr_rb_ssh/transport/kex_algorithm/elliptic_curve_diffie_hellman_sha2_nistp384.rb +18 -0
  90. data/lib/hrr_rb_ssh/transport/kex_algorithm/elliptic_curve_diffie_hellman_sha2_nistp521.rb +18 -0
  91. data/lib/hrr_rb_ssh/transport/kex_algorithm.rb +3 -0
  92. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ecdsa_sha2_nistp256/ecdsa_signature_blob.rb +23 -0
  93. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ecdsa_sha2_nistp256/public_key_blob.rb +25 -0
  94. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ecdsa_sha2_nistp256/signature.rb +23 -0
  95. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ecdsa_sha2_nistp256.rb +79 -0
  96. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ecdsa_sha2_nistp384/ecdsa_signature_blob.rb +23 -0
  97. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ecdsa_sha2_nistp384/public_key_blob.rb +25 -0
  98. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ecdsa_sha2_nistp384/signature.rb +23 -0
  99. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ecdsa_sha2_nistp384.rb +80 -0
  100. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ecdsa_sha2_nistp521/ecdsa_signature_blob.rb +23 -0
  101. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ecdsa_sha2_nistp521/public_key_blob.rb +25 -0
  102. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ecdsa_sha2_nistp521/signature.rb +23 -0
  103. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ecdsa_sha2_nistp521.rb +81 -0
  104. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_dss/public_key_blob.rb +5 -5
  105. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_dss/signature.rb +2 -2
  106. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_dss.rb +9 -9
  107. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_rsa/public_key_blob.rb +3 -3
  108. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_rsa/signature.rb +2 -2
  109. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_rsa.rb +6 -6
  110. data/lib/hrr_rb_ssh/transport/server_host_key_algorithm.rb +3 -0
  111. data/lib/hrr_rb_ssh/transport.rb +30 -30
  112. data/lib/hrr_rb_ssh/version.rb +1 -1
  113. metadata +39 -4
  114. data/lib/hrr_rb_ssh/connection/channel/proc_chain/chain_context.rb +0 -22
  115. data/lib/hrr_rb_ssh/connection/channel/proc_chain.rb +0 -25
@@ -33,12 +33,12 @@ module HrrRbSsh
33
33
  @variables = variables
34
34
  @vars = variables
35
35
 
36
- @term_environment_variable_value = message['TERM environment variable value']
37
- @terminal_width_characters = message['terminal width, characters']
38
- @terminal_height_rows = message['terminal height, rows']
39
- @terminal_width_pixels = message['terminal width, pixels']
40
- @terminal_height_pixels = message['terminal height, pixels']
41
- @encoded_terminal_modes = message['encoded terminal modes']
36
+ @term_environment_variable_value = message[:'TERM environment variable value']
37
+ @terminal_width_characters = message[:'terminal width, characters']
38
+ @terminal_height_rows = message[:'terminal height, rows']
39
+ @terminal_width_pixels = message[:'terminal width, pixels']
40
+ @terminal_height_pixels = message[:'terminal height, pixels']
41
+ @encoded_terminal_modes = message[:'encoded terminal modes']
42
42
  end
43
43
 
44
44
  def chain_proc &block
@@ -28,7 +28,7 @@ module HrrRbSsh
28
28
  @variables = variables
29
29
  @vars = variables
30
30
 
31
- @subsystem_name = message['subsystem name']
31
+ @subsystem_name = message[:'subsystem name']
32
32
  end
33
33
 
34
34
  def chain_proc &block
@@ -31,10 +31,10 @@ module HrrRbSsh
31
31
  @variables = variables
32
32
  @vars = variables
33
33
 
34
- @terminal_width_columns = message['terminal width, columns']
35
- @terminal_height_rows = message['terminal height, rows']
36
- @terminal_width_pixels = message['terminal width, pixels']
37
- @terminal_height_pixels = message['terminal height, pixels']
34
+ @terminal_width_columns = message[:'terminal width, columns']
35
+ @terminal_height_rows = message[:'terminal height, rows']
36
+ @terminal_width_pixels = message[:'terminal width, pixels']
37
+ @terminal_height_pixels = message[:'terminal height, pixels']
38
38
  end
39
39
 
40
40
  def chain_proc &block
@@ -1,16 +1,58 @@
1
1
  # coding: utf-8
2
2
  # vim: et ts=2 sw=2
3
3
 
4
+ require 'hrr_rb_ssh/logger'
5
+
4
6
  module HrrRbSsh
5
7
  class Connection
6
8
  class Channel
7
9
  class ChannelType
8
10
  class Session < ChannelType
9
11
  NAME = 'session'
12
+
13
+ def initialize connection, channel, message
14
+ @logger = HrrRbSsh::Logger.new self.class.name
15
+ @connection = connection
16
+ @channel = channel
17
+ @variables = {}
18
+ @proc_chain = ProcChain.new
19
+ end
20
+
21
+ def start
22
+ @proc_chain_thread = proc_chain_thread
23
+ end
24
+
25
+ def close
26
+ if @proc_chain_thread
27
+ @proc_chain_thread.exit
28
+ end
29
+ end
30
+
31
+ def request message
32
+ request_type = message[:'request type']
33
+ RequestType[request_type].run @proc_chain, @connection.username, @channel.request_handler_io, @variables, message, @connection.options
34
+ end
35
+
36
+ def proc_chain_thread
37
+ Thread.start {
38
+ @logger.info("start proc chain thread")
39
+ begin
40
+ exitstatus = @proc_chain.call_next
41
+ rescue => e
42
+ @logger.error([e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join)
43
+ exitstatus = 1
44
+ ensure
45
+ @logger.info("closing proc chain thread")
46
+ @channel.close from=:channel_type_instance, exitstatus=exitstatus
47
+ @logger.info("proc chain thread closed")
48
+ end
49
+ }
50
+ end
10
51
  end
11
52
  end
12
53
  end
13
54
  end
14
55
  end
15
56
 
57
+ require 'hrr_rb_ssh/connection/channel/channel_type/session/proc_chain'
16
58
  require 'hrr_rb_ssh/connection/channel/channel_type/session/request_type'
@@ -28,3 +28,4 @@ module HrrRbSsh
28
28
  end
29
29
 
30
30
  require 'hrr_rb_ssh/connection/channel/channel_type/session'
31
+ require 'hrr_rb_ssh/connection/channel/channel_type/direct_tcpip'
@@ -3,7 +3,6 @@
3
3
 
4
4
  require 'socket'
5
5
  require 'hrr_rb_ssh/logger'
6
- require 'hrr_rb_ssh/connection/channel/proc_chain'
7
6
  require 'hrr_rb_ssh/connection/channel/channel_type'
8
7
 
9
8
  module HrrRbSsh
@@ -13,24 +12,34 @@ module HrrRbSsh
13
12
  MAXIMUM_PACKET_SIZE = 100000
14
13
 
15
14
  attr_reader \
16
- :receive_payload_queue
15
+ :channel_type,
16
+ :local_channel,
17
+ :remote_channel,
18
+ :local_window_size,
19
+ :local_maximum_packet_size,
20
+ :remote_window_size,
21
+ :remote_maximum_packet_size,
22
+ :receive_message_queue,
23
+ :request_handler_io
17
24
 
18
- def initialize connection, channel_type, local_channel, remote_channel, initial_window_size, maximum_packet_size
25
+ def initialize connection, message
19
26
  @logger = HrrRbSsh::Logger.new self.class.name
20
27
 
21
28
  @connection = connection
22
- @channel_type = channel_type
23
- @local_channel = local_channel
24
- @remote_channel = remote_channel
29
+
30
+ @channel_type = message[:'channel type']
31
+ @local_channel = message[:'sender channel']
32
+ @remote_channel = message[:'sender channel']
25
33
  @local_window_size = INITIAL_WINDOW_SIZE
26
34
  @local_maximum_packet_size = MAXIMUM_PACKET_SIZE
27
- @remote_window_size = initial_window_size
28
- @remote_maximum_packet_size = maximum_packet_size
35
+ @remote_window_size = message[:'initial window size']
36
+ @remote_maximum_packet_size = message[:'maximum packet size']
37
+
38
+ @channel_type_instance = ChannelType[@channel_type].new connection, self, message
29
39
 
30
- @receive_payload_queue = Queue.new
40
+ @receive_message_queue = Queue.new
31
41
  @receive_data_queue = Queue.new
32
42
 
33
- @proc_chain = ProcChain.new
34
43
  @channel_io, @request_handler_io = UNIXSocket.pair
35
44
 
36
45
  @closed = nil
@@ -40,7 +49,7 @@ module HrrRbSsh
40
49
  @channel_loop_thread = channel_loop_thread
41
50
  @sender_thread = sender_thread
42
51
  @receiver_thread = receiver_thread
43
- @proc_chain_thread = proc_chain_thread
52
+ @channel_type_instance.start
44
53
  @closed = false
45
54
  end
46
55
 
@@ -48,10 +57,10 @@ module HrrRbSsh
48
57
  return if @closed
49
58
  @logger.info("close channel")
50
59
  @closed = true
51
- unless from == :proc_chain_thread
52
- @proc_chain_thread.exit
60
+ unless from == :channel_type_instance
61
+ @channel_type_instance.close
53
62
  end
54
- @receive_payload_queue.close
63
+ @receive_message_queue.close
55
64
  @receive_data_queue.close
56
65
  begin
57
66
  @request_handler_io.close
@@ -64,7 +73,7 @@ module HrrRbSsh
64
73
  Thread.pass
65
74
  end
66
75
  begin
67
- if from == :proc_chain_thread
76
+ if from == :channel_type_instance
68
77
  send_channel_eof
69
78
  case exitstatus
70
79
  when Integer
@@ -89,29 +98,28 @@ module HrrRbSsh
89
98
  def channel_loop_thread
90
99
  Thread.start do
91
100
  @logger.info("start channel loop thread")
92
- variables = {}
93
101
  loop do
94
102
  begin
95
- message = @receive_payload_queue.deq
96
- if message.nil? && @receive_payload_queue.closed?
103
+ message = @receive_message_queue.deq
104
+ if message.nil? && @receive_message_queue.closed?
97
105
  @receive_data_queue.close
98
106
  @logger.info("closing channel loop thread")
99
107
  break
100
108
  end
101
- case message['message number']
109
+ case message[:'message number']
102
110
  when HrrRbSsh::Message::SSH_MSG_CHANNEL_REQUEST::VALUE
103
- @logger.info("received channel request: #{message['request type']}")
104
- request message, variables
105
- if message['want reply']
111
+ @logger.info("received channel request: #{message[:'request type']}")
112
+ @channel_type_instance.request message
113
+ if message[:'want reply']
106
114
  send_channel_success
107
115
  end
108
116
  when HrrRbSsh::Message::SSH_MSG_CHANNEL_DATA::VALUE
109
117
  @logger.info("received channel data")
110
- local_channel = message['recipient channel']
111
- @receive_data_queue.enq message['data']
118
+ local_channel = message[:'recipient channel']
119
+ @receive_data_queue.enq message[:'data']
112
120
  when HrrRbSsh::Message::SSH_MSG_CHANNEL_WINDOW_ADJUST::VALUE
113
121
  @logger.debug("received channel window adjust")
114
- @remote_window_size = [@remote_window_size + message['bytes to add'], 0xffff_ffff].min
122
+ @remote_window_size = [@remote_window_size + message[:'bytes to add'], 0xffff_ffff].min
115
123
  else
116
124
  @logger.warn("received unsupported message: #{message.inspect}")
117
125
  end
@@ -191,31 +199,10 @@ module HrrRbSsh
191
199
  }
192
200
  end
193
201
 
194
- def proc_chain_thread
195
- Thread.start {
196
- @logger.info("start proc chain thread")
197
- begin
198
- exitstatus = @proc_chain.call_next
199
- rescue => e
200
- @logger.error([e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join)
201
- exitstatus = 1
202
- ensure
203
- @logger.info("closing proc chain thread")
204
- close from=:proc_chain_thread, exitstatus=exitstatus
205
- @logger.info("proc chain thread closed")
206
- end
207
- }
208
- end
209
-
210
- def request message, variables
211
- request_type = message['request type']
212
- ChannelType[@channel_type]::RequestType[request_type].run @proc_chain, @connection.username, @request_handler_io, variables, message, @connection.options
213
- end
214
-
215
202
  def send_channel_success
216
203
  message = {
217
- 'message number' => HrrRbSsh::Message::SSH_MSG_CHANNEL_SUCCESS::VALUE,
218
- 'recipient channel' => @remote_channel,
204
+ :'message number' => HrrRbSsh::Message::SSH_MSG_CHANNEL_SUCCESS::VALUE,
205
+ :'recipient channel' => @remote_channel,
219
206
  }
220
207
  payload = HrrRbSsh::Message::SSH_MSG_CHANNEL_SUCCESS.encode message
221
208
  @connection.send payload
@@ -223,9 +210,9 @@ module HrrRbSsh
223
210
 
224
211
  def send_channel_window_adjust
225
212
  message = {
226
- 'message number' => HrrRbSsh::Message::SSH_MSG_CHANNEL_WINDOW_ADJUST::VALUE,
227
- 'recipient channel' => @remote_channel,
228
- 'bytes to add' => INITIAL_WINDOW_SIZE,
213
+ :'message number' => HrrRbSsh::Message::SSH_MSG_CHANNEL_WINDOW_ADJUST::VALUE,
214
+ :'recipient channel' => @remote_channel,
215
+ :'bytes to add' => INITIAL_WINDOW_SIZE,
229
216
  }
230
217
  payload = HrrRbSsh::Message::SSH_MSG_CHANNEL_WINDOW_ADJUST.encode message
231
218
  @connection.send payload
@@ -233,9 +220,9 @@ module HrrRbSsh
233
220
 
234
221
  def send_channel_data data
235
222
  message = {
236
- 'message number' => HrrRbSsh::Message::SSH_MSG_CHANNEL_DATA::VALUE,
237
- 'recipient channel' => @remote_channel,
238
- 'data' => data,
223
+ :'message number' => HrrRbSsh::Message::SSH_MSG_CHANNEL_DATA::VALUE,
224
+ :'recipient channel' => @remote_channel,
225
+ :'data' => data,
239
226
  }
240
227
  payload = HrrRbSsh::Message::SSH_MSG_CHANNEL_DATA.encode message
241
228
  @connection.send payload
@@ -243,11 +230,11 @@ module HrrRbSsh
243
230
 
244
231
  def send_channel_request_exit_status exitstatus
245
232
  message = {
246
- 'message number' => HrrRbSsh::Message::SSH_MSG_CHANNEL_REQUEST::VALUE,
247
- 'recipient channel' => @remote_channel,
248
- 'request type' => 'exit-status',
249
- 'want reply' => false,
250
- 'exit status' => exitstatus,
233
+ :'message number' => HrrRbSsh::Message::SSH_MSG_CHANNEL_REQUEST::VALUE,
234
+ :'recipient channel' => @remote_channel,
235
+ :'request type' => "exit-status",
236
+ :'want reply' => false,
237
+ :'exit status' => exitstatus,
251
238
  }
252
239
  payload = HrrRbSsh::Message::SSH_MSG_CHANNEL_REQUEST.encode message
253
240
  @connection.send payload
@@ -255,8 +242,8 @@ module HrrRbSsh
255
242
 
256
243
  def send_channel_eof
257
244
  message = {
258
- 'message number' => HrrRbSsh::Message::SSH_MSG_CHANNEL_EOF::VALUE,
259
- 'recipient channel' => @remote_channel,
245
+ :'message number' => HrrRbSsh::Message::SSH_MSG_CHANNEL_EOF::VALUE,
246
+ :'recipient channel' => @remote_channel,
260
247
  }
261
248
  payload = HrrRbSsh::Message::SSH_MSG_CHANNEL_EOF.encode message
262
249
  @connection.send payload
@@ -264,8 +251,8 @@ module HrrRbSsh
264
251
 
265
252
  def send_channel_close
266
253
  message = {
267
- 'message number' => HrrRbSsh::Message::SSH_MSG_CHANNEL_CLOSE::VALUE,
268
- 'recipient channel' => @remote_channel,
254
+ :'message number' => HrrRbSsh::Message::SSH_MSG_CHANNEL_CLOSE::VALUE,
255
+ :'recipient channel' => @remote_channel,
269
256
  }
270
257
  payload = HrrRbSsh::Message::SSH_MSG_CHANNEL_CLOSE.encode message
271
258
  @connection.send payload
@@ -1,6 +1,7 @@
1
1
  # coding: utf-8
2
2
  # vim: et ts=2 sw=2
3
3
 
4
+ require 'timeout'
4
5
  require 'hrr_rb_ssh/logger'
5
6
  require 'hrr_rb_ssh/connection/request_handler'
6
7
 
@@ -23,7 +24,7 @@ module HrrRbSsh
23
24
  STDERR.reopen pts, 'w'
24
25
  pts.close
25
26
  context.vars[:env] ||= Hash.new
26
- exec context.vars[:env], 'login', '-f', context.username
27
+ exec context.vars[:env], 'login', '-pf', context.username
27
28
  end
28
29
 
29
30
  pts.close
@@ -62,16 +63,35 @@ module HrrRbSsh
62
63
  end
63
64
  }
64
65
 
65
- pid, status = Process.waitpid2 pid
66
- threads.each do |t|
67
- begin
68
- t.exit
69
- t.join
70
- rescue => e
71
- context.logger.error(e.full_message)
66
+ begin
67
+ pid, status = Process.waitpid2 pid
68
+ context.logger.info "shell exited with status #{status.inspect}"
69
+ status.exitstatus
70
+ ensure
71
+ unless status
72
+ context.logger.info "exiting shell"
73
+ Process.kill :TERM, pid
74
+ begin
75
+ Timeout.timeout(1) do
76
+ pid, status = Process.waitpid2 pid
77
+ end
78
+ rescue Timeout::Error
79
+ context.logger.warn "force exiting shell"
80
+ Process.kill :KILL, pid
81
+ pid, status = Process.waitpid2 pid
82
+ end
83
+ context.logger.info "shell exited with status #{status.inspect}"
84
+ end
85
+ threads.each do |t|
86
+ begin
87
+ t.exit
88
+ t.join
89
+ rescue => e
90
+ context.logger.error(e.full_message)
91
+ end
72
92
  end
93
+ context.logger.info "proc chain finished"
73
94
  end
74
- status.exitstatus
75
95
  }
76
96
  }
77
97
  end
@@ -90,7 +90,7 @@ module HrrRbSsh
90
90
  def global_request payload
91
91
  @logger.info('received ' + HrrRbSsh::Message::SSH_MSG_GLOBAL_REQUEST::ID)
92
92
  message = HrrRbSsh::Message::SSH_MSG_GLOBAL_REQUEST.decode payload
93
- if message['want reply']
93
+ if message[:'want reply']
94
94
  # returns always failure because global request is not supported so far
95
95
  send_request_failure
96
96
  end
@@ -99,50 +99,45 @@ module HrrRbSsh
99
99
  def channel_open payload
100
100
  @logger.info('received ' + HrrRbSsh::Message::SSH_MSG_CHANNEL_OPEN::ID)
101
101
  message = HrrRbSsh::Message::SSH_MSG_CHANNEL_OPEN.decode payload
102
- channel_type = message['channel type']
103
- local_channel = message['sender channel']
104
- remote_channel = message['sender channel']
105
- initial_window_size = message['initial window size']
106
- maximum_packet_size = message['maximum packet size']
107
- channel = Channel.new self, channel_type, local_channel, remote_channel, initial_window_size, maximum_packet_size
108
- @channels[local_channel] = channel
102
+ channel = Channel.new self, message
103
+ @channels[channel.local_channel] = channel
109
104
  channel.start
110
- send_channel_open_confirmation channel_type, local_channel, remote_channel, initial_window_size, maximum_packet_size
105
+ send_channel_open_confirmation channel
111
106
  end
112
107
 
113
108
  def channel_request payload
114
109
  @logger.info('received ' + HrrRbSsh::Message::SSH_MSG_CHANNEL_REQUEST::ID)
115
110
  message = HrrRbSsh::Message::SSH_MSG_CHANNEL_REQUEST.decode payload
116
- local_channel = message['recipient channel']
117
- @channels[local_channel].receive_payload_queue.enq message
111
+ local_channel = message[:'recipient channel']
112
+ @channels[local_channel].receive_message_queue.enq message
118
113
  end
119
114
 
120
115
  def channel_window_adjust payload
121
116
  @logger.info('received ' + HrrRbSsh::Message::SSH_MSG_CHANNEL_WINDOW_ADJUST::ID)
122
117
  message = HrrRbSsh::Message::SSH_MSG_CHANNEL_WINDOW_ADJUST.decode payload
123
- local_channel = message['recipient channel']
124
- @channels[local_channel].receive_payload_queue.enq message
118
+ local_channel = message[:'recipient channel']
119
+ @channels[local_channel].receive_message_queue.enq message
125
120
  end
126
121
 
127
122
  def channel_data payload
128
123
  @logger.info('received ' + HrrRbSsh::Message::SSH_MSG_CHANNEL_DATA::ID)
129
124
  message = HrrRbSsh::Message::SSH_MSG_CHANNEL_DATA.decode payload
130
- local_channel = message['recipient channel']
131
- @channels[local_channel].receive_payload_queue.enq message
125
+ local_channel = message[:'recipient channel']
126
+ @channels[local_channel].receive_message_queue.enq message
132
127
  end
133
128
 
134
129
  def channel_eof payload
135
130
  @logger.info('received ' + HrrRbSsh::Message::SSH_MSG_CHANNEL_EOF::ID)
136
131
  message = HrrRbSsh::Message::SSH_MSG_CHANNEL_EOF.decode payload
137
- local_channel = message['recipient channel']
132
+ local_channel = message[:'recipient channel']
138
133
  channel = @channels[local_channel]
139
- channel.receive_payload_queue.close
134
+ channel.receive_message_queue.close
140
135
  end
141
136
 
142
137
  def channel_close payload
143
138
  @logger.info('received ' + HrrRbSsh::Message::SSH_MSG_CHANNEL_CLOSE::ID)
144
139
  message = HrrRbSsh::Message::SSH_MSG_CHANNEL_CLOSE.decode payload
145
- local_channel = message['recipient channel']
140
+ local_channel = message[:'recipient channel']
146
141
  channel = @channels[local_channel]
147
142
  channel.close
148
143
  @logger.info("deleting channel")
@@ -152,7 +147,7 @@ module HrrRbSsh
152
147
 
153
148
  def send_request_success
154
149
  message = {
155
- 'message number' => HrrRbSsh::Message::SSH_MSG_REQUEST_SUCCESS::VALUE,
150
+ :'message number' => HrrRbSsh::Message::SSH_MSG_REQUEST_SUCCESS::VALUE,
156
151
  }
157
152
  payload = HrrRbSsh::Message::SSH_MSG_REQUEST_SUCCESS.encode message
158
153
  @authentication.send payload
@@ -160,20 +155,20 @@ module HrrRbSsh
160
155
 
161
156
  def send_request_failure
162
157
  message = {
163
- 'message number' => HrrRbSsh::Message::SSH_MSG_REQUEST_FAILURE::VALUE,
158
+ :'message number' => HrrRbSsh::Message::SSH_MSG_REQUEST_FAILURE::VALUE,
164
159
  }
165
160
  payload = HrrRbSsh::Message::SSH_MSG_REQUEST_FAILURE.encode message
166
161
  @authentication.send payload
167
162
  end
168
163
 
169
- def send_channel_open_confirmation channel_type, local_channel, remote_channel, initial_window_size, maximum_packet_size
164
+ def send_channel_open_confirmation channel
170
165
  message = {
171
- 'message number' => HrrRbSsh::Message::SSH_MSG_CHANNEL_OPEN_CONFIRMATION::VALUE,
172
- 'channel type' => channel_type,
173
- 'recipient channel' => remote_channel,
174
- 'sender channel' => local_channel,
175
- 'initial window size' => initial_window_size,
176
- 'maximum packet size' => maximum_packet_size,
166
+ :'message number' => HrrRbSsh::Message::SSH_MSG_CHANNEL_OPEN_CONFIRMATION::VALUE,
167
+ :'channel type' => channel.channel_type,
168
+ :'recipient channel' => channel.remote_channel,
169
+ :'sender channel' => channel.local_channel,
170
+ :'initial window size' => channel.local_window_size,
171
+ :'maximum packet size' => channel.local_maximum_packet_size,
177
172
  }
178
173
  payload = HrrRbSsh::Message::SSH_MSG_CHANNEL_OPEN_CONFIRMATION.encode message
179
174
  @authentication.send payload
@@ -34,10 +34,10 @@ module HrrRbSsh
34
34
 
35
35
  DEFINITION = [
36
36
  #[DataType, Field Name]
37
- [DataType::Byte, 'message number'],
38
- [DataType::Uint32, 'reason code'],
39
- [DataType::String, 'description'],
40
- [DataType::String, 'language tag'],
37
+ [DataType::Byte, :'message number'],
38
+ [DataType::Uint32, :'reason code'],
39
+ [DataType::String, :'description'],
40
+ [DataType::String, :'language tag'],
41
41
  ]
42
42
  end
43
43
  end
@@ -16,8 +16,8 @@ module HrrRbSsh
16
16
 
17
17
  DEFINITION = [
18
18
  #[DataType, Field Name]
19
- [DataType::Byte, 'message number'],
20
- [DataType::String, 'data'],
19
+ [DataType::Byte, :'message number'],
20
+ [DataType::String, :'data'],
21
21
  ]
22
22
  end
23
23
  end
@@ -16,8 +16,8 @@ module HrrRbSsh
16
16
 
17
17
  DEFINITION = [
18
18
  #[DataType, Field Name]
19
- [DataType::Byte, 'message number'],
20
- [DataType::Uint32, 'packet sequence number of rejected message'],
19
+ [DataType::Byte, :'message number'],
20
+ [DataType::Uint32, :'packet sequence number of rejected message'],
21
21
  ]
22
22
  end
23
23
  end
@@ -16,10 +16,10 @@ module HrrRbSsh
16
16
 
17
17
  DEFINITION = [
18
18
  #[DataType, Field Name]
19
- [DataType::Byte, 'message number'],
20
- [DataType::Boolean, 'always_display'],
21
- [DataType::String, 'message'],
22
- [DataType::String, 'language tag'],
19
+ [DataType::Byte, :'message number'],
20
+ [DataType::Boolean, :'always_display'],
21
+ [DataType::String, :'message'],
22
+ [DataType::String, :'language tag'],
23
23
  ]
24
24
  end
25
25
  end
@@ -16,8 +16,8 @@ module HrrRbSsh
16
16
 
17
17
  DEFINITION = [
18
18
  #[DataType, Field Name]
19
- [DataType::Byte, 'message number'],
20
- [DataType::String, 'service name'],
19
+ [DataType::Byte, :'message number'],
20
+ [DataType::String, :'service name'],
21
21
  ]
22
22
  end
23
23
  end
@@ -16,8 +16,8 @@ module HrrRbSsh
16
16
 
17
17
  DEFINITION = [
18
18
  #[DataType, Field Name]
19
- [DataType::Byte, 'message number'],
20
- [DataType::String, 'service name'],
19
+ [DataType::Byte, :'message number'],
20
+ [DataType::String, :'service name'],
21
21
  ]
22
22
  end
23
23
  end
@@ -16,35 +16,35 @@ module HrrRbSsh
16
16
 
17
17
  DEFINITION = [
18
18
  #[DataType, Field Name]
19
- [DataType::Byte, 'message number'],
20
- [DataType::Byte, 'cookie (random byte)'],
21
- [DataType::Byte, 'cookie (random byte)'],
22
- [DataType::Byte, 'cookie (random byte)'],
23
- [DataType::Byte, 'cookie (random byte)'],
24
- [DataType::Byte, 'cookie (random byte)'],
25
- [DataType::Byte, 'cookie (random byte)'],
26
- [DataType::Byte, 'cookie (random byte)'],
27
- [DataType::Byte, 'cookie (random byte)'],
28
- [DataType::Byte, 'cookie (random byte)'],
29
- [DataType::Byte, 'cookie (random byte)'],
30
- [DataType::Byte, 'cookie (random byte)'],
31
- [DataType::Byte, 'cookie (random byte)'],
32
- [DataType::Byte, 'cookie (random byte)'],
33
- [DataType::Byte, 'cookie (random byte)'],
34
- [DataType::Byte, 'cookie (random byte)'],
35
- [DataType::Byte, 'cookie (random byte)'],
36
- [DataType::NameList, 'kex_algorithms'],
37
- [DataType::NameList, 'server_host_key_algorithms'],
38
- [DataType::NameList, 'encryption_algorithms_client_to_server'],
39
- [DataType::NameList, 'encryption_algorithms_server_to_client'],
40
- [DataType::NameList, 'mac_algorithms_client_to_server'],
41
- [DataType::NameList, 'mac_algorithms_server_to_client'],
42
- [DataType::NameList, 'compression_algorithms_client_to_server'],
43
- [DataType::NameList, 'compression_algorithms_server_to_client'],
44
- [DataType::NameList, 'languages_client_to_server'],
45
- [DataType::NameList, 'languages_server_to_client'],
46
- [DataType::Boolean, 'first_kex_packet_follows'],
47
- [DataType::Uint32, '0 (reserved for future extension)'],
19
+ [DataType::Byte, :'message number'],
20
+ [DataType::Byte, :'cookie (random byte)'],
21
+ [DataType::Byte, :'cookie (random byte)'],
22
+ [DataType::Byte, :'cookie (random byte)'],
23
+ [DataType::Byte, :'cookie (random byte)'],
24
+ [DataType::Byte, :'cookie (random byte)'],
25
+ [DataType::Byte, :'cookie (random byte)'],
26
+ [DataType::Byte, :'cookie (random byte)'],
27
+ [DataType::Byte, :'cookie (random byte)'],
28
+ [DataType::Byte, :'cookie (random byte)'],
29
+ [DataType::Byte, :'cookie (random byte)'],
30
+ [DataType::Byte, :'cookie (random byte)'],
31
+ [DataType::Byte, :'cookie (random byte)'],
32
+ [DataType::Byte, :'cookie (random byte)'],
33
+ [DataType::Byte, :'cookie (random byte)'],
34
+ [DataType::Byte, :'cookie (random byte)'],
35
+ [DataType::Byte, :'cookie (random byte)'],
36
+ [DataType::NameList, :'kex_algorithms'],
37
+ [DataType::NameList, :'server_host_key_algorithms'],
38
+ [DataType::NameList, :'encryption_algorithms_client_to_server'],
39
+ [DataType::NameList, :'encryption_algorithms_server_to_client'],
40
+ [DataType::NameList, :'mac_algorithms_client_to_server'],
41
+ [DataType::NameList, :'mac_algorithms_server_to_client'],
42
+ [DataType::NameList, :'compression_algorithms_client_to_server'],
43
+ [DataType::NameList, :'compression_algorithms_server_to_client'],
44
+ [DataType::NameList, :'languages_client_to_server'],
45
+ [DataType::NameList, :'languages_server_to_client'],
46
+ [DataType::Boolean, :'first_kex_packet_follows'],
47
+ [DataType::Uint32, :'0 (reserved for future extension)'],
48
48
  ]
49
49
  end
50
50
  end
@@ -16,7 +16,7 @@ module HrrRbSsh
16
16
 
17
17
  DEFINITION = [
18
18
  #[DataType, Field Name]
19
- [DataType::Byte, 'message number'],
19
+ [DataType::Byte, :'message number'],
20
20
  ]
21
21
  end
22
22
  end