mdns 0.2.0 → 0.2.1
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/.travis.yml +0 -4
- data/README.md +1 -1
- data/Rakefile +6 -0
- data/lib/mdns.rb +12 -6
- data/lib/mdns/version.rb +1 -1
- data/spec/mdns_spec.rb +16 -5
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 63aee373c87c5b3f9e702014438e32d2d35524d7
|
4
|
+
data.tar.gz: b116426bef164a9883330f17150518b395bbf89c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 648c382e50f455b17f0ce9b2e6bc634128007465f30195182f2853424e4da34029fea670cae54da66ed37cc9fed1ff5d1c21084fe29e4c6692246959bc7e7037
|
7
|
+
data.tar.gz: 443112bd1e6b5c6372a44a32e96eeed798a7c83828b7dfd19bc476157da9f2a9f50c964fd6b406ad618ac2fdd0350f83e274713501852eb61ddd1fb469e7ff92
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -8,7 +8,7 @@ This gem implements a super naive mDNS server that listens for queries matching
|
|
8
8
|
|
9
9
|
This gem was created by observing existing mDNS queries and responses. I did not read the RFC, so it might not follow the spec properly.
|
10
10
|
|
11
|
-
Tested on OS X Mavericks.
|
11
|
+
Tested on OS X Mavericks, Ruby 2.0+. Should work with older versions of Ruby and other *nix OSes.
|
12
12
|
|
13
13
|
Should work with any client that implements mDNS resolver.
|
14
14
|
|
data/Rakefile
CHANGED
data/lib/mdns.rb
CHANGED
@@ -12,7 +12,7 @@ class MDNS
|
|
12
12
|
def start
|
13
13
|
@socket = UDPSocket.new
|
14
14
|
@socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true)
|
15
|
-
@socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEPORT, true)
|
15
|
+
@socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEPORT, true) if Socket.const_defined?("SO_REUSEPORT")
|
16
16
|
ip_mreq = IPAddr.new(MULTICAST_IP).hton + IPAddr.new('0.0.0.0').hton
|
17
17
|
@socket.setsockopt(Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, ip_mreq)
|
18
18
|
@socket.setsockopt(Socket::IPPROTO_IP, Socket::IP_TTL, 255)
|
@@ -21,17 +21,20 @@ class MDNS
|
|
21
21
|
Thread.abort_on_exception = true
|
22
22
|
@thr = Thread.new do
|
23
23
|
loop do
|
24
|
-
data = @socket.
|
24
|
+
data, address = @socket.recvfrom(1024)
|
25
25
|
packet = begin
|
26
26
|
Resolv::DNS::Message.decode(data)
|
27
27
|
rescue Resolv::DNS::DecodeError
|
28
|
+
nil # Invalid DNS data
|
29
|
+
rescue
|
30
|
+
nil # Sometimes it errors out due to non DNS data
|
28
31
|
end
|
29
32
|
next if packet.nil?
|
30
33
|
if packet.qr == 0
|
31
34
|
hosts = packet.question.map(&:first).map(&:to_s)
|
32
35
|
matches = self.hosts & hosts
|
33
36
|
matches.each do |host|
|
34
|
-
respond(records[host])
|
37
|
+
respond(records[host], packet, address[3], address[1])
|
35
38
|
end
|
36
39
|
end
|
37
40
|
end
|
@@ -47,18 +50,21 @@ class MDNS
|
|
47
50
|
end
|
48
51
|
end
|
49
52
|
|
50
|
-
def respond(record)
|
53
|
+
def respond(record, query = nil, ip = MULTICAST_IP, port = MDNS_PORT)
|
51
54
|
return if !@socket || @socket.closed?
|
52
55
|
# I have no idea what I'm doing
|
53
|
-
response = Resolv::DNS::Message.new
|
56
|
+
response = Resolv::DNS::Message.new(query ? query.id : 0)
|
54
57
|
response.qr = 1
|
55
58
|
response.opcode = 0
|
56
59
|
response.aa = 1
|
57
60
|
response.rd = 0
|
58
61
|
response.ra = 0
|
59
62
|
response.rcode = 0
|
63
|
+
if query
|
64
|
+
response.add_question(*query.question.first)
|
65
|
+
end
|
60
66
|
response.add_answer(record.host, record.ttl, Resolv::DNS::Resource::IN::A.new(record.ip))
|
61
|
-
@socket.send(response.encode, 0,
|
67
|
+
@socket.send(response.encode, 0, ip, port)
|
62
68
|
end
|
63
69
|
|
64
70
|
def add_record(host, ttl, ip)
|
data/lib/mdns/version.rb
CHANGED
data/spec/mdns_spec.rb
CHANGED
@@ -2,20 +2,31 @@ require 'spec_helper'
|
|
2
2
|
require 'resolv'
|
3
3
|
|
4
4
|
describe MDNS do
|
5
|
-
let(:host) { "foo-bar-#{rand(1000)}.local
|
5
|
+
let(:host) { "foo-bar-#{rand(1000)}.local" }
|
6
6
|
let(:ip) { "10.10.10.10" }
|
7
7
|
|
8
8
|
before do
|
9
9
|
MDNS.reset
|
10
10
|
end
|
11
11
|
|
12
|
+
def resolve(hostname)
|
13
|
+
results = []
|
14
|
+
begin
|
15
|
+
Timeout.timeout(5) do
|
16
|
+
Resolv::MDNS.new.each_address(hostname) do |addr|
|
17
|
+
results << addr.to_s
|
18
|
+
end
|
19
|
+
end
|
20
|
+
rescue Timeout::Error
|
21
|
+
end
|
22
|
+
results
|
23
|
+
end
|
24
|
+
|
12
25
|
describe "integration test" do
|
13
26
|
|
14
27
|
context "MDNS not running" do
|
15
28
|
it "does not resolve" do
|
16
|
-
expect
|
17
|
-
Socket.gethostbyname(host)
|
18
|
-
end.to raise_error(SocketError)
|
29
|
+
expect(resolve(host)).to be_empty
|
19
30
|
end
|
20
31
|
end
|
21
32
|
|
@@ -26,7 +37,7 @@ describe MDNS do
|
|
26
37
|
end
|
27
38
|
|
28
39
|
it "does resolve" do
|
29
|
-
expect(
|
40
|
+
expect(resolve(host)).to eq([ip])
|
30
41
|
end
|
31
42
|
end
|
32
43
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mdns
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jack Chen (chendo)
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|