mdns 0.2.0 → 0.2.1

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