flareon 1.0.0 → 1.0.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
  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