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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4e2638bae0d324a550c85d5c5b8519dd5527b2f0
4
- data.tar.gz: aa01339a607bf1302048356f3ab046d955e3c683
3
+ metadata.gz: 12ad2e36655336efcfa1c4f71458e14ccbd56c88
4
+ data.tar.gz: 8edc276f5c5810161799a3488aaa16a75f57bd6a
5
5
  SHA512:
6
- metadata.gz: 62ac49d8125a15e71e729ee7d2408d06dddad23084b9c4771993948380ba6409a159f7244635dae54052c5d8ceab067cd65139dc20b34d1446aed4649adff533
7
- data.tar.gz: e959144ac34d8893f79c85e44512fcbb83c88d33e6530e089e4413f78d08c280056d5ffc5be77ebdb961c5144b4ae806e4099030535870c2ad5a3a5ca82bf4c9
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(Net::DNS::RR.new("leet.local. 60 A 10.0.13.37")) # Add a record for leet.local to resolve to 10.0.13.37 with a TTL of 60 seconds
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. Couldn't seem to find an example response.
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)
@@ -1,10 +1,13 @@
1
1
  require "mdns/version"
2
- require "net/dns"
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
- Net::DNS::Packet::parse(data)
25
- rescue => e
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.header.query? && packet.question.any? { |q| hosts.include?(q.qName.downcase) && q.qType.to_s == 'A' }
30
- respond_to(packet)
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
- respond_with(record)
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 respond_to(query)
45
- record = records[query.question.first.qName.downcase]
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 = Net::DNS::Packet.new(record.name)
52
- response.header.qr = true
53
- response.header.aa = true
54
- response.header.anCount = 1
55
- response.header.arCount = 1
56
- response.answer = record
57
- @socket.send(response.data, 0, MULTICAST_IP, MDNS_PORT)
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(record)
61
- if record.is_a?(String)
62
- record = Net::DNS::RR.new(record)
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
@@ -1,3 +1,3 @@
1
1
  class MDNS
2
- VERSION = "0.1.3"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -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"
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
  require 'resolv'
3
3
 
4
4
  describe MDNS do
5
- let(:domain) { "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
@@ -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(domain)
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(Net::DNS::RR.new("#{domain} 60 A #{ip}"))
24
+ MDNS.add_record(host, 120, ip)
25
25
  MDNS.start
26
26
  end
27
27
 
28
28
  it "does resolve" do
29
- expect(Socket.gethostbyname(domain)).to be_a(Array)
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.1.3
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