Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save niedfelj/a6c0e6e3aa8e899c0077a21bac736793 to your computer and use it in GitHub Desktop.
Save niedfelj/a6c0e6e3aa8e899c0077a21bac736793 to your computer and use it in GitHub Desktop.
a simple server/client using dnssd (bonjour) and git-style-binaries
#!/usr/bin/env ruby -rubygems
require 'git-style-binary/command'
require 'dnssd'
require 'set'
TestService = Struct.new(:name, :host, :port, :description) unless defined?(TestService)
TcpType = "_dnssdtest._tcp" unless defined?(TcpType)
GitStyleBinary.primary do
version "dnssd-test"
banner <<-eos
Usage: #{File.basename($0)} (server|client)
eos
short_desc "test using dnssd (bonjour)"
opt :name, "the name of the resource you are announcing", :type => String, :default => "dnssd-test"
opt :description, "the description of the resource you are announcing", :type => String, :default => "a little bonjour test"
run do |command|
case command.argv.first
when "server"
def announce(name, port)
tr = DNSSD::TextRecord.new
tr['description'] = command[:description]
DNSSD.register(name, TcpType, 'local', port, tr.encode) do |rr|
puts "Registered #{name} on port #{port}. Starting service."
end
end
announce command[:name], 9419
sleep(90)
puts "I'm tired, goodbye"
when "client"
def discover(timeout=5)
waiting_thread = Thread.current
dns = DNSSD.browse TcpType do |reply|
DNSSD.resolve reply.name, reply.type, reply.domain do |resolve_reply|
service = TestService.new(reply.name,
resolve_reply.target,
resolve_reply.port,
resolve_reply.text_record['description'].to_s)
begin
yield service
rescue Done
waiting_thread.run
end
end
end
puts "Gathering for up to #{timeout} seconds..."
sleep timeout
dns.stop
end
def service_list
list = Set.new
discover { |obj| list << obj }
return list
end
def list
service_list.each do |service|
puts "=== #{service.name} on #{service.host}:#{service.port} ==="
puts " found #{service.name}"
if service.description != '' && service.description !~ /^Unnamed repository/
puts " #{service.description}"
end
puts
end
end
list
else
raise "please specify 'server' or 'client'"
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment