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 +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +69 -2
- data/flareon.png +0 -0
- data/lib/flareon.rb +98 -4
- data/lib/flareon/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1e500b30389aad18ef70b1c0b15fcd6ea7c3fe0d629eb51ef53f0e192b6c5758
|
4
|
+
data.tar.gz: 53721d0eb570b20d56b12e036dfd148f0212596d97193c2356662c6f76774d2c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9efdbe774d2f0ceeeb533e118dccb3af36b3c21728cdf48a0acca17b3294016793fabece71a9ffc513bdfcaaa2446a4265ddba7d66b6da07f904c29ba6c94c2f
|
7
|
+
data.tar.gz: 074e44b83f6fc9301fcc36886393353a9344de613d0390b751b3b5ddb8f7c1cb2f2c712d5532d4f99e62024160271579287155bc04ca8a960a89728795bfa6c8
|
data/Gemfile.lock
CHANGED
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.
|
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).
|
data/flareon.png
ADDED
Binary file
|
data/lib/flareon.rb
CHANGED
@@ -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
|
-
|
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.
|
29
|
-
|
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
|
data/lib/flareon/version.rb
CHANGED
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.
|
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-
|
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
|