toolmantim-zeroconf 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
|