-
-
Save niedfelj/a6c0e6e3aa8e899c0077a21bac736793 to your computer and use it in GitHub Desktop.
a simple server/client using dnssd (bonjour) and git-style-binaries
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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