radiodns 0.0.3 → 0.1.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.
- data/README.md +22 -5
- data/lib/radiodns.rb +51 -1
- data/lib/radiodns/version.rb +1 -1
- data/spec/radiodns_spec.rb +63 -4
- metadata +1 -1
data/README.md
CHANGED
@@ -18,8 +18,8 @@ Then if you already have the Fully Qualified Domain Name as specified
|
|
18
18
|
in the [RadioDNS spec](http://radiodns.org/wp-content/uploads/2009/03/rdns011.pdf), you
|
19
19
|
can resolve it into a CNAME like so
|
20
20
|
|
21
|
-
|
22
|
-
puts cname #=> 'rdns.musicradio.com'
|
21
|
+
service = RadioDNS::Resolver.resolve('09580.c586.ce1.fm.radiodns.org')
|
22
|
+
puts service.cname #=> 'rdns.musicradio.com'
|
23
23
|
|
24
24
|
You can also pass in the parameters required to construct the FQDN to
|
25
25
|
the resolve method
|
@@ -30,10 +30,29 @@ the resolve method
|
|
30
30
|
:ecc => 'ce1',
|
31
31
|
:bearer => 'fm'
|
32
32
|
}
|
33
|
-
|
33
|
+
service = RadioDNS::Resolver.resolve(params)
|
34
34
|
|
35
35
|
The bearers `fm`, `dab`, `drm`, `amss` and `hd` are supported.
|
36
36
|
|
37
|
+
Once you have a service you can perform application discovery
|
38
|
+
|
39
|
+
radiovis_application = service.radiovis
|
40
|
+
|
41
|
+
radiovis_application.host #=> "_radiovis._tcp.rdns.musicradio.com"
|
42
|
+
radiovis_application.port #=> 61613
|
43
|
+
|
44
|
+
Or to get an array of supported applications
|
45
|
+
|
46
|
+
service.applications
|
47
|
+
|
48
|
+
Returns an array of Applications
|
49
|
+
|
50
|
+
[#<RadioDNS::Application @host="_radioepg._tcp.rdns.musicradio.com", @port=61613>,
|
51
|
+
#<RadioDNS::Application @host="_radiovis._tcp.rdns.musicradio.com", @port=61613>]
|
52
|
+
|
53
|
+
In the future these may become instances of specific classes that
|
54
|
+
implement the application-specific behaviour.
|
55
|
+
|
37
56
|
## TODO
|
38
57
|
|
39
58
|
- better error checking of supplied parameters. The code current
|
@@ -43,5 +62,3 @@ The bearers `fm`, `dab`, `drm`, `amss` and `hd` are supported.
|
|
43
62
|
|
44
63
|
- return an appropriate error if DNS look-up does not resolve to
|
45
64
|
CNAME.
|
46
|
-
|
47
|
-
- service discovery
|
data/lib/radiodns.rb
CHANGED
@@ -1,6 +1,56 @@
|
|
1
1
|
require 'resolv'
|
2
2
|
|
3
3
|
module RadioDNS
|
4
|
+
class Service
|
5
|
+
attr_accessor :cname
|
6
|
+
def initialize(cname)
|
7
|
+
@cname = cname
|
8
|
+
end
|
9
|
+
|
10
|
+
def radiovis
|
11
|
+
application(:radiovis)
|
12
|
+
end
|
13
|
+
|
14
|
+
def radioepg
|
15
|
+
application(:radioepg)
|
16
|
+
end
|
17
|
+
|
18
|
+
def radiotag
|
19
|
+
application(:radiotag)
|
20
|
+
end
|
21
|
+
|
22
|
+
def applications
|
23
|
+
applications = []
|
24
|
+
[:radiotag, :radioepg, :radiovis].each do |method_name|
|
25
|
+
application = self.send(method_name)
|
26
|
+
applications << application if application
|
27
|
+
end
|
28
|
+
applications
|
29
|
+
end
|
30
|
+
|
31
|
+
def application(service)
|
32
|
+
resolver = Resolv::DNS.new
|
33
|
+
|
34
|
+
prefix = "_#{service.to_s}._tcp."
|
35
|
+
host = prefix + cname
|
36
|
+
begin
|
37
|
+
resource = resolver.getresource(host,
|
38
|
+
Resolv::DNS::Resource::IN::SRV)
|
39
|
+
Application.new :host => host, :port => resource.port
|
40
|
+
rescue Resolv::ResolvError
|
41
|
+
nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
class Application
|
47
|
+
attr_accessor :host, :port
|
48
|
+
def initialize(params)
|
49
|
+
@host = params[:host]
|
50
|
+
@port = params[:port]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
4
54
|
class Resolver
|
5
55
|
def self.resolve(fqdn)
|
6
56
|
if fqdn.is_a? Hash
|
@@ -9,7 +59,7 @@ module RadioDNS
|
|
9
59
|
|
10
60
|
resolver = Resolv::DNS.new
|
11
61
|
cname = resolver.getresource(fqdn, Resolv::DNS::Resource::IN::CNAME)
|
12
|
-
cname.name.to_s
|
62
|
+
Service.new(cname.name.to_s)
|
13
63
|
end
|
14
64
|
|
15
65
|
def self.construct_fqdn(params)
|
data/lib/radiodns/version.rb
CHANGED
data/spec/radiodns_spec.rb
CHANGED
@@ -3,6 +3,65 @@ require 'minitest/autorun'
|
|
3
3
|
require 'mocha'
|
4
4
|
require 'radiodns'
|
5
5
|
|
6
|
+
describe "RadioDNS::Service" do
|
7
|
+
before(:each) do
|
8
|
+
@service = RadioDNS::Service.new('rdns.musicradio.com')
|
9
|
+
end
|
10
|
+
|
11
|
+
it "has a cname" do
|
12
|
+
assert @service.respond_to? :cname
|
13
|
+
end
|
14
|
+
|
15
|
+
it "looks up radiovis application" do
|
16
|
+
@service.expects(:application).with(:radiovis).returns(nil)
|
17
|
+
@service.radiovis
|
18
|
+
end
|
19
|
+
|
20
|
+
it "looks up radiotag application" do
|
21
|
+
@service.expects(:application).with(:radiotag).returns(nil)
|
22
|
+
@service.radiotag
|
23
|
+
end
|
24
|
+
|
25
|
+
it "looks up radioepg application" do
|
26
|
+
@service.expects(:application).with(:radioepg).returns(nil)
|
27
|
+
@service.radioepg
|
28
|
+
end
|
29
|
+
|
30
|
+
it "has an array of supported applications" do
|
31
|
+
@service.expects(:application).with(:radioepg).returns(:epg)
|
32
|
+
@service.expects(:application).with(:radiovis).returns(:vis)
|
33
|
+
@service.expects(:application).with(:radiotag).returns(:tag)
|
34
|
+
assert_equal [:tag, :epg, :vis], @service.applications
|
35
|
+
end
|
36
|
+
|
37
|
+
it "performs SVR lookups" do
|
38
|
+
mock_resolver = mock()
|
39
|
+
mock_resource = mock()
|
40
|
+
mock_resolver.expects(:getresource).
|
41
|
+
with('_some_application._tcp.rdns.musicradio.com', Resolv::DNS::Resource::IN::SRV).once.
|
42
|
+
returns(mock_resource)
|
43
|
+
mock_resource.expects(:port).returns(1234)
|
44
|
+
Resolv::DNS.expects(:new).returns(mock_resolver)
|
45
|
+
|
46
|
+
application = @service.application(:some_application)
|
47
|
+
|
48
|
+
assert_equal application.host, "_some_application._tcp.rdns.musicradio.com"
|
49
|
+
assert_equal application.port, 1234
|
50
|
+
end
|
51
|
+
|
52
|
+
it "returns nil when lookup fails" do
|
53
|
+
mock_resolver = mock()
|
54
|
+
mock_resource = mock()
|
55
|
+
mock_resolver.expects(:getresource).
|
56
|
+
with('_some_application._tcp.rdns.musicradio.com', Resolv::DNS::Resource::IN::SRV).once.
|
57
|
+
raises(Resolv::ResolvError)
|
58
|
+
Resolv::DNS.expects(:new).returns(mock_resolver)
|
59
|
+
|
60
|
+
application = @service.application(:some_application)
|
61
|
+
assert application.nil?
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
6
65
|
describe "RadioDNS::Resolver" do
|
7
66
|
describe "resolve" do
|
8
67
|
before(:each) do
|
@@ -16,8 +75,8 @@ describe "RadioDNS::Resolver" do
|
|
16
75
|
Resolv::DNS.expects(:new).returns(mock_resolver)
|
17
76
|
end
|
18
77
|
it "should query radiodns.org" do
|
19
|
-
|
20
|
-
assert_equal 'rdns.musicradio.com', cname
|
78
|
+
service = RadioDNS::Resolver.resolve('09580.c586.ce1.fm.radiodns.org')
|
79
|
+
assert_equal 'rdns.musicradio.com', service.cname
|
21
80
|
end
|
22
81
|
|
23
82
|
it "should accept hash params too" do
|
@@ -27,8 +86,8 @@ describe "RadioDNS::Resolver" do
|
|
27
86
|
:ecc => 'ce1',
|
28
87
|
:bearer => 'fm'
|
29
88
|
}
|
30
|
-
|
31
|
-
assert_equal 'rdns.musicradio.com', cname
|
89
|
+
service = RadioDNS::Resolver.resolve(params)
|
90
|
+
assert_equal 'rdns.musicradio.com', service.cname
|
32
91
|
end
|
33
92
|
end
|
34
93
|
|