mdns 0.1.3 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|