toolmantim-zeroconf 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +44 -0
- data/Rakefile +71 -0
- data/lib/dnssd.rb +137 -0
- data/lib/net/dns.rb +49 -0
- data/lib/net/dns/mdns-sd.rb +240 -0
- data/lib/net/dns/mdns.rb +1189 -0
- data/lib/net/dns/resolv-mdns.rb +230 -0
- data/lib/net/dns/resolv-replace.rb +66 -0
- data/lib/net/dns/resolv.rb +2012 -0
- data/lib/net/dns/resolvx.rb +219 -0
- data/lib/zeroconf.rb +15 -0
- data/lib/zeroconf/common.rb +0 -0
- data/lib/zeroconf/ext.rb +7 -0
- data/lib/zeroconf/pure.rb +13 -0
- data/lib/zeroconf/version.rb +3 -0
- data/originals/dnssd-0.6.0/COPYING +56 -0
- data/originals/dnssd-0.6.0/README +50 -0
- data/originals/net-mdns-0.4/COPYING +58 -0
- data/originals/net-mdns-0.4/README +21 -0
- data/originals/net-mdns-0.4/TODO +278 -0
- data/samples/exhttp.rb +50 -0
- data/samples/exhttpv1.rb +29 -0
- data/samples/exwebrick.rb +56 -0
- data/samples/mdns-watch.rb +132 -0
- data/samples/mdns.rb +238 -0
- data/samples/test_dns.rb +128 -0
- data/samples/v1demo.rb +167 -0
- data/samples/v1mdns.rb +111 -0
- data/test/stress/stress_register.rb +48 -0
- data/test/test_browse.rb +24 -0
- data/test/test_highlevel_api.rb +35 -0
- data/test/test_register.rb +32 -0
- data/test/test_resolve.rb +23 -0
- data/test/test_resolve_ichat.rb +56 -0
- data/test/test_textrecord.rb +58 -0
- metadata +93 -0
data/samples/v1mdns.rb
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
#!/usr/local/bin/ruby18 -w
|
2
|
+
# Author: Sam Roberts <sroberts@uniserve.com>
|
3
|
+
# Licence: this file is placed in the public domain
|
4
|
+
|
5
|
+
$:.unshift(File.dirname($0))
|
6
|
+
|
7
|
+
require 'getoptlong'
|
8
|
+
require 'net/dns/resolv-mdns'
|
9
|
+
require 'pp'
|
10
|
+
|
11
|
+
rrmap = {
|
12
|
+
'a' => Resolv::DNS::Resource::IN::A,
|
13
|
+
'any' => Resolv::DNS::Resource::IN::ANY,
|
14
|
+
'ptr' => Resolv::DNS::Resource::IN::PTR,
|
15
|
+
'srv' => Resolv::DNS::Resource::IN::SRV,
|
16
|
+
nil => Resolv::DNS::Resource::IN::ANY
|
17
|
+
}
|
18
|
+
|
19
|
+
rtypes = rrmap.keys.join ', '
|
20
|
+
|
21
|
+
HELP =<<EOF
|
22
|
+
Usage: mdns [options] name [service-type]
|
23
|
+
|
24
|
+
Options
|
25
|
+
-h,--help Print this helpful message.
|
26
|
+
-t,--type Query for this specific resource record type.
|
27
|
+
-r,--recur Recursive query.
|
28
|
+
-a,--addr Do an address lookup on name using mDNS-aware Resolv#getaddress.
|
29
|
+
-d,--debug Print debug information.
|
30
|
+
|
31
|
+
Supported record types are:
|
32
|
+
#{rrmap.keys.compact.join "\n "}
|
33
|
+
|
34
|
+
Default is 'any'.
|
35
|
+
|
36
|
+
Examples:
|
37
|
+
EOF
|
38
|
+
|
39
|
+
opt_debug = nil
|
40
|
+
opt_recur = nil
|
41
|
+
opt_addr = nil
|
42
|
+
opt_type = Resolv::DNS::Resource::IN::ANY
|
43
|
+
|
44
|
+
opts = GetoptLong.new(
|
45
|
+
[ "--help", "-h", GetoptLong::NO_ARGUMENT ],
|
46
|
+
[ "--type", "-t", GetoptLong::REQUIRED_ARGUMENT],
|
47
|
+
[ "--recur", "-r", GetoptLong::NO_ARGUMENT ],
|
48
|
+
[ "--addr", "-a", GetoptLong::NO_ARGUMENT ],
|
49
|
+
[ "--debug", "-d", GetoptLong::NO_ARGUMENT ]
|
50
|
+
)
|
51
|
+
|
52
|
+
opts.each do |opt, arg|
|
53
|
+
case opt
|
54
|
+
when "--help" then puts HELP; exit 0
|
55
|
+
when "--debug" then opt_debug = true
|
56
|
+
when "--recur" then opt_recur = true
|
57
|
+
when "--addr" then opt_addr = true
|
58
|
+
when "--type" then opt_type = rrmap[arg]
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
r = Resolv::MDNS.new
|
63
|
+
|
64
|
+
r.lazy_initialize
|
65
|
+
|
66
|
+
Name = Resolv::DNS::Name
|
67
|
+
|
68
|
+
ARGV.each do |n|
|
69
|
+
argv0 = Name.create(n)
|
70
|
+
|
71
|
+
unless argv0.absolute?
|
72
|
+
if argv0.to_s[0] == ?_
|
73
|
+
if argv0.length == 1
|
74
|
+
argv0 = Name.create(argv0.to_s + '._tcp')
|
75
|
+
end
|
76
|
+
|
77
|
+
if argv0.length == 2
|
78
|
+
argv0 = Name.create(argv0.to_s + '.local')
|
79
|
+
end
|
80
|
+
else
|
81
|
+
if argv0.length == 1
|
82
|
+
argv0 = Name.create(argv0.to_s + '.local')
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
puts "#{n} -> #{argv0}"
|
88
|
+
|
89
|
+
if( opt_addr )
|
90
|
+
pp Resolv.getaddress(argv0.to_s)
|
91
|
+
else
|
92
|
+
|
93
|
+
# r.each_resource(argv0, opt_type) do |rr| # BUG - this never times out...
|
94
|
+
r.getresources(argv0, opt_type).each do |rr|
|
95
|
+
pp rr
|
96
|
+
|
97
|
+
if opt_recur
|
98
|
+
case rr
|
99
|
+
when Resolv::DNS::Resource::IN::PTR
|
100
|
+
n = rr.name
|
101
|
+
|
102
|
+
r.each_resource(n, Resolv::DNS::Resource::IN::ANY) do |rr1|
|
103
|
+
pp rr1
|
104
|
+
end
|
105
|
+
# TODO - A query for SRV.target
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
@@ -0,0 +1,48 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$:.unshift '../../lib'
|
3
|
+
$:.unshift '../../ext'
|
4
|
+
|
5
|
+
require 'optparse'
|
6
|
+
require 'dnssd'
|
7
|
+
|
8
|
+
Thread.abort_on_exception = true
|
9
|
+
|
10
|
+
options = {}
|
11
|
+
|
12
|
+
ARGV.options do |opts|
|
13
|
+
opts.on('-nnumber_of_services', '--number=number_of_services',
|
14
|
+
'Number of services to register') { |options[:number]| }
|
15
|
+
opts.on('-ttype', '--type=servicetype',
|
16
|
+
'Type of service (e.g. _http._tcp)') { |options[:type]| }
|
17
|
+
opts.on('-pport','--port=port',
|
18
|
+
'Base port on which to advertise (will increase by 1 for every advertisement)') { |options[:port]| }
|
19
|
+
opts.parse!
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
def register_stress(number, type)
|
24
|
+
registrars = []
|
25
|
+
1.upto(number) do |num|
|
26
|
+
text_record = DNSSD::TextRecord.new("1st"=>"First#{num}", "last"=>"Last#{num}")
|
27
|
+
registrars << DNSSD.register( "ruby stress #{num}",
|
28
|
+
type, "local",
|
29
|
+
8080 + num, text_record) do |service, register|
|
30
|
+
puts register.inspect
|
31
|
+
end
|
32
|
+
end
|
33
|
+
registrars
|
34
|
+
end
|
35
|
+
|
36
|
+
if __FILE__ == $0 then
|
37
|
+
number = options[:number] || 300
|
38
|
+
number = number.to_i
|
39
|
+
type = options[:type] || "_http._tcp"
|
40
|
+
port = options[:port] || 8080
|
41
|
+
registrars = register_stress(number, type)
|
42
|
+
puts "#{number} services registered...press enter to terminate"
|
43
|
+
gets
|
44
|
+
registrars.each do |reg|
|
45
|
+
reg.stop
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
data/test/test_browse.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
begin
|
2
|
+
require 'dnssd'
|
3
|
+
rescue LoadError => error
|
4
|
+
#This is just in case you did not install, but want to test
|
5
|
+
$:.unshift '../lib'
|
6
|
+
$:.unshift '../ext'
|
7
|
+
require 'dnssd'
|
8
|
+
end
|
9
|
+
|
10
|
+
Thread.abort_on_exception = true
|
11
|
+
|
12
|
+
print "Press <return> to start (and <return to end): "
|
13
|
+
$stdin.gets
|
14
|
+
|
15
|
+
|
16
|
+
browse_service = DNSSD.browse('_presence._tcp') do |browse_reply|
|
17
|
+
puts browse_reply.inspect
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
$stdin.gets
|
22
|
+
|
23
|
+
browse_service.stop
|
24
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
if __FILE__ == $0
|
2
|
+
Thread.abort_on_exception = true
|
3
|
+
## Our sample code
|
4
|
+
service = DNSSD::Service.advertise_http("Chad's server", 8808) do |service|
|
5
|
+
puts service.inspect
|
6
|
+
#service.name_changed? {|name| my_widget.update(name) }
|
7
|
+
end
|
8
|
+
sleep 4
|
9
|
+
service.stop
|
10
|
+
|
11
|
+
#browser = DNSSD::Browser.for_http do |service|
|
12
|
+
#host, port = service.resolve #optionally returns [host, port, iface]
|
13
|
+
#end
|
14
|
+
#sleep 4
|
15
|
+
#browser.stop
|
16
|
+
#if(browser.more_coming?)
|
17
|
+
#puts "blah"
|
18
|
+
#end
|
19
|
+
#browser.service_discovered? {|service|}
|
20
|
+
#browser.service_lost? {|service|}
|
21
|
+
#browser.on_changed {
|
22
|
+
# get current values for UI update
|
23
|
+
#}
|
24
|
+
#browser.all_current #=> [service1, service2]
|
25
|
+
#browser.changed?
|
26
|
+
end
|
27
|
+
|
28
|
+
=begin
|
29
|
+
|
30
|
+
collects the resolve results and trys each one (overlap)...when one succeeds, it cancels
|
31
|
+
the other checks and returns.
|
32
|
+
|
33
|
+
=end
|
34
|
+
|
35
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
begin
|
2
|
+
require 'dnssd'
|
3
|
+
rescue LoadError => error
|
4
|
+
#This is just in case you did not install, but want to test
|
5
|
+
$:.unshift '../lib'
|
6
|
+
$:.unshift '../ext'
|
7
|
+
require 'dnssd'
|
8
|
+
end
|
9
|
+
|
10
|
+
Thread.abort_on_exception = true
|
11
|
+
|
12
|
+
require 'dnssd'
|
13
|
+
|
14
|
+
print "Press <return> to start (and <return to end): "
|
15
|
+
$stdin.gets
|
16
|
+
|
17
|
+
#registrar_no_block = DNSSD.register("hey ruby", "_http._tcp", nil, 8081)
|
18
|
+
#registrar_no_block.stop
|
19
|
+
|
20
|
+
registrar = DNSSD.register("chad ruby", "_http._tcp", nil, 8080) do |register_reply|
|
21
|
+
puts "Registration: #{register_reply.inspect}"
|
22
|
+
end
|
23
|
+
sleep 4
|
24
|
+
browse_service = DNSSD.browse('_http._tcp') do |browse_reply|
|
25
|
+
puts "Browse: #{browse_reply.inspect}"
|
26
|
+
end
|
27
|
+
|
28
|
+
$stdin.gets
|
29
|
+
|
30
|
+
registrar.stop
|
31
|
+
browse_service.stop
|
32
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
begin
|
2
|
+
require 'dnssd'
|
3
|
+
rescue LoadError => error
|
4
|
+
#This is just in case you did not install, but want to test
|
5
|
+
$:.unshift '../lib'
|
6
|
+
$:.unshift '../ext'
|
7
|
+
require 'dnssd'
|
8
|
+
end
|
9
|
+
|
10
|
+
Thread.abort_on_exception = true
|
11
|
+
|
12
|
+
require 'dnssd'
|
13
|
+
|
14
|
+
print "Press <return> to start (and <return to end): "
|
15
|
+
$stdin.gets
|
16
|
+
|
17
|
+
rservice = DNSSD.resolve("foo bar", "_http._tcp", "local") do |resolve_reply|
|
18
|
+
puts resolve_reply.inspect
|
19
|
+
end
|
20
|
+
|
21
|
+
rservice.stop
|
22
|
+
|
23
|
+
$stdin.gets
|
@@ -0,0 +1,56 @@
|
|
1
|
+
begin
|
2
|
+
require 'dnssd'
|
3
|
+
rescue LoadError => error
|
4
|
+
#This is just in case you did not install, but want to test
|
5
|
+
$:.unshift '../lib'
|
6
|
+
$:.unshift '../ext'
|
7
|
+
require 'dnssd'
|
8
|
+
end
|
9
|
+
|
10
|
+
require 'pp'
|
11
|
+
|
12
|
+
Thread.abort_on_exception = true
|
13
|
+
|
14
|
+
class ChatNameResolver
|
15
|
+
def self.resolve_add(browse_reply)
|
16
|
+
Thread.new(browse_reply) do |browse_reply|
|
17
|
+
DNSSD.resolve(browse_reply.name, browse_reply.type, browse_reply.domain) do |resolve_reply|
|
18
|
+
puts "Adding: #{resolve_reply.inspect}"
|
19
|
+
#pp resolve_reply.text_record
|
20
|
+
resolve_reply.service.stop
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
def self.resolve_remove(browse_reply)
|
25
|
+
Thread.new(browse_reply) do |browse_reply|
|
26
|
+
DNSSD.resolve(browse_reply.name, browse_reply.type, browse_reply.domain) do |resolve_reply|
|
27
|
+
puts "Removing: #{resolve_reply.inspect}"
|
28
|
+
resolve_reply.service.stop
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
print "Press <return> to start (and <return to end): "
|
35
|
+
$stdin.gets
|
36
|
+
|
37
|
+
browse_service = nil
|
38
|
+
|
39
|
+
Thread.new {
|
40
|
+
browse_service = DNSSD.browse('_presence._tcp') do |browse_reply|
|
41
|
+
puts "Browsing: #{browse_reply.inspect}"
|
42
|
+
if (browse_reply.flags.add?)
|
43
|
+
ChatNameResolver.resolve_add(browse_reply)
|
44
|
+
else
|
45
|
+
ChatNameResolver.resolve_remove(browse_reply)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
sleep 10
|
49
|
+
}
|
50
|
+
|
51
|
+
$stdin.gets
|
52
|
+
|
53
|
+
browse_service.stop
|
54
|
+
|
55
|
+
puts browse_service.inspect
|
56
|
+
|
@@ -0,0 +1,58 @@
|
|
1
|
+
#/usr/local/bin/ruby
|
2
|
+
#/usr/bin/ruby
|
3
|
+
|
4
|
+
require 'test/unit'
|
5
|
+
begin
|
6
|
+
require 'dnssd'
|
7
|
+
rescue LoadError => error
|
8
|
+
#This is just in case you did not install, but want to test
|
9
|
+
$:.unshift '../lib'
|
10
|
+
$:.unshift '../ext'
|
11
|
+
require 'dnssd'
|
12
|
+
end
|
13
|
+
|
14
|
+
include DNSSD
|
15
|
+
|
16
|
+
class Test_DNSSD < Test::Unit::TestCase
|
17
|
+
|
18
|
+
def test_text_record
|
19
|
+
tr = TextRecord.new
|
20
|
+
tr["key"]="value"
|
21
|
+
enc_str = ["key", "value"].join('=')
|
22
|
+
enc_str = enc_str.length.chr << enc_str
|
23
|
+
assert_equal(enc_str, tr.encode)
|
24
|
+
|
25
|
+
# should raise type error
|
26
|
+
assert_raise(TypeError) do
|
27
|
+
tr_new = TextRecord.decode(:HEY)
|
28
|
+
end
|
29
|
+
tr_new = TextRecord.decode(enc_str)
|
30
|
+
assert_equal(tr_new, tr)
|
31
|
+
|
32
|
+
# new called with just a string should be
|
33
|
+
# the same as decode.
|
34
|
+
tr_new = TextRecord.new(enc_str)
|
35
|
+
assert_equal(tr_new, tr)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_flags
|
39
|
+
f = Flags.new()
|
40
|
+
f.more_coming = true
|
41
|
+
assert(f.more_coming?)
|
42
|
+
assert_equal(Flags::MoreComing, f.to_i)
|
43
|
+
f.shared = true
|
44
|
+
assert(f.shared?)
|
45
|
+
assert_equal(Flags::MoreComing | Flags::Shared, f.to_i)
|
46
|
+
|
47
|
+
assert_equal(Flags.new(Flags::MoreComing | Flags::Shared), f.to_i)
|
48
|
+
|
49
|
+
assert_same(true, f.add = true)
|
50
|
+
assert(f.add?)
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_browse
|
54
|
+
# how to test?
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
metadata
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: toolmantim-zeroconf
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Lachie Cox
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-05-12 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: "Cross-platform zeroconf (aka bonjour\xE2\x84\xA2) library."
|
17
|
+
email: lachiec@gmail.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- README.rdoc
|
24
|
+
files:
|
25
|
+
- README.rdoc
|
26
|
+
- Rakefile
|
27
|
+
- lib/dnssd.rb
|
28
|
+
- lib/net
|
29
|
+
- lib/net/dns
|
30
|
+
- lib/net/dns/mdns-sd.rb
|
31
|
+
- lib/net/dns/mdns.rb
|
32
|
+
- lib/net/dns/resolv-mdns.rb
|
33
|
+
- lib/net/dns/resolv-replace.rb
|
34
|
+
- lib/net/dns/resolv.rb
|
35
|
+
- lib/net/dns/resolvx.rb
|
36
|
+
- lib/net/dns.rb
|
37
|
+
- lib/zeroconf
|
38
|
+
- lib/zeroconf/common.rb
|
39
|
+
- lib/zeroconf/ext.rb
|
40
|
+
- lib/zeroconf/pure.rb
|
41
|
+
- lib/zeroconf/version.rb
|
42
|
+
- lib/zeroconf.rb
|
43
|
+
- originals/dnssd-0.6.0
|
44
|
+
- originals/dnssd-0.6.0/COPYING
|
45
|
+
- originals/dnssd-0.6.0/README
|
46
|
+
- originals/net-mdns-0.4
|
47
|
+
- originals/net-mdns-0.4/COPYING
|
48
|
+
- originals/net-mdns-0.4/README
|
49
|
+
- originals/net-mdns-0.4/TODO
|
50
|
+
- samples/exhttp.rb
|
51
|
+
- samples/exhttpv1.rb
|
52
|
+
- samples/exwebrick.rb
|
53
|
+
- samples/mdns-watch.rb
|
54
|
+
- samples/mdns.rb
|
55
|
+
- samples/test_dns.rb
|
56
|
+
- samples/v1demo.rb
|
57
|
+
- samples/v1mdns.rb
|
58
|
+
- test/stress
|
59
|
+
- test/stress/stress_register.rb
|
60
|
+
- test/test_browse.rb
|
61
|
+
- test/test_highlevel_api.rb
|
62
|
+
- test/test_register.rb
|
63
|
+
- test/test_resolve.rb
|
64
|
+
- test/test_resolve_ichat.rb
|
65
|
+
- test/test_textrecord.rb
|
66
|
+
has_rdoc: true
|
67
|
+
homepage: http://github.com/lachie/zeroconf
|
68
|
+
post_install_message:
|
69
|
+
rdoc_options: []
|
70
|
+
|
71
|
+
require_paths:
|
72
|
+
- lib
|
73
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: "0"
|
78
|
+
version:
|
79
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: "0"
|
84
|
+
version:
|
85
|
+
requirements: []
|
86
|
+
|
87
|
+
rubyforge_project:
|
88
|
+
rubygems_version: 1.2.0
|
89
|
+
signing_key:
|
90
|
+
specification_version: 2
|
91
|
+
summary: "Cross-platform zeroconf (aka bonjour\xE2\x84\xA2) library."
|
92
|
+
test_files: []
|
93
|
+
|