Sha256: 707ee6a69303e054e9b4bcbfb346335471ec7fcd1a871442cbe5509720e4fff8

Contents?: true

Size: 1.05 KB

Versions: 3

Compression:

Stored size: 1.05 KB

Contents

require 'socket'

module Fulmar
  module Infrastructure
    module Service
      class TunnelService
        attr_reader :host, :remote_port, :local_port

        def initialize(host, port)
          @host = host
          @remote_port = port
          @local_port = 0
          @tunnel_pid = 0
        end

        def open
          @local_port = free_port
          @tunnel_pid = Process.spawn "ssh #{@host} -L #{@local_port}:localhost:#{@remote_port} -N"
          sleep 1
        end

        def close
          Process.kill 'TERM', @tunnel_pid if @tunnel_pid > 0
          @local_port = 0
          @tunnel_pid = 0
        end

        def open?
          @tunnel_pid > 0
        end

        def free_port
          port = 60000
          begin
            1000.times do
              socket = TCPSocket.new('localhost', port)
              socket.close
              port += 1
            end
          rescue Errno::ECONNREFUSED
            return port
          end
          fail 'Cannot find an open local port'
          0
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
fulmar-0.6.5 lib/fulmar/infrastructure/service/tunnel_service.rb
fulmar-0.6.4 lib/fulmar/infrastructure/service/tunnel_service.rb
fulmar-0.6.3 lib/fulmar/infrastructure/service/tunnel_service.rb