porkbun 0.1.1 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/README.md +41 -6
- data/bin/porkbun +72 -0
- data/lib/porkbun/version.rb +1 -1
- data/lib/porkbun.rb +20 -2
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bfab2dd7301e980ef4e44f2db8579b6797cf18371863b295d904ba1129720b31
|
4
|
+
data.tar.gz: 18c9df86bbbf47ad1a7cf4d9c2805a63195f17ee87edb79abb95492ca82023af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9fd355b2102b8ad2352e6e389c103877e3b4cea191d4d88420be4f6460755b30541ee67def037bed4b9f0192b5e6afa8b84bc5fd3df3e77059e37ec67ee8cd45
|
7
|
+
data.tar.gz: 1f1b61ce3edb87a0d846c8f7e5089d4d02619e9bf07334c8b9da93903a424650eed89416e057199a4250a72fa88590262d354b79069b7086ca3a10bebe9d1f2d
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -9,15 +9,50 @@ Reference: https://porkbun.com/api/json/v3/documentation
|
|
9
9
|
## Usage
|
10
10
|
|
11
11
|
```ruby
|
12
|
-
|
13
|
-
|
12
|
+
ENV['PORKBUN_API_KEY'] = 'YOUR_API_KEY'
|
13
|
+
ENV['PORKBUN_SECRET_API_KEY'] = 'YOUR_SECRET_API_KEY'
|
14
14
|
record = Porkbun::DNS.create(name: 'test',
|
15
|
-
type: 'A',
|
16
|
-
content: '1.1.1.1',
|
17
|
-
ttl: 300
|
15
|
+
type: 'A',
|
16
|
+
content: '1.1.1.1',
|
17
|
+
ttl: 300
|
18
18
|
)
|
19
19
|
```
|
20
20
|
|
21
|
+
## API
|
22
|
+
|
23
|
+
### `Porkbun::Domain.ping`
|
24
|
+
|
25
|
+
Make sure your keys are good.
|
26
|
+
|
27
|
+
### `Porkbun::DNS.retrieve(domain, id)`
|
28
|
+
|
29
|
+
Retrive all or specific record for a domain
|
30
|
+
|
31
|
+
### `Porkbun::DNS.create(options)`
|
32
|
+
|
33
|
+
Create record for a domain
|
34
|
+
|
35
|
+
options:
|
36
|
+
- `name` - name of record. example `www`
|
37
|
+
- `type` - record type. example: CNAME
|
38
|
+
- `content` - content of record. example '1.1.1.1',
|
39
|
+
- `ttl` - time to live. example: 600. porkbun seems to have this as a minimum
|
40
|
+
- `prio` - record priority. mainly for MX records. example 10.
|
41
|
+
|
42
|
+
returns instance of DNS which can be used to delete
|
43
|
+
|
44
|
+
## CLI
|
45
|
+
|
46
|
+
The gem also comes with a CLI
|
47
|
+
|
48
|
+
$ porkbun
|
49
|
+
Commands:
|
50
|
+
porkbun delete_all <domain> # deletes all records for a domain. this is destructive. use with caution
|
51
|
+
porkbun help [COMMAND] # Describe available commands or one specific command
|
52
|
+
porkbun import <file> # Import BIND zone file
|
53
|
+
porkbun list # List all domains
|
54
|
+
porkbun retrieve <domain> [<id>] # List all records for a domain
|
55
|
+
|
21
56
|
## Development
|
22
57
|
|
23
58
|
After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -26,4 +61,4 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
26
61
|
|
27
62
|
## Contributing
|
28
63
|
|
29
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/danielb2/porkbun.
|
64
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/danielb2/porkbun-ruby.
|
data/bin/porkbun
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'porkbun'
|
5
|
+
require 'thor'
|
6
|
+
|
7
|
+
class CLI < Thor
|
8
|
+
desc 'import <file>', 'Import BIND zone file'
|
9
|
+
def import(file)
|
10
|
+
record_regex = /^(?<hostname>[^\s]+)\.\s+(?<ttl>\d+)\s+IN\s+(?<type>[^\s]+)\s*(?<priority>\d+)?\s+(?<content>.+)$/
|
11
|
+
IO.readlines(file).each do |line|
|
12
|
+
match_data = line.match(record_regex)
|
13
|
+
next unless match_data
|
14
|
+
|
15
|
+
domain = match_data[:hostname].split('.')[-2..].join('.').chomp '.'
|
16
|
+
name = match_data[:hostname].split('.')[0..-3].join('.')
|
17
|
+
|
18
|
+
options = {
|
19
|
+
domain:,
|
20
|
+
name:,
|
21
|
+
ttl: match_data[:ttl],
|
22
|
+
type: match_data[:type],
|
23
|
+
prio: match_data[:priority],
|
24
|
+
content: match_data[:content].chomp('.').gsub(/^"|"$/, '')
|
25
|
+
}.compact
|
26
|
+
|
27
|
+
record = Porkbun::DNS.create options
|
28
|
+
pp record
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
desc 'list', 'List all domains'
|
33
|
+
def list
|
34
|
+
Porkbun::Domain.list_all[:domains].each do |domain|
|
35
|
+
puts domain[:domain]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
desc 'delete_all <domain>', 'deletes all records for a domain. this is destructive. use with caution'
|
40
|
+
def delete_all(domain, id = '')
|
41
|
+
records = get_all(domain, id)
|
42
|
+
records.each do |record|
|
43
|
+
next if record.type == 'NS'
|
44
|
+
|
45
|
+
puts "DELETE #{record}"
|
46
|
+
record.delete
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
desc 'retrieve <domain> [<id>]', 'List all records for a domain'
|
51
|
+
def retrieve(domain, id = '')
|
52
|
+
records = get_all(domain, id)
|
53
|
+
puts records
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.exit_on_failure?
|
57
|
+
exit 1
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def get_all(domain, id = '')
|
63
|
+
records = Porkbun::DNS.retrieve(domain, id)
|
64
|
+
if records.instance_of?(Porkbun::Error)
|
65
|
+
puts records.message
|
66
|
+
exit 1
|
67
|
+
end
|
68
|
+
records
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
CLI.start(ARGV)
|
data/lib/porkbun/version.rb
CHANGED
data/lib/porkbun.rb
CHANGED
@@ -7,7 +7,6 @@ module Porkbun
|
|
7
7
|
class Error < StandardError; end
|
8
8
|
|
9
9
|
def self.porkbun(path, options = {})
|
10
|
-
pp path
|
11
10
|
res = HTTP.post File.join('https://porkbun.com/api/json/v3', path), json: {
|
12
11
|
secretapikey: ENV.fetch('PORKBUN_SECRET_API_KEY', nil),
|
13
12
|
apikey: ENV.fetch('PORKBUN_API_KEY', nil)
|
@@ -65,6 +64,8 @@ module Porkbun
|
|
65
64
|
raise Error, 'need domain' unless domain
|
66
65
|
|
67
66
|
res = Porkbun.porkbun File.join('dns/retrieve', domain, id || '').chomp('/')
|
67
|
+
return Error.new(res[:message]) if res[:status] == 'ERROR'
|
68
|
+
|
68
69
|
res[:records].map do |record|
|
69
70
|
DNS.new record.merge(domain:)
|
70
71
|
end
|
@@ -78,13 +79,30 @@ module Porkbun
|
|
78
79
|
self
|
79
80
|
end
|
80
81
|
|
82
|
+
require 'pry'
|
83
|
+
def to_s
|
84
|
+
content_str = case type
|
85
|
+
when /TXT|SPF/
|
86
|
+
"\"#{content}\""
|
87
|
+
when /MX|CNAME|NS/
|
88
|
+
"#{content}."
|
89
|
+
else
|
90
|
+
String(content)
|
91
|
+
end
|
92
|
+
|
93
|
+
prio_str = prio == '0' ? '' : prio
|
94
|
+
"#{name}. #{ttl} IN #{type} #{prio_str} #{content_str}".tr_s(' ', ' ')
|
95
|
+
end
|
96
|
+
|
81
97
|
def create
|
82
|
-
|
98
|
+
options = {
|
83
99
|
name:,
|
84
100
|
content:,
|
85
101
|
type:,
|
86
102
|
ttl:
|
87
103
|
}
|
104
|
+
options.merge!(prio:) if prio
|
105
|
+
res = Porkbun.porkbun File.join('dns/create', domain), options
|
88
106
|
parse_response res
|
89
107
|
@id = res[:id]
|
90
108
|
self
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: porkbun
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Bretoi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-09-
|
11
|
+
date: 2023-09-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: http
|
@@ -27,7 +27,8 @@ dependencies:
|
|
27
27
|
description: Porkbun API wrapper for Ruby.
|
28
28
|
email:
|
29
29
|
- daniel@otherware.org
|
30
|
-
executables:
|
30
|
+
executables:
|
31
|
+
- porkbun
|
31
32
|
extensions: []
|
32
33
|
extra_rdoc_files: []
|
33
34
|
files:
|
@@ -35,6 +36,7 @@ files:
|
|
35
36
|
- Gemfile
|
36
37
|
- README.md
|
37
38
|
- Rakefile
|
39
|
+
- bin/porkbun
|
38
40
|
- lib/porkbun.rb
|
39
41
|
- lib/porkbun/version.rb
|
40
42
|
- sig/porkbun.rbs
|