flareon 1.0.0 → 1.0.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
  SHA256:
3
- metadata.gz: '0608731021754226390a8859a3dea917b95f5fb25a3018cce0983ce3ba930fe1'
4
- data.tar.gz: 205aaf7ccaa2402e8f487d9ef9cda4c3083370536ab6947c98af433f0125c543
3
+ metadata.gz: 1e500b30389aad18ef70b1c0b15fcd6ea7c3fe0d629eb51ef53f0e192b6c5758
4
+ data.tar.gz: 53721d0eb570b20d56b12e036dfd148f0212596d97193c2356662c6f76774d2c
5
5
  SHA512:
6
- metadata.gz: 7cf81f22465686432fd86642b503c22f8871961b42607a57bb7784c2e4167ad561022536420f0e9edb5a61fc9d64f157cc95d321e970c55eba1effbf76506235
7
- data.tar.gz: d15903463d8ce1e44507c0deafda46f3761fc0c149c8119c1cd7fef894c5ebd6bdbf324040a74e78e1ab9e4ce3c84eee45cb267e6029c0293ea4f31b680f6df1
6
+ metadata.gz: 9efdbe774d2f0ceeeb533e118dccb3af36b3c21728cdf48a0acca17b3294016793fabece71a9ffc513bdfcaaa2446a4265ddba7d66b6da07f904c29ba6c94c2f
7
+ data.tar.gz: 074e44b83f6fc9301fcc36886393353a9344de613d0390b751b3b5ddb8f7c1cb2f2c712d5532d4f99e62024160271579287155bc04ca8a960a89728795bfa6c8
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- flareon (1.0.0)
4
+ flareon (1.0.1)
5
5
  httparty (~> 0.16.2)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Flareon
2
- > A cloudflare DNS resolver client library.
2
+ > A cloudflare DNS over HTTPs resolver client library.
3
+
4
+ <p align="center">
5
+ <img alt="Pokemon, gott'a catch 'em all!" src="flareon.png"/>
6
+ <p>
7
+
8
+ Cloudflare’s DNS over HTTPs [endpoint](https://cloudflare-dns.com) supports [JSON format](https://developers.cloudflare.com/1.1.1.1/dns-over-https/json-format/) for querying [DNS](https://en.wikipedia.org/wiki/Domain_Name_System) data -- and this gem helps to use it!
3
9
 
4
10
  ## Installation
5
11
 
@@ -7,8 +13,9 @@
7
13
 
8
14
  ## Usage
9
15
 
16
+ Perform a basic DNS query over HTTPs:
10
17
  ```ruby
11
- Flareon.resolve("google.com")
18
+ Flareon.query("google.com")
12
19
  # => {
13
20
  # "Status"=>0,
14
21
  # "TC"=>false,
@@ -19,11 +26,71 @@ Flareon.resolve("google.com")
19
26
  # "Question"=>[{"name"=>"google.com.", "type"=>1}],
20
27
  # "Answer"=>[{"name"=>"google.com.", "type"=>1, "TTL"=>83, "data"=>"172.217.1.46"}]
21
28
  # }
29
+ ```
30
+
31
+ Get the raw JSON response:
32
+ ```ruby
33
+ json = Flareon.query("google.com", json: true)
34
+ ```
35
+
36
+ Specify [DNS query type](https://en.wikipedia.org/wiki/List_of_DNS_record_types):
37
+ ```ruby
38
+ Flareon.query("google.com", type: "A")
39
+ Flareon.query("google.com", type: "AAAA")
40
+ Flareon.query("google.com", type: "MX")
41
+ ```
22
42
 
43
+ The `nslookup` method is an alias for the `query` method:
44
+ ```ruby
45
+ Flareon.nslookup("google.com")
46
+ ```
47
+
48
+ The `dig` method is an alias for the `query` method:
49
+ ```ruby
50
+ Flareon.dig("google.com")
51
+ ```
52
+
53
+ Check if a given name is resolvable:
54
+ ```ruby
23
55
  Flareon.resolve?("google.com")
24
56
  # => true
25
57
  ```
26
58
 
59
+ Resolve a given domain to an IP address:
60
+ ```ruby
61
+ Flareon.resolve("google.com")
62
+ # => "172.217.1.46"
63
+ ```
64
+
65
+ Resolve a given domain to an IPv4 address:
66
+ ```ruby
67
+ Flareon.resolve("google.com")
68
+ Flareon.resolve("google.com", type: "A")
69
+ Flareon.resolve("google.com", type: 1)
70
+ ```
71
+
72
+ Resolve a given domain to an IPv6 address:
73
+ ```ruby
74
+ Flareon.resolve("google.com", type: "AAAA")
75
+ Flareon.resolve("google.com", type: 28)
76
+ ```
77
+
78
+ Resolve a give domain to all IPv4 and IPv6 addresses:
79
+ ```ruby
80
+ ip_address = Flareon.resolve_all("google.com")
81
+
82
+ # or
83
+
84
+ Flareon.resolve_all("google.com") do |ip_address|
85
+ # do something with each ip_address
86
+ puts ip_address
87
+ end
88
+ ```
89
+
90
+ ## Inspiration
91
+
92
+ Saw [hrbrmstr](https://github.com/hrbrmstr) working on [dnsflare](https://github.com/hrbrmstr/dnsflare) and wanted something similiar in Ruby.
93
+
27
94
  ## License
28
95
 
29
96
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
Binary file
@@ -2,11 +2,35 @@ require "httparty"
2
2
  require "flareon/version"
3
3
 
4
4
  module Flareon
5
+ # Base URL for cloudflare's DNS over HTTPs endpoint.
5
6
  URL = "https://cloudflare-dns.com/dns-query".freeze
7
+ # Special *ct* value to add to every query.
6
8
  CT = "application/dns-json".freeze
9
+ # Header sent in every query.
7
10
  HEADER = {'Content-Type': 'application/json'}
8
-
9
- def self.resolve(name, type: "A", json: false)
11
+
12
+ # Query the DNS over HTTPs endpoint.
13
+ #
14
+ # == IPv4 DNS query
15
+ # result = Flareon.query("google.com")
16
+ # # or
17
+ # result = Flareon.query("google.com", type: "A")
18
+ # # or
19
+ # result = Flareon.query("google.com", type: 1)
20
+ #
21
+ # == IPv6 DNS query
22
+ # result = Flareon.query("google.com", type: "AAAA")
23
+ # # or
24
+ # result = Flareon.query("google.com", type: 28)
25
+ #
26
+ # == Mail exchange record query
27
+ # result = Flareon.query("google.com", type: "MX")
28
+ # # or
29
+ # result = Flareon.query("google.com", type: 15)
30
+ # == Raw JSON response ( not parsed )
31
+ # result = Flareon.query("google.com", json: true)
32
+ #
33
+ def self.query(name, type: "A", json: false)
10
34
  buffer = StringIO.new
11
35
  query = { name: name, type: type, ct: CT }
12
36
  response = HTTParty.get(URL, stream_body: true, query: query, headers: HEADER) do |fragment|
@@ -24,10 +48,80 @@ module Flareon
24
48
  end
25
49
  end
26
50
 
51
+ # Alias the query method with both nslookup and dig.
52
+ # This keeps a similiar API to: github.com/hrbrmstr/dnsflare
53
+ class << self
54
+ alias nslookup query
55
+ alias dig query
56
+ end
57
+
58
+ # Check if a given domain name is resolvable to an IPv4 or IPv6 address.
27
59
  def self.resolve?(name, type: "A", json: false)
28
- Flareon.resolve(name, type: type, json: json)
29
- return true
60
+ Flareon.resolve_all(name) do |ip|
61
+ return true
62
+ end
63
+ false
30
64
  rescue
31
65
  return false
32
66
  end
67
+
68
+ # Resolve a given domain name to a IP address.
69
+ def self.resolve(name, type: "A")
70
+ unless type == "A" || type == "AAAA"
71
+ raise "Unsupported resolve type!"
72
+ end
73
+ resp = Flareon.query(name, type: type)
74
+ if resp["Status"] == 0
75
+ return resp["Answer"][0]["data"]
76
+ else
77
+ raise resp
78
+ end
79
+ end
80
+
81
+ # Resolve a given domain name to all addresses (IPv4/IPv6).
82
+ #
83
+ # == Resolve all IP addresses
84
+ # results = Flareon.resolve_all("google.com")
85
+ # # or
86
+ # results = Flareon.resolve_all("google.com", type: :both)
87
+ # # or
88
+ # Flareon.resolve_all("google.com") do |ip_address|
89
+ # # do something with the ip_address
90
+ # puts ip_address
91
+ # end
92
+ # == Resolve all IPv4 addresses
93
+ # results = Flareon.resolve_all("google.com", type: 1)
94
+ # # or
95
+ # results = Flareon.resolve_all("google.com", type: "A")
96
+ #
97
+ def self.resolve_all(name, type: :both)
98
+ unless type == "A" || type == "AAAA" || type == :both
99
+ raise "Unsupported resolve type!"
100
+ end
101
+ results = [] unless block_given?
102
+ case type
103
+ when "A", "AAAA"
104
+ resp = Flareon.query(name, type: type)
105
+ if resp["Status"] == 0
106
+ resp["Answer"].each do |answer|
107
+ if block_given?
108
+ yield answer["data"]
109
+ else
110
+ results << answer["data"]
111
+ end
112
+ end
113
+ else
114
+ raise resp
115
+ end
116
+ when :both
117
+ if block_given?
118
+ Flareon.resolve_all(name, type: "A") { |ip| yield ip }
119
+ Flareon.resolve_all(name, type: "AAAA") { |ip| yield ip }
120
+ else
121
+ Flareon.resolve_all(name, type: "A") { |ip| results << ip }
122
+ Flareon.resolve_all(name, type: "AAAA") { |ip| results << ip }
123
+ end
124
+ end
125
+ return results unless block_given?
126
+ end
33
127
  end
@@ -1,3 +1,3 @@
1
1
  module Flareon
2
- VERSION = "1.0.0"
2
+ VERSION = "1.0.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flareon
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kent 'picat' Gruber
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-04-01 00:00:00.000000000 Z
11
+ date: 2018-04-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -86,6 +86,7 @@ files:
86
86
  - bin/setup
87
87
  - examples/debug.rb
88
88
  - flareon.gemspec
89
+ - flareon.png
89
90
  - lib/flareon.rb
90
91
  - lib/flareon/version.rb
91
92
  homepage: https://github.com/picatz/flareon