toolmantim-zeroconf 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
+
@@ -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
+