mdns 0.1.3 → 0.2.0
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.
- checksums.yaml +4 -4
- data/README.md +6 -4
- data/lib/mdns.rb +29 -28
- data/lib/mdns/version.rb +1 -1
- data/mdns.gemspec +0 -1
- data/spec/mdns_spec.rb +4 -19
- metadata +1 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 12ad2e36655336efcfa1c4f71458e14ccbd56c88
|
4
|
+
data.tar.gz: 8edc276f5c5810161799a3488aaa16a75f57bd6a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7dfd3297ca2dc3de61fecdf447570082dd9612edacc53d2746309c7f50ef7c8815fb399f18bf7da9d6f4e647fa12d65be4d34c22935df1ef78c260ee9be64891
|
7
|
+
data.tar.gz: 1c5bd92cbacd952eb440a40a761a2e7c852435c8ee90e38106e2737d6c2760d8acb812d6d93c88f4fc99ea5de0ec7b014d68b70222d881d2569d287431d789ff
|
data/README.md
CHANGED
@@ -30,17 +30,19 @@ Or install it yourself as:
|
|
30
30
|
|
31
31
|
```ruby
|
32
32
|
require "mdns"
|
33
|
-
MDNS.add_record(
|
34
|
-
MDNS.add_record("leet.local. 60 A 10.0.13.37")) # Can pass in a string too
|
35
|
-
|
33
|
+
MDNS.add_record("leet.local", 60, "10.0.13.37") # Add a record for leet.local to resolve to 10.0.13.37 with a TTL of 60 seconds
|
36
34
|
MDNS.start # Start listening
|
37
35
|
```
|
38
36
|
|
39
37
|
## Caveats
|
40
38
|
|
41
|
-
* Does not "unpublish" a record when stopping.
|
39
|
+
* Does not "unpublish" a record when stopping.
|
42
40
|
* Only supports A records
|
43
41
|
|
42
|
+
## Contributing
|
43
|
+
|
44
|
+
Contributions greatly appreciated! Fork and send a pull request.
|
45
|
+
|
44
46
|
## License
|
45
47
|
|
46
48
|
The MIT License (MIT)
|
data/lib/mdns.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
require "mdns/version"
|
2
|
-
require "
|
2
|
+
require "resolv"
|
3
|
+
require "ipaddr"
|
3
4
|
|
4
5
|
class MDNS
|
5
6
|
MULTICAST_IP = '224.0.0.251'
|
6
7
|
MDNS_PORT = 5353
|
7
8
|
|
9
|
+
class Record < Struct.new(:host, :ttl, :ip); end
|
10
|
+
|
8
11
|
class << self
|
9
12
|
def start
|
10
13
|
@socket = UDPSocket.new
|
@@ -19,21 +22,24 @@ class MDNS
|
|
19
22
|
@thr = Thread.new do
|
20
23
|
loop do
|
21
24
|
data = @socket.recv(1024)
|
22
|
-
next unless data[0...4] == "\x00\x00\x00\x00" # Filter out non-queries
|
23
25
|
packet = begin
|
24
|
-
|
25
|
-
rescue
|
26
|
-
# Net::DNS::Packet doesn't handle a bunch of mDNS packets
|
26
|
+
Resolv::DNS::Message.decode(data)
|
27
|
+
rescue Resolv::DNS::DecodeError
|
27
28
|
end
|
28
29
|
next if packet.nil?
|
29
|
-
if packet.
|
30
|
-
|
30
|
+
if packet.qr == 0
|
31
|
+
hosts = packet.question.map(&:first).map(&:to_s)
|
32
|
+
matches = self.hosts & hosts
|
33
|
+
matches.each do |host|
|
34
|
+
respond(records[host])
|
35
|
+
end
|
31
36
|
end
|
32
37
|
end
|
33
38
|
end
|
34
39
|
|
40
|
+
# Broadcast records
|
35
41
|
records.values.each do |record|
|
36
|
-
|
42
|
+
respond(record)
|
37
43
|
end
|
38
44
|
|
39
45
|
at_exit do
|
@@ -41,28 +47,23 @@ class MDNS
|
|
41
47
|
end
|
42
48
|
end
|
43
49
|
|
44
|
-
def
|
45
|
-
|
46
|
-
respond_with(record)
|
47
|
-
end
|
48
|
-
|
49
|
-
def respond_with(record)
|
50
|
+
def respond(record)
|
51
|
+
return if !@socket || @socket.closed?
|
50
52
|
# I have no idea what I'm doing
|
51
|
-
response
|
52
|
-
response.
|
53
|
-
response.
|
54
|
-
response.
|
55
|
-
response.
|
56
|
-
response.
|
57
|
-
|
53
|
+
response = Resolv::DNS::Message.new
|
54
|
+
response.qr = 1
|
55
|
+
response.opcode = 0
|
56
|
+
response.aa = 1
|
57
|
+
response.rd = 0
|
58
|
+
response.ra = 0
|
59
|
+
response.rcode = 0
|
60
|
+
response.add_answer(record.host, record.ttl, Resolv::DNS::Resource::IN::A.new(record.ip))
|
61
|
+
@socket.send(response.encode, 0, MULTICAST_IP, MDNS_PORT)
|
58
62
|
end
|
59
63
|
|
60
|
-
def add_record(
|
61
|
-
|
62
|
-
|
63
|
-
end
|
64
|
-
records[record.name.downcase] = record
|
65
|
-
respond_with(record) if @socket && !@socket.closed?
|
64
|
+
def add_record(host, ttl, ip)
|
65
|
+
records[host] = Record.new(host, ttl, ip)
|
66
|
+
respond(records[host])
|
66
67
|
end
|
67
68
|
|
68
69
|
def records
|
@@ -88,4 +89,4 @@ class MDNS
|
|
88
89
|
end
|
89
90
|
end
|
90
91
|
end
|
91
|
-
end
|
92
|
+
end
|
data/lib/mdns/version.rb
CHANGED
data/mdns.gemspec
CHANGED
@@ -18,7 +18,6 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_dependency "net-dns", "~> 0.8"
|
22
21
|
spec.add_development_dependency "rspec", "~> 2.14"
|
23
22
|
spec.add_development_dependency "bundler", "~> 1.5"
|
24
23
|
spec.add_development_dependency "rake"
|
data/spec/mdns_spec.rb
CHANGED
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
require 'resolv'
|
3
3
|
|
4
4
|
describe MDNS do
|
5
|
-
let(:
|
5
|
+
let(:host) { "foo-bar-#{rand(1000)}.local." }
|
6
6
|
let(:ip) { "10.10.10.10" }
|
7
7
|
|
8
8
|
before do
|
@@ -14,35 +14,20 @@ describe MDNS do
|
|
14
14
|
context "MDNS not running" do
|
15
15
|
it "does not resolve" do
|
16
16
|
expect do
|
17
|
-
Socket.gethostbyname(
|
17
|
+
Socket.gethostbyname(host)
|
18
18
|
end.to raise_error(SocketError)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
22
|
context "MDNS is running" do
|
23
23
|
before do
|
24
|
-
MDNS.add_record(
|
24
|
+
MDNS.add_record(host, 120, ip)
|
25
25
|
MDNS.start
|
26
26
|
end
|
27
27
|
|
28
28
|
it "does resolve" do
|
29
|
-
expect(
|
29
|
+
expect(IPSocket.getaddress(host)).to eq(ip)
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
33
|
-
|
34
|
-
describe '.add_record' do
|
35
|
-
it "takes a string" do
|
36
|
-
MDNS.add_record("#{domain} 60 A #{ip}")
|
37
|
-
expect(MDNS.records.keys).to eq([domain])
|
38
|
-
expect(MDNS.records.values.first).to be_a(Net::DNS::RR)
|
39
|
-
end
|
40
|
-
|
41
|
-
it "takes a Net::DNS::RR" do
|
42
|
-
MDNS.add_record(Net::DNS::RR.new("#{domain} 60 A #{ip}"))
|
43
|
-
expect(MDNS.records.keys).to eq([domain])
|
44
|
-
expect(MDNS.records.values.first).to be_a(Net::DNS::RR)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
33
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mdns
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jack Chen (chendo)
|
@@ -10,20 +10,6 @@ bindir: bin
|
|
10
10
|
cert_chain: []
|
11
11
|
date: 2014-03-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: net-dns
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0.8'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0.8'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: rspec
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|