Sha256: ee6559eb9403db48455bc1d431eb02d9b87830c021c40ea2a6d9d73eaea3f1fe

Contents?: true

Size: 1.7 KB

Versions: 5

Compression:

Stored size: 1.7 KB

Contents

require 'net/ssh'

module Ridley
  # @author Jamie Winsor <jamie@vialstudios.com>
  class SSH
    autoload :Response, 'ridley/ssh/response'
    autoload :ResponseSet, 'ridley/ssh/response_set'
    autoload :Worker, 'ridley/ssh/worker'

    class << self
      # @param [Ridley::Node, Array<Ridley::Node>] nodes
      # @param [Hash] options
      def start(nodes, options = {}, &block)
        runner = new(nodes, options)
        result = yield runner
        runner.terminate

        result
      end
    end

    include Celluloid
    include Celluloid::Logger

    attr_reader :nodes
    attr_reader :options

    # @param [Ridley::Node, Array<Ridley::Node>] nodes
    # @param [Hash] options
    #   @see Net::SSH
    def initialize(nodes, options = {})
      @nodes   = nodes
      @options = options

      self.options[:timeout] ||= 1.5
    end

    # @return [Array<SSH::Worker>]
    def workers
      @workers ||= Array(nodes).collect do |node|
        Worker.new_link(current_actor, node.public_hostname, options)
      end
    end

    # @param [String] command
    #
    # @return [Array]
    def run(command)
      workers.collect { |worker| worker.async.run(command) }

      ResponseSet.new.tap do |responses|
        until responses.length == workers.length
          receive { |msg|
            status, response = msg
            
            case status
            when :ok
              responses.add_ok(response)
            when :error
              responses.add_error(response)
            else
              error "SSH Failure: #{command}. terminating..."
              terminate
            end
          }
        end
      end
    end

    def finalize
      workers.collect(&:terminate)
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
ridley-0.5.2 lib/ridley/ssh.rb
ridley-0.5.1 lib/ridley/ssh.rb
ridley-0.5.0 lib/ridley/ssh.rb
ridley-0.4.1 lib/ridley/ssh.rb
ridley-0.4.0 lib/ridley/ssh.rb