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 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