Sha256: 925c491117a1b79adac623ea008605a5ec53a36e22eb53e6e77b097c0430e3cb

Contents?: true

Size: 1.71 KB

Versions: 1

Compression:

Stored size: 1.71 KB

Contents

require 'dnssd'

module Qcmd
  # Browse the LAN and find open and running QLab instances.
  class Network
    BROWSE_TIMEOUT = 2

    class << self
      attr_accessor :machines, :browse_thread

      # browse can be used alone to populate the machines list
      def browse
        self.machines = []

        self.browse_thread = Thread.start do
          DNSSD.browse! '_qlab._tcp.' do |b|
            DNSSD.resolve b.name, b.type, b.domain do |r|
              self.machines << Qcmd::Machine.new(b.name, r.target, r.port)
            end
          end
        end

        sleep BROWSE_TIMEOUT

        Thread.kill(browse_thread) if browse_thread.alive?
      end

      def display options={}
        longest = machines.map {|m| m.name.size}.max

        Qcmd.print
        Qcmd.print "Found #{ machines.size } QLab machine#{ machines.size == 1 ? '' : 's'}"
        Qcmd.print

        machines.each_with_index do |machine, n|
          if Qcmd.debug?
            Qcmd.print "#{ n + 1 }. %-#{ longest + 2 }s %s" % [machine.name, machine.client_string]
          else
            Qcmd.print "#{ n + 1 }. %-#{ longest + 2 }s" % [machine.name]
          end
        end

        Qcmd.print
        Qcmd.print 'Type `connect MACHINE` to connect to a machine'
        Qcmd.print
      end

      def browse_and_display options={}
        browse
        if !options[:machine_given] || (options[:machine_given] && !find(options[:machine_name]).nil?)
          display options
        end
      end

      def find machine_name
        machines.find {|m| m.name.to_s == machine_name.to_s}
      end

      def find_by_index idx
        machines[idx] if idx < machines.size
      end

      def names
        machines.map(&:name)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
qcmd-0.1.8 lib/qcmd/network.rb