libssh 0.3.0 → 0.3.1

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: 639bee53286516a176e3e46c5646a93593405f3e
4
- data.tar.gz: e934c062774b730c8a35a4b69ea075f9389af9d1
3
+ metadata.gz: 4aaa6647d6cc89439be59eeacbf35a3a21d72bf5
4
+ data.tar.gz: fe1ea02bf8d3405739187fddcfa2064486d5db98
5
5
  SHA512:
6
- metadata.gz: 6e1596553a20bb479ebb3878fc1a2dbb968bbf9eb3fb3a4c6308ec85ce2e34ddd52770584b85764a8fde72260fb4ddec5da926923ae4a5da1e137d91fe1147b2
7
- data.tar.gz: 4ba23660ed50cb0193df4bdac73134138fcb2dfe6bef6c84c00c4b883d81db8bc2ccd2f6b8ac3bb37e9281efb33b22a0bfde564b33b8ef7ce792063d0eb9cf31
6
+ metadata.gz: ded180b1cfe0766e45e2ddefd438db49c9ca8c2a4edf2dde1fe59453274010df4d7c3a9f038224d35345285d22a6c3b7a7836b1ffb6601119ce2aa3cb464c94a
7
+ data.tar.gz: 7b6fda7559baeeabe109e7ac30222335d52d930f752ae4542d51a81351d5e08e444fb48ad41826616d0b298dea8c67415e9d99f2c11b2a48d19c5e09d7a2e690
@@ -1,3 +1,7 @@
1
+ ## 0.3.1 (2016-04-08)
2
+ - Fix SSHKit::Backend::Libssh for SSHKit v1.9.0
3
+ - libssh now requires SSHKit v1.9.0 or later.
4
+
1
5
  ## 0.3.0 (2016-02-06)
2
6
  - Add wrapper methods
3
7
  - `Session#fd`
data/README.md CHANGED
@@ -38,6 +38,7 @@ See [example](example) directory.
38
38
  See [example/sshkit.rb](example/sshkit.rb) .
39
39
 
40
40
  ### With Capistrano
41
+ sshkit must be v1.9.0 or later due to [SSHKit::Backend::ConnectionPool API change](https://github.com/capistrano/sshkit/releases/tag/v1.9.0.rc1).
41
42
 
42
43
  ```ruby
43
44
  require 'sshkit/backends/libssh'
@@ -1,6 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'libssh'
3
- require 'io/wait'
4
3
 
5
4
  GC.stress = true
6
5
  puts "libssh #{LibSSH::LIBSSH_VERSION}"
@@ -39,28 +38,17 @@ end
39
38
  bufsiz = 16384
40
39
 
41
40
  channel = LibSSH::Channel.new(session)
42
- io = IO.for_fd(session.fd, autoclose: false)
43
41
  channel.open_session do
44
42
  channel.request_exec('ps auxf')
45
43
  until channel.eof?
46
- io.wait_readable
47
-
48
- loop do
49
- out = channel.read_nonblocking(bufsiz)
50
- if out && !out.empty?
51
- $stdout.write(out)
52
- else
53
- break
54
- end
44
+ LibSSH::Channel.select([channel], [], [], nil)
45
+ out = channel.read_nonblocking(bufsiz)
46
+ if out && !out.empty?
47
+ $stdout.write(out)
55
48
  end
56
-
57
- loop do
58
- err = channel.read_nonblocking(bufsiz, true)
59
- if err && !err.empty?
60
- $stderr.write(err)
61
- else
62
- break
63
- end
49
+ err = channel.read_nonblocking(bufsiz, stderr: true)
50
+ if err && !err.empty?
51
+ $stderr.write(err)
64
52
  end
65
53
  end
66
54
  end
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env ruby
2
+ require 'libssh'
3
+ require 'socket'
4
+ require 'thread'
5
+
6
+ GC.stress = true
7
+
8
+ ssh_host = 'rossmann'
9
+ remote_host = 'localhost'
10
+ remote_port = 5432
11
+ local_port = 3000
12
+
13
+ session = LibSSH::Session.new
14
+ session.host = ssh_host
15
+ session.parse_config
16
+ session.add_identity('%d/id_ed25519')
17
+
18
+ session.connect
19
+ if session.server_known != LibSSH::SERVER_KNOWN_OK
20
+ raise 'server unknown'
21
+ end
22
+ if session.userauth_publickey_auto != LibSSH::AUTH_SUCCESS
23
+ raise 'authorization failed'
24
+ end
25
+
26
+ mutex = Mutex.new
27
+ cv = ConditionVariable.new
28
+ server_thread = Thread.start do
29
+ bufsiz = 16384
30
+ TCPServer.open(local_port) do |server|
31
+ mutex.synchronize { cv.signal }
32
+ socket = server.accept
33
+ channel = LibSSH::Channel.new(session)
34
+ channel.open_forward(remote_host, remote_port) do
35
+ reader = Thread.start do
36
+ begin
37
+ loop do
38
+ channel.write(socket.readpartial(bufsiz))
39
+ end
40
+ # rubocop:disable Lint/HandleExceptions
41
+ rescue EOFError
42
+ end
43
+ channel.send_eof
44
+ end
45
+
46
+ writer = Thread.start do
47
+ loop do
48
+ size = channel.poll
49
+ if size.nil?
50
+ break
51
+ end
52
+ data = channel.read(size)
53
+ socket.write(data)
54
+ end
55
+ end
56
+
57
+ reader.join
58
+ writer.join
59
+ end
60
+ end
61
+ end
62
+
63
+ mutex.synchronize { cv.wait(mutex) }
64
+ system('psql', '-h', 'localhost', '-p', local_port.to_s, '-U', 'postgres', '-d', 'postgres', '-c', 'SELECT NOW()')
65
+ server_thread.join
@@ -15,6 +15,8 @@ end
15
15
  SSHKit.config.output = SSHKit::Formatter::Pretty.new($stdout)
16
16
  SSHKit.config.output_verbosity = :debug
17
17
 
18
+ include SSHKit::DSL
19
+
18
20
  on %w[barkhorn rossmann], in: :parallel do |host|
19
21
  date = capture(:date)
20
22
  puts "#{host}: #{date}"
@@ -105,34 +105,14 @@ static VALUE m_close(VALUE self) {
105
105
  return Qnil;
106
106
  }
107
107
 
108
- static void select_session(ssh_session session) {
109
- fd_set fds;
110
- int fd;
111
-
112
- FD_ZERO(&fds);
113
- fd = ssh_get_fd(session);
114
- FD_SET(fd, &fds);
115
- select(fd + 1, &fds, NULL, NULL, NULL);
116
- }
117
-
118
108
  static void *nogvl_open_session(void *ptr) {
119
109
  struct nogvl_channel_args *args = ptr;
120
- ssh_session session = ssh_channel_get_session(args->channel);
121
- int blocking = ssh_is_blocking(session);
122
-
123
- ssh_set_blocking(session, 0);
124
- while (1) {
125
- args->rc = ssh_channel_open_session(args->channel);
126
- if (args->rc != SSH_AGAIN) {
127
- break;
128
- }
129
- rb_thread_check_ints();
130
- select_session(session);
131
- }
132
- ssh_set_blocking(session, blocking);
110
+ args->rc = ssh_channel_open_session(args->channel);
133
111
  return NULL;
134
112
  }
135
113
 
114
+ /* FIXME: When Channel#open_session is called before authorization,
115
+ * #open_session will block infinitely and unable to stop it by C-c. */
136
116
  /*
137
117
  * @overload open_session
138
118
  * Open a session channel, and close it after the block.
@@ -162,6 +142,51 @@ static VALUE m_open_session(VALUE self) {
162
142
  }
163
143
  }
164
144
 
145
+ struct nogvl_open_forward_args {
146
+ ssh_channel channel;
147
+ const char *remote_host;
148
+ int remote_port;
149
+ int rc;
150
+ };
151
+
152
+ static void *nogvl_open_forward(void *ptr) {
153
+ struct nogvl_open_forward_args *args = ptr;
154
+ args->rc = ssh_channel_open_forward(args->channel, args->remote_host,
155
+ args->remote_port, "localhost", 22);
156
+ return NULL;
157
+ }
158
+
159
+ /* FIXME: When Channel#open_forward is called before authorization,
160
+ * #open_session will block infinitely and unable to stop it by C-c. */
161
+ /*
162
+ * @overload open_forward(remote_host, remote_port)
163
+ * Open a TCP/IP forwarding channel.
164
+ * @param [String] remote_host The remote host to connected.
165
+ * @param [Fixnum] remote_port The remote port.
166
+ * @return [nil]
167
+ * @since 0.4.0
168
+ * @see http://api.libssh.org/stable/group__libssh__channel.html
169
+ * ssh_channel_open_forward
170
+ */
171
+ static VALUE m_open_forward(VALUE self, VALUE remote_host, VALUE remote_port) {
172
+ ChannelHolder *holder;
173
+ struct nogvl_open_forward_args args;
174
+
175
+ TypedData_Get_Struct(self, ChannelHolder, &channel_type, holder);
176
+ args.remote_host = StringValueCStr(remote_host);
177
+ Check_Type(remote_port, T_FIXNUM);
178
+ args.remote_port = FIX2INT(remote_port);
179
+ args.channel = holder->channel;
180
+ rb_thread_call_without_gvl(nogvl_open_forward, &args, RUBY_UBF_IO, NULL);
181
+ RAISE_IF_ERROR(args.rc);
182
+
183
+ if (rb_block_given_p()) {
184
+ return rb_ensure(rb_yield, Qnil, m_close, self);
185
+ } else {
186
+ return Qnil;
187
+ }
188
+ }
189
+
165
190
  struct nogvl_request_exec_args {
166
191
  ssh_channel channel;
167
192
  char *cmd;
@@ -236,10 +261,10 @@ static void *nogvl_read(void *ptr) {
236
261
  }
237
262
 
238
263
  /*
239
- * @overload read(count, is_stderr: false, timeout: -1)
264
+ * @overload read(count, stderr: false, timeout: -1)
240
265
  * Read data from a channel.
241
266
  * @param [Fixnum] count The count of bytes to be read.
242
- * @param [Boolean] is_stderr Read from the stderr flow or not.
267
+ * @param [Boolean] stderr Read from the stderr flow or not.
243
268
  * @param [Fixnum] timeout A timeout in seconds. +-1+ means infinite timeout.
244
269
  * @return [String] Data read from the channel.
245
270
  * @see http://api.libssh.org/stable/group__libssh__channel.html
@@ -333,7 +358,7 @@ static VALUE m_read_nonblocking(int argc, VALUE *argv, VALUE self) {
333
358
 
334
359
  /*
335
360
  * @overload eof?
336
- * Check if remote ha sent an EOF.
361
+ * Check if remote has sent an EOF.
337
362
  * @return [Boolean]
338
363
  * @see http://api.libssh.org/stable/group__libssh__channel.html
339
364
  * ssh_channel_is_eof
@@ -345,6 +370,36 @@ static VALUE m_eof_p(VALUE self) {
345
370
  return ssh_channel_is_eof(holder->channel) ? Qtrue : Qfalse;
346
371
  }
347
372
 
373
+ /*
374
+ * @overload closed?
375
+ * Check if the channel is closed or not.
376
+ * @return [Boolean]
377
+ * @since 0.4.0
378
+ * @see http://api.libssh.org/stable/group__libssh__channel.html
379
+ * ssh_channel_is_closed
380
+ */
381
+ static VALUE m_closed_p(VALUE self) {
382
+ ChannelHolder *holder;
383
+
384
+ TypedData_Get_Struct(self, ChannelHolder, &channel_type, holder);
385
+ return ssh_channel_is_closed(holder->channel) ? Qtrue : Qfalse;
386
+ }
387
+
388
+ /*
389
+ * @overload open?
390
+ * Check if the channel is open or not.
391
+ * @return [Boolean]
392
+ * @since 0.4.0
393
+ * @see http://api.libssh.org/stable/group__libssh__channel.html
394
+ * ssh_channel_is_open
395
+ */
396
+ static VALUE m_open_p(VALUE self) {
397
+ ChannelHolder *holder;
398
+
399
+ TypedData_Get_Struct(self, ChannelHolder, &channel_type, holder);
400
+ return ssh_channel_is_open(holder->channel) ? Qtrue : Qfalse;
401
+ }
402
+
348
403
  struct nogvl_poll_args {
349
404
  ssh_channel channel;
350
405
  int timeout;
@@ -360,9 +415,9 @@ static void *nogvl_poll(void *ptr) {
360
415
  }
361
416
 
362
417
  /*
363
- * @overload poll(is_stderr: false, timeout: -1)
418
+ * @overload poll(stderr: false, timeout: -1)
364
419
  * Poll a channel for data to read.
365
- * @param [Boolean] is_stderr A boolean to select the stderr stream.
420
+ * @param [Boolean] stderr A boolean to select the stderr stream.
366
421
  * @param [Fixnum] timeout A timeout in milliseconds. A negative value means an
367
422
  * infinite timeout.
368
423
  * @return [Fixnum, nil] The number of bytes available for reading. +nil+ if
@@ -405,22 +460,12 @@ static VALUE m_poll(int argc, VALUE *argv, VALUE self) {
405
460
 
406
461
  static void *nogvl_get_exit_status(void *ptr) {
407
462
  struct nogvl_channel_args *args = ptr;
408
- ssh_session session = ssh_channel_get_session(args->channel);
409
- int blocking = ssh_is_blocking(session);
410
-
411
- ssh_set_blocking(session, 0);
412
- while (1) {
413
- args->rc = ssh_channel_get_exit_status(args->channel);
414
- if (args->rc != SSH_ERROR) {
415
- break;
416
- }
417
- rb_thread_check_ints();
418
- select_session(session);
419
- }
420
- ssh_set_blocking(session, blocking);
463
+ args->rc = ssh_channel_get_exit_status(args->channel);
421
464
  return NULL;
422
465
  }
423
466
 
467
+ /* FIXME: When Channel#get_exit_status is called before #request_exec,
468
+ * #get_exit_status will block infinitely and unable to stop it by C-c. */
424
469
  /*
425
470
  * @overload get_exit_status
426
471
  * Get the exit status of the channel.
@@ -502,6 +547,76 @@ static VALUE m_send_eof(VALUE self) {
502
547
  return Qnil;
503
548
  }
504
549
 
550
+ struct nogvl_select_args {
551
+ ssh_channel *read_channels, *write_channels, *except_channels;
552
+ struct timeval *timeout;
553
+ int rc;
554
+ };
555
+
556
+ static void *nogvl_select(void *ptr) {
557
+ struct nogvl_select_args *args = ptr;
558
+ args->rc = ssh_channel_select(args->read_channels, args->write_channels,
559
+ args->except_channels, args->timeout);
560
+ return NULL;
561
+ }
562
+
563
+ static void set_select_channels(ssh_channel **c_channels, VALUE rb_channels) {
564
+ long i, len;
565
+
566
+ Check_Type(rb_channels, T_ARRAY);
567
+ len = RARRAY_LEN(rb_channels);
568
+ if (len == 0) {
569
+ *c_channels = NULL;
570
+ } else {
571
+ for (i = 0; i < len; i++) {
572
+ Check_TypedStruct(RARRAY_AREF(rb_channels, i), &channel_type);
573
+ }
574
+ *c_channels = ALLOC_N(ssh_channel, len+1);
575
+ for (i = 0; i < len; i++) {
576
+ ChannelHolder *holder;
577
+ TypedData_Get_Struct(RARRAY_AREF(rb_channels, i), ChannelHolder,
578
+ &channel_type, holder);
579
+ (*c_channels)[i] = holder->channel;
580
+ }
581
+ (*c_channels)[len] = NULL;
582
+ }
583
+ }
584
+
585
+ /*
586
+ * @overload select(read_channels, write_channels, except_channels, timeout)
587
+ * Act like the standard select(2) on channels.
588
+ * @param [Array<Channel>] read_channels
589
+ * @param [Array<Channel>] write_channels
590
+ * @param [Array<Channel>] except_channels
591
+ * @param [Fixnum, nil] timeout timeout in seconds.
592
+ * @return [nil]
593
+ * @see http://api.libssh.org/stable/group__libssh__channel.html
594
+ * ssh_channel_select
595
+ */
596
+ static VALUE s_select(RB_UNUSED_VAR(VALUE self), VALUE read_channels,
597
+ VALUE write_channels, VALUE except_channels,
598
+ VALUE timeout) {
599
+ struct nogvl_select_args args;
600
+ struct timeval tv;
601
+
602
+ if (NIL_P(timeout)) {
603
+ args.timeout = NULL;
604
+ } else {
605
+ Check_Type(timeout, T_FIXNUM);
606
+ tv.tv_sec = FIX2INT(timeout);
607
+ tv.tv_usec = 0;
608
+ args.timeout = &tv;
609
+ }
610
+ set_select_channels(&args.read_channels, read_channels);
611
+ set_select_channels(&args.write_channels, write_channels);
612
+ set_select_channels(&args.except_channels, except_channels);
613
+ rb_thread_call_without_gvl(nogvl_select, &args, RUBY_UBF_IO, NULL);
614
+ ruby_xfree(args.read_channels);
615
+ ruby_xfree(args.write_channels);
616
+ ruby_xfree(args.except_channels);
617
+ return Qnil;
618
+ }
619
+
505
620
  /*
506
621
  * Document-class: LibSSH::Channel
507
622
  * Wrapper for ssh_channel struct in libssh.
@@ -518,6 +633,8 @@ void Init_libssh_channel(void) {
518
633
  RUBY_METHOD_FUNC(m_initialize), 1);
519
634
  rb_define_method(rb_cLibSSHChannel, "open_session",
520
635
  RUBY_METHOD_FUNC(m_open_session), 0);
636
+ rb_define_method(rb_cLibSSHChannel, "open_forward",
637
+ RUBY_METHOD_FUNC(m_open_forward), 2);
521
638
  rb_define_method(rb_cLibSSHChannel, "close", RUBY_METHOD_FUNC(m_close), 0);
522
639
  rb_define_method(rb_cLibSSHChannel, "request_exec",
523
640
  RUBY_METHOD_FUNC(m_request_exec), 1);
@@ -528,12 +645,17 @@ void Init_libssh_channel(void) {
528
645
  RUBY_METHOD_FUNC(m_read_nonblocking), -1);
529
646
  rb_define_method(rb_cLibSSHChannel, "poll", RUBY_METHOD_FUNC(m_poll), -1);
530
647
  rb_define_method(rb_cLibSSHChannel, "eof?", RUBY_METHOD_FUNC(m_eof_p), 0);
648
+ rb_define_method(rb_cLibSSHChannel, "closed?", RUBY_METHOD_FUNC(m_closed_p), 0);
649
+ rb_define_method(rb_cLibSSHChannel, "open?", RUBY_METHOD_FUNC(m_open_p), 0);
531
650
  rb_define_method(rb_cLibSSHChannel, "get_exit_status",
532
651
  RUBY_METHOD_FUNC(m_get_exit_status), 0);
533
652
  rb_define_method(rb_cLibSSHChannel, "write", RUBY_METHOD_FUNC(m_write), 1);
534
653
  rb_define_method(rb_cLibSSHChannel, "send_eof", RUBY_METHOD_FUNC(m_send_eof),
535
654
  0);
536
655
 
656
+ rb_define_singleton_method(rb_cLibSSHChannel, "select",
657
+ RUBY_METHOD_FUNC(s_select), 4);
658
+
537
659
  id_stderr = rb_intern("stderr");
538
660
  id_timeout = rb_intern("timeout");
539
661
  }
@@ -1,9 +1,21 @@
1
1
  require 'mkmf'
2
2
 
3
- $CFLAGS << ' -Wall -W'
3
+ if ENV['LIBSSH_CFLAGS']
4
+ $CFLAGS = ENV['LIBSSH_CFLAGS']
5
+ else
6
+ $CFLAGS << ' -Wall -W'
7
+ end
8
+
9
+ unless have_header('libssh/libssh.h')
10
+ abort 'Cannot find libssh/libssh.h'
11
+ end
12
+ unless have_library('ssh')
13
+ abort 'Cannot find libssh'
14
+ end
15
+ unless have_library('ssh_threads')
16
+ abort 'Cannot find libssh_threads'
17
+ end
4
18
 
5
- have_header('libssh/libssh.h')
6
- have_library('ssh')
7
19
  have_const('SSH_KEYTYPE_ED25519', 'libssh/libssh.h')
8
20
 
9
21
  create_makefile('libssh/libssh_ruby')
@@ -1,4 +1,5 @@
1
1
  #include "libssh_ruby.h"
2
+ #include <libssh/callbacks.h>
2
3
 
3
4
  VALUE rb_mLibSSH;
4
5
 
@@ -26,6 +27,9 @@ static VALUE m_version(int argc, VALUE *argv, RB_UNUSED_VAR(VALUE self)) {
26
27
  }
27
28
 
28
29
  void Init_libssh_ruby(void) {
30
+ ssh_threads_set_callbacks(ssh_threads_get_pthread());
31
+ ssh_init();
32
+
29
33
  rb_mLibSSH = rb_define_module("LibSSH");
30
34
 
31
35
  /* @see Session#server_known */
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
  module LibSSH
3
3
  # The version of libssh gem.
4
- VERSION = '0.3.0'.freeze
4
+ VERSION = '0.3.1'.freeze
5
5
  end
@@ -1,5 +1,4 @@
1
1
  require 'libssh'
2
- require 'io/wait'
3
2
  require 'sshkit/backends/abstract'
4
3
  require 'sshkit/backends/connection_pool'
5
4
 
@@ -53,8 +52,12 @@ module SSHKit
53
52
  scp.init do
54
53
  scp.push_file(File.basename(remote), io.size, mode)
55
54
  info "Uploading #{remote}"
56
- while (buf = io.read(BUFSIZ))
57
- scp.write(buf)
55
+ begin
56
+ loop do
57
+ scp.write(io.readpartial(BUFSIZ))
58
+ end
59
+ # rubocop:disable Lint/HandleExceptions
60
+ rescue EOFError
58
61
  end
59
62
  end
60
63
  end
@@ -110,33 +113,24 @@ module SSHKit
110
113
 
111
114
  with_session do |session|
112
115
  channel = LibSSH::Channel.new(session)
113
- io = IO.for_fd(session.fd, autoclose: false)
114
116
  channel.open_session do
115
117
  if Libssh.config.pty
116
118
  channel.request_pty
117
119
  end
118
120
  channel.request_exec(cmd.to_command)
119
121
  until channel.eof?
120
- io.wait_readable
121
-
122
- loop do
123
- buf = channel.read_nonblocking(BUFSIZ)
124
- if buf && !buf.empty?
125
- cmd.on_stdout(channel, buf)
126
- output.log_command_data(cmd, :stdout, buf)
127
- else
128
- break
129
- end
122
+ LibSSH::Channel.select([channel], [], [], nil)
123
+
124
+ buf = channel.read_nonblocking(BUFSIZ)
125
+ if buf && !buf.empty?
126
+ cmd.on_stdout(channel, buf)
127
+ output.log_command_data(cmd, :stdout, buf)
130
128
  end
131
129
 
132
- loop do
133
- buf = channel.read_nonblocking(BUFSIZ, true)
134
- if buf && !buf.empty?
135
- cmd.on_stderr(channel, buf)
136
- output.log_command_data(cmd, :stderr, buf)
137
- else
138
- break
139
- end
130
+ buf = channel.read_nonblocking(BUFSIZ, stderr: true)
131
+ if buf && !buf.empty?
132
+ cmd.on_stderr(channel, buf)
133
+ output.log_command_data(cmd, :stderr, buf)
140
134
  end
141
135
  end
142
136
 
@@ -182,30 +176,26 @@ module SSHKit
182
176
  end
183
177
  end
184
178
 
185
- def with_session
179
+ def with_session(&block)
186
180
  host.ssh_options = Libssh.config.ssh_options.merge(host.ssh_options || {})
187
- entry = self.class.pool.checkout(String(host.hostname), host.username, host.netssh_options) do |hostname, username, ssh_options|
188
- LibSSH::Session.new.tap do |session|
189
- session.host = hostname
190
- username = ssh_options.fetch(:user, username)
191
- if username
192
- session.user = username
193
- end
194
- configure_session(session, ssh_options)
195
- session.connect
196
- if session.server_known != LibSSH::SERVER_KNOWN_OK
197
- raise 'unknown host'
198
- end
199
- if session.userauth_publickey_auto != LibSSH::AUTH_SUCCESS
200
- raise 'authorization failed'
201
- end
202
- end
203
- end
181
+ self.class.pool.with(method(:create_session), String(host.hostname), host.username, host.netssh_options, &block)
182
+ end
204
183
 
205
- begin
206
- yield entry.connection
207
- ensure
208
- self.class.pool.checkin(entry)
184
+ def create_session(hostname, username, ssh_options)
185
+ LibSSH::Session.new.tap do |session|
186
+ session.host = hostname
187
+ username = ssh_options.fetch(:user, username)
188
+ if username
189
+ session.user = username
190
+ end
191
+ configure_session(session, ssh_options)
192
+ session.connect
193
+ if session.server_known != LibSSH::SERVER_KNOWN_OK
194
+ raise 'unknown host'
195
+ end
196
+ if session.userauth_publickey_auto != LibSSH::AUTH_SUCCESS
197
+ raise 'authorization failed'
198
+ end
209
199
  end
210
200
  end
211
201
 
@@ -26,6 +26,6 @@ Gem::Specification.new do |spec|
26
26
  spec.add_development_dependency 'rake-compiler'
27
27
  spec.add_development_dependency 'rspec', '>= 3.0.0'
28
28
  spec.add_development_dependency 'rubocop', '>= 0.36.0'
29
- spec.add_development_dependency 'sshkit'
29
+ spec.add_development_dependency 'sshkit', '>= 1.9.0'
30
30
  spec.add_development_dependency 'yard'
31
31
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: libssh
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kohei Suzuki
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-02-06 00:00:00.000000000 Z
11
+ date: 2016-04-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: '0'
89
+ version: 1.9.0
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
- version: '0'
96
+ version: 1.9.0
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: yard
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -130,6 +130,7 @@ files:
130
130
  - bin/console
131
131
  - bin/setup
132
132
  - example/exec.rb
133
+ - example/local_forward.rb
133
134
  - example/scp_download.rb
134
135
  - example/scp_upload.rb
135
136
  - example/sshkit.rb
@@ -167,7 +168,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
167
168
  version: '0'
168
169
  requirements: []
169
170
  rubyforge_project:
170
- rubygems_version: 2.5.1
171
+ rubygems_version: 2.6.1
171
172
  signing_key:
172
173
  specification_version: 4
173
174
  summary: Ruby binding for libssh.