# HG changeset patch # User Mahlon E. Smith # Date 1594332321 25200 # Node ID 5db18679edcf9643d60fbadf6e89ec737ae81b87 # Parent 420037982f7831c3c35182ae80d57965775b2542 Multiple changes. - Migrate to gem.deps.rb from .gems - Bump dependency versions - Clear environment before connecting to remote server - Allow option for environment modifications - Place commands in args, rather than via the IO pipe. (won't spawn remote shell) diff -r 420037982f78 -r 5db18679edcf .gems --- a/.gems Tue Apr 07 16:42:31 2020 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -configurability -v3.2.0 -symphony -v0.11.1 -inversion -v1.1.1 -net-ssh -v5.0.2 -net-sftp -v2.1.2 -rspec -v3.7.0 -simplecov -v0.16.1 -pry -v0.11.3 diff -r 420037982f78 -r 5db18679edcf .hgignore --- a/.hgignore Tue Apr 07 16:42:31 2020 -0700 +++ b/.hgignore Thu Jul 09 15:05:21 2020 -0700 @@ -7,4 +7,5 @@ ^ChangeLog$ ^docs/ ^coverage/ +^gem.deps.rb.lock$ Session.vim diff -r 420037982f78 -r 5db18679edcf .ruby-version --- a/.ruby-version Tue Apr 07 16:42:31 2020 -0700 +++ b/.ruby-version Thu Jul 09 15:05:21 2020 -0700 @@ -1,1 +1,1 @@ -2.6 +2.7 diff -r 420037982f78 -r 5db18679edcf .rvm.gems --- a/.rvm.gems Tue Apr 07 16:42:31 2020 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -configurability -v2.1.2 -inversion -v0.12.3 -net-sftp -v2.1.2 -net-ssh -v2.9.0 -rake -v0.9.6 -rdoc -v4.0.0 -rdoc-generator-fivefish -v0.1.0 -rspec -v3.0.0.beta2 -rspec-core -v3.0.0.beta2 -rspec-expectations -v3.0.0.beta2 -rspec-mocks -v3.0.0.beta2 -rspec-support -v3.0.0.beta2 -simplecov -v0.7.1 -symphony -v0.6.0 diff -r 420037982f78 -r 5db18679edcf Rakefile --- a/Rakefile Tue Apr 07 16:42:31 2020 -0700 +++ b/Rakefile Thu Jul 09 15:05:21 2020 -0700 @@ -31,7 +31,7 @@ s.platform = Gem::Platform::RUBY s.summary = "Base classes for using Symphony with ssh." s.name = 'symphony-ssh' - s.version = '0.2.1' + s.version = '0.3.0' s.license = 'BSD-3-Clause' s.has_rdoc = true s.require_path = 'lib' @@ -49,12 +49,12 @@ s.add_dependency 'configurability', [ '>= 3.2', '<= 4.99' ] s.add_dependency 'symphony', '~> 0.13' - s.add_dependency 'inversion', '~> 1.2' - s.add_dependency 'net-ssh', '~> 5.0' - s.add_dependency 'net-sftp', '~> 2.1' + s.add_dependency 'inversion', '~> 1.3' + s.add_dependency 'net-ssh', '~> 6.0' + s.add_dependency 'net-sftp', '~> 3.0' - s.add_development_dependency 'rspec', '~> 3.7' - s.add_development_dependency 'simplecov', '~> 0.16' + s.add_development_dependency 'rspec', '~> 3.9' + s.add_development_dependency 'simplecov', '~> 0.18' end Gem::PackageTask.new( spec ) do |pkg| @@ -119,4 +119,3 @@ __END__ lib/symphony/tasks/ssh.rb lib/symphony/tasks/sshscript.rb -README.rdoc diff -r 420037982f78 -r 5db18679edcf gem.deps.rb --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gem.deps.rb Thu Jul 09 15:05:21 2020 -0700 @@ -0,0 +1,16 @@ +# vim: set nosta noet ts=4 sw=4: +source "https://rubygems.org/" + +gem 'configurability', '~> 4.0' +gem 'symphony', '~> 0.13' +gem 'inversion', '~> 1.3' +gem 'net-ssh', '~> 6.1' +gem 'net-sftp', '~> 3.0' + +group( :development ) do + gem 'rake', '~> 13.0' + gem 'rspec', '~> 3.9' + gem 'simplecov', '~> 0.18' + gem 'pry', '~> 0.13' +end + diff -r 420037982f78 -r 5db18679edcf lib/symphony/tasks/ssh.rb --- a/lib/symphony/tasks/ssh.rb Tue Apr 07 16:42:31 2020 -0700 +++ b/lib/symphony/tasks/ssh.rb Thu Jul 09 15:05:21 2020 -0700 @@ -19,6 +19,7 @@ ### command: (required) The command to run on the remote host ### port: (optional) The port to connect to (defaults to 22) ### opts: (optional) Explicit SSH client options +### env: (optional) A hash of environment vars to set for the connection. ### user: (optional) The user to connect as (defaults to root) ### key: (optional) The path to an SSH private key ### @@ -86,17 +87,16 @@ end - ### Perform the ssh connection, passing the command to the pipe - ### and retreiving any output from the remote end. + ### Perform the ssh connection in 'exec' mode, and retrieve any + ### output from the remote end. ### def work( payload, metadata ) - command = payload[ 'command' ] - raise ArgumentError, "Missing required option 'command'" unless command + raise ArgumentError, "Missing required option 'command'" unless payload[ 'command' ] raise ArgumentError, "Missing required option 'host'" unless payload[ 'host' ] exitcode = self.open_connection( payload, metadata ) do |reader, writer| - self.log.debug "Writing command #{command}..." - writer.puts( command ) + #self.log.debug "Writing command #{command}..." + #writer.puts( command ) self.log.debug " closing child's writer." writer.close self.log.debug " reading from child." @@ -123,6 +123,7 @@ opts = payload[ 'opts' ] || Symphony::Task::SSH.opts user = payload[ 'user' ] || Symphony::Task::SSH.user key = payload[ 'key' ] || Symphony::Task::SSH.key + env = payload[ 'env' ] || {} cmd = [] cmd << Symphony::Task::SSH.path @@ -132,23 +133,30 @@ cmd << '-i' << key if key cmd << '-l' << user cmd << payload[ 'host' ] + cmd << payload[ 'command' ] cmd.flatten! self.log.debug "Running SSH command with: %p" % [ Shellwords.shelljoin(cmd) ] parent_reader, child_writer = IO.pipe child_reader, parent_writer = IO.pipe - pid = Process.spawn( *cmd, :out => child_writer, :in => child_reader, :close_others => true ) + pid = Process.spawn( env, *cmd, + out: child_writer, + in: child_reader, + close_others: true, + unsetenv_others: true + ) + child_writer.close child_reader.close self.log.debug "Yielding back to the run block." @output = yield( parent_reader, parent_writer ) - @output = @output.split("\n").reject{|l| l =~ SSH_CLEANUP }.join + @output = @output.split( /\r?\n/ ).reject{|l| l =~ SSH_CLEANUP }.join self.log.debug " run block done." - status = nil - + rescue => err + self.log.error( err.message ) ensure if pid active = Process.kill( 0, pid ) rescue false diff -r 420037982f78 -r 5db18679edcf spec/symphony/tasks/ssh_spec.rb --- a/spec/symphony/tasks/ssh_spec.rb Tue Apr 07 16:42:31 2020 -0700 +++ b/spec/symphony/tasks/ssh_spec.rb Thu Jul 09 15:05:21 2020 -0700 @@ -38,12 +38,12 @@ allow( IO ).to receive( :pipe ).and_return([ pipe, pipe ]) args = [ - '-p', '22', '-i', '/tmp/sekrit.rsa', '-l', 'symphony', 'example.com' + '-p', '22', '-i', '/tmp/sekrit.rsa', '-l', 'symphony', 'example.com', 'woohoo' ] expect( Process ).to receive( :spawn ).with( - *[ ssh.to_s, described_class.opts, args ].flatten, - :out => pipe, :in => pipe, :close_others => true + *[ {}, ssh.to_s, described_class.opts, args ].flatten, + out: pipe, in: pipe, close_others: true, unsetenv_others: true ).and_return( 12 ) expect( Process ).to receive( :waitpid2 ).with( 12 ).and_return([ 12, 1 ])