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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 12ad2e36655336efcfa1c4f71458e14ccbd56c88
4
- data.tar.gz: 8edc276f5c5810161799a3488aaa16a75f57bd6a
3
+ metadata.gz: 63aee373c87c5b3f9e702014438e32d2d35524d7
4
+ data.tar.gz: b116426bef164a9883330f17150518b395bbf89c
5
5
  SHA512:
6
- metadata.gz: 7dfd3297ca2dc3de61fecdf447570082dd9612edacc53d2746309c7f50ef7c8815fb399f18bf7da9d6f4e647fa12d65be4d34c22935df1ef78c260ee9be64891
7
- data.tar.gz: 1c5bd92cbacd952eb440a40a761a2e7c852435c8ee90e38106e2737d6c2760d8acb812d6d93c88f4fc99ea5de0ec7b014d68b70222d881d2569d287431d789ff
6
+ metadata.gz: 648c382e50f455b17f0ce9b2e6bc634128007465f30195182f2853424e4da34029fea670cae54da66ed37cc9fed1ff5d1c21084fe29e4c6692246959bc7e7037
7
+ data.tar.gz: 443112bd1e6b5c6372a44a32e96eeed798a7c83828b7dfd19bc476157da9f2a9f50c964fd6b406ad618ac2fdd0350f83e274713501852eb61ddd1fb469e7ff92
@@ -2,8 +2,4 @@ language: ruby
2
2
  notifications:
3
3
  email: false
4
4
  rvm:
5
- - 1.9.3
6
- - 2.0.0
7
5
  - 2.1.1
8
- - jruby-19mode
9
- - rbx
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
@@ -1 +1,7 @@
1
1
  require "bundler/gem_tasks"
2
+
3
+ require "rspec/core/rake_task"
4
+
5
+ RSpec::Core::RakeTask.new(:spec) do |t|
6
+ end
7
+ task :default => :spec
@@ -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.recv(1024)
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, MULTICAST_IP, MDNS_PORT)
67
+ @socket.send(response.encode, 0, ip, port)
62
68
  end
63
69
 
64
70
  def add_record(host, ttl, ip)
@@ -1,3 +1,3 @@
1
1
  class MDNS
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
@@ -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 do
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(IPSocket.getaddress(host)).to eq(ip)
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.0
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-29 00:00:00.000000000 Z
11
+ date: 2014-03-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec