dnsmadeeasy 0.1.1 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +242 -84
- data/dnsmadeeasy.gemspec +15 -0
- data/exe/dme +5 -4
- data/lib/dme.rb +4 -0
- data/lib/dnsmadeeasy.rb +9 -3
- data/lib/dnsmadeeasy/api/client.rb +79 -30
- data/lib/dnsmadeeasy/credentials.rb +10 -9
- data/lib/dnsmadeeasy/runner.rb +205 -0
- data/lib/dnsmadeeasy/version.rb +1 -1
- metadata +37 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f3fe4a8e5e7490cd827fe1c39b7cb9eec1458ee6
|
4
|
+
data.tar.gz: 6b3f939c99808e319bcd77a4f77f34a456a3957f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ceed4e0e1ac07e7047ba55b39e723c6203c050add20167419f200ef2be3c513400b6a9b628c496bf7ab5e6177cd52be072213fcaa7edecf231bd0c19772b8613
|
7
|
+
data.tar.gz: 5d33110950c9d523d9c7a25bd4f57f3cef57f42a788d8f138374d67dfb1bbf991850f3133b0e994c79c6c08a7ec9bd136b2b48736193a1a08b37550cba80abb9
|
data/README.md
CHANGED
@@ -18,28 +18,28 @@ Once you have the key and the secret, you have several choices:
|
|
18
18
|
|
19
19
|
1. Perhaps the most conveniently, you can store them in a small YAML file, that must be placed in a specific location within your home folder: `~/.dnsmadeeasy/credentials.yml`. The file should look like this one below (NOTE: these are not real credentials, btw):
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
21
|
+
```yaml
|
22
|
+
# file: ~/.dnsmadeeasy/credentials.yml
|
23
|
+
credentials:
|
24
|
+
api_key: 2062259f-f666b17-b1fa3b48-042ad4030
|
25
|
+
api_secret: 2265bc3-e31ead-95b286312e-c215b6a0
|
26
|
+
```
|
27
27
|
|
28
|
-
|
28
|
+
With this file existing, you can query right away, by using the shortcut module `DME`, such as
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
30
|
+
```ruby
|
31
|
+
require 'dme'
|
32
|
+
DME.domains.data.first.name #=> 'moo.gamespot.com'
|
33
|
+
```
|
34
34
|
|
35
35
|
2. Or, you can directly instantiate a new instance of the `Client` class, by passing your API key and API secrets as arguments:
|
36
36
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
37
|
+
```ruby
|
38
|
+
require 'dnsmadeeasy'
|
39
|
+
@client = DnsMadeEasy::Api::Client.new(api_key, api_secret)
|
40
|
+
```
|
41
41
|
|
42
|
-
|
42
|
+
The advantage of this method is that you can query multiple DnsMadeEasy accounts from the same Ruby VM. With other methods, only one account can be connected to.
|
43
43
|
|
44
44
|
3. Or, you can use the `DnsMadeEasy.configure` method to configure the key/secret pair, and then use `DnsMadeEasy` namespace to call the methods:
|
45
45
|
|
@@ -54,25 +54,40 @@ Once you have the key and the secret, you have several choices:
|
|
54
54
|
DnsMadeEasy.domains.data.first.name #=> 'moo.gamespot.com'
|
55
55
|
```
|
56
56
|
|
57
|
-
###
|
57
|
+
### Which Namespace to Use? What is `DME` versus `DnsMadeEasy`?
|
58
|
+
|
59
|
+
Since `DnsMadeEasy` is a bit of a mouthful, we decided to offer (in addition to the standard `DnsMadeEasy` namespace) the abbreviated module `DME` that simply forwards all messages to the module `DnsMadeEasy`. If in your Ruby VM there is no conflicting top-level class `DME`, then you can `require 'dnsmadeeasy/dme'` to get all of the DnsMadeEasy client library functionality without having to type the full name once. You can even do `require 'dme'`.
|
58
60
|
|
59
|
-
|
61
|
+
Whenever you require `dme` you also import the `DnsMadeEasy` namespace. **The opposite is not true.**
|
60
62
|
|
61
|
-
|
63
|
+
So if you DO have a name clash with another top-level module `DME`, simply do `require 'dnsmadeeasy'` and none of the `DME` module namespace will be loaded.
|
62
64
|
|
65
|
+
In a nutshell you have three ways to access all methods provided by the [`DnsMadeEasy::Api::Client`](http://www.rubydoc.info/gems/dnsmadeeasy/DnsMadeEasy/Api/Client) class:
|
66
|
+
|
67
|
+
1. Instantiate and use the client class directly,
|
68
|
+
2. Use the top-level module `DnsMadeEasy` with `require 'dnsmadeeasy'`
|
69
|
+
3. Use the shortened top-level module `DME` with `require 'dnsmadeeasy/dme'`
|
63
70
|
|
64
71
|
### Examples
|
65
72
|
|
66
|
-
If you are
|
73
|
+
If you are planning on accessing *only one DnsMadeEasy account from the same Ruby VM*, it's recommended that you save your credentials (the API key and the secret) in the above mentioned file `~/.dnsmadeeasy/credentials.yml`.
|
67
74
|
|
68
|
-
|
75
|
+
___
|
69
76
|
|
77
|
+
> **NOTE:**
|
78
|
+
>
|
79
|
+
> * DO NOT check that file into your repo!
|
80
|
+
> * The examples that follow assume credentials have been read from that file.
|
70
81
|
|
71
|
-
|
82
|
+
___
|
72
83
|
|
84
|
+
Using the `DME` module (or `DnsMadeEasy` if you prefer) you can access all of your records through the available API method calls, for example:
|
73
85
|
|
74
|
-
|
75
|
-
IRB
|
86
|
+
```ruby
|
87
|
+
IRB > require 'dme' #=> true
|
88
|
+
# Or you can also do
|
89
|
+
IRB > require 'dnsmadeeasy/dme' #=> true
|
90
|
+
IRB > DME.domains.data.map(&:name)
|
76
91
|
⤷ ["demo.gamespot.systems",
|
77
92
|
"dev.gamespot.systems",
|
78
93
|
"gamespot.live",
|
@@ -80,41 +95,86 @@ IRB(main):003:0> DME.domains.data.map(&:name)
|
|
80
95
|
"prod.gamespot.systems"
|
81
96
|
]
|
82
97
|
|
83
|
-
|
98
|
+
# These have been read from the file ~/.dnsmadeeasy/credentials.yml
|
99
|
+
IRB > DME.api_key
|
84
100
|
⤷ "2062259f-f666b17-b1fa3b48-042ad4030"
|
85
101
|
|
86
|
-
IRB
|
102
|
+
IRB > DME.api_secret
|
87
103
|
⤷ "2265bc3-e31ead-95b286312e-c215b6a0"
|
104
|
+
|
105
|
+
IRB > DME.domain('gamespot.live').delegateNameServers
|
106
|
+
⤷ #<Hashie::Array ["ns-125-c.gandi.net.", "ns-129-a.gandi.net.", "ns-94-b.gandi.net."]>
|
88
107
|
|
89
|
-
|
108
|
+
# Let's inspect the Client — after all, all methods are simply delegated to it:
|
109
|
+
IRB > @client = DME.client
|
90
110
|
⤷ #<DnsMadeEasy::Api::Client:0x00007fb6b416a4c8
|
91
111
|
@api_key="2062259f-f666b17-b1fa3b48-042ad4030",
|
92
112
|
@api_secret="2265bc3-e31ead-95b286312e-c215b6a0",
|
93
113
|
@options={},
|
94
114
|
@requests_remaining=149,
|
95
115
|
@request_limit=150,
|
96
|
-
@base_uri="https://api.dnsmadeeasy.com/V2.0">
|
116
|
+
@base_uri="https://api.dnsmadeeasy.com/V2.0">
|
97
117
|
```
|
98
118
|
|
99
|
-
|
119
|
+
Next, let's fetch a particular domain, get it's records and compute the counts for each record type, such as 'A', 'NS', etc.
|
100
120
|
|
101
|
-
|
121
|
+
```ruby
|
122
|
+
IRB > records = DME.records_for('gamespot.com')
|
123
|
+
IRB > [ records.totalPages, records.totalRecords ]
|
124
|
+
⤷ [1, 33]
|
125
|
+
IRB > records.data.select{|f| f.type == 'A' }.map(&:name)
|
126
|
+
⤷ ["www", "vpn-us-east1", "vpn-us-east2", "staging", "yourmom"]
|
127
|
+
IRB > types = records.data.map(&:type)
|
128
|
+
⤷ [....]
|
129
|
+
IRB > require 'awesome_print'
|
130
|
+
IRB > ap Hash[types.group_by {|x| x}.map {|k,v| [k,v.count]}]
|
131
|
+
{
|
132
|
+
"MX" => 2,
|
133
|
+
"TXT" => 1,
|
134
|
+
"CNAME" => 3,
|
135
|
+
"NS" => 22,
|
136
|
+
"A" => 5
|
137
|
+
}
|
138
|
+
```
|
139
|
+
|
140
|
+
### Return Value Types
|
141
|
+
|
142
|
+
All public methods of this library return a Hash-like object, that is actually an instance of the class [`Hashie::Mash`](https://github.com/intridea/hashie). `Hashie::Mash` supports the very useful ability to reach deeply nested hash values via a chain of method calls instead of using a train of square brackets. You can always convert it to a regular hash either `to_hash` or `to_h` on an instance of a `Hashie::Mash` to get a pure hash representation.
|
102
143
|
|
103
|
-
|
144
|
+
> NOTE: `to_hash` converts the entire object to a regular hash, including the deeply nested hashes, while `to_h` only converts the primary object, but not the nested hashes. Here is an example below — in the first instance where we call `to_h` we are still able to call `.value` on the nested object, because only the top-level `Mash` has been converted into a `Hash`. In the second example, this call fails, because this method does not exist, and the value must be accessed via the square brackets:
|
145
|
+
>
|
146
|
+
> ```ruby
|
147
|
+
> IRB > recs.to_h['data'].last.value
|
148
|
+
> ⤷ "54.200.26.233"
|
149
|
+
> IRB > recs.to_hash['data'].last.value
|
150
|
+
> "NoMethodError: undefined method `value` for #<Hash:0x00007fe36fab0f68>"
|
151
|
+
> IRB > recs.to_hash['data'].last['value']
|
152
|
+
> ⤷ "54.200.26.233"
|
153
|
+
> ```
|
104
154
|
|
105
155
|
For more information on the actual JSON API, please refer to the [following PDF document](http://www.dnsmadeeasy.com/integration/pdf/API-Docv2.pdf).
|
106
156
|
|
107
|
-
##
|
157
|
+
## Available Actions
|
108
158
|
|
109
159
|
Here is the complete of all methods supported by the `DnsMadeEasy::Api::Client`:
|
110
160
|
|
111
|
-
|
161
|
+
#### Domains
|
162
|
+
|
163
|
+
* `create_domain`
|
164
|
+
* `create_domains`
|
165
|
+
* `delete_domain`
|
166
|
+
* `domain`
|
167
|
+
* `domains`
|
168
|
+
* `get_id_by_domain`
|
169
|
+
|
170
|
+
#### Records
|
171
|
+
|
172
|
+
* `records_for`
|
173
|
+
* `all`
|
112
174
|
* `base_uri`
|
113
175
|
* `create_a_record`
|
114
176
|
* `create_aaaa_record`
|
115
177
|
* `create_cname_record`
|
116
|
-
* `create_domain`
|
117
|
-
* `create_domains`
|
118
178
|
* `create_httpred_record`
|
119
179
|
* `create_mx_record`
|
120
180
|
* `create_ns_record`
|
@@ -124,54 +184,143 @@ Here is the complete of all methods supported by the `DnsMadeEasy::Api::Client`:
|
|
124
184
|
* `create_srv_record`
|
125
185
|
* `create_txt_record`
|
126
186
|
* `delete_all_records`
|
127
|
-
* `delete_domain`
|
128
187
|
* `delete_record`
|
129
188
|
* `delete_records`
|
130
|
-
* `
|
131
|
-
* `
|
132
|
-
* `
|
133
|
-
* `find`
|
134
|
-
* `get_id_by_domain`
|
135
|
-
* `records_for`
|
136
|
-
* `request_limit`
|
137
|
-
* `requests_remaining`
|
138
|
-
* `update_record`
|
139
|
-
* `update_records`
|
189
|
+
* `find_all`
|
190
|
+
* `find_first`
|
191
|
+
* `find_record_ids`
|
140
192
|
|
193
|
+
## CLI Client
|
194
|
+
|
195
|
+
This library offers a simple CLI client `dme` that maps the command line arguments to method arguments for corresponding actions:
|
196
|
+
|
197
|
+
```bash
|
198
|
+
❯ dme --help
|
199
|
+
Usage:
|
200
|
+
# Execute an API call:
|
201
|
+
dme [ --json | --yaml ] operation [ arg1 arg2 ... ]
|
202
|
+
|
203
|
+
# Print suported operations:
|
204
|
+
dme op[erations]
|
205
|
+
|
206
|
+
Credentials:
|
207
|
+
Store your credentials in a YAML file
|
208
|
+
/Users/kig/.dnsmadeeasy/credentials.yml as follows:
|
209
|
+
|
210
|
+
credentials:
|
211
|
+
api_key: XXXX
|
212
|
+
api_secret: YYYY
|
213
|
+
|
214
|
+
Examples:
|
215
|
+
dme domain moo.com
|
216
|
+
dme --json domain moo.com
|
217
|
+
dme find_all moo.com A www
|
218
|
+
dme find_first moo.com CNAME vpn-west
|
219
|
+
dme --yaml find_first moo.com CNAME vpn-west
|
220
|
+
```
|
221
|
+
|
222
|
+
You can run `dme operations` to see the supported list of operations:
|
223
|
+
|
224
|
+
```bash
|
225
|
+
❯ dme op
|
226
|
+
Actions:
|
227
|
+
Checkout the README and RubyDoc for the arguments to each operation,
|
228
|
+
which is basically a method on a DnsMadeEasy::Api::Client instance.
|
229
|
+
http://www.rubydoc.info/gems/dnsmadeeasy/DnsMadeEasy/Api/Client
|
230
|
+
|
231
|
+
Valid Operations Are:
|
232
|
+
all
|
233
|
+
base_uri
|
234
|
+
create_a_record
|
235
|
+
create_aaaa_record
|
236
|
+
create_cname_record
|
237
|
+
create_domain
|
238
|
+
create_domains
|
239
|
+
create_httpred_record
|
240
|
+
create_mx_record
|
241
|
+
create_ns_record
|
242
|
+
create_ptr_record
|
243
|
+
create_record
|
244
|
+
create_spf_record
|
245
|
+
create_srv_record
|
246
|
+
create_txt_record
|
247
|
+
delete_all_records
|
248
|
+
delete_domain
|
249
|
+
delete_record
|
250
|
+
delete_records
|
251
|
+
domain
|
252
|
+
domains
|
253
|
+
find_all
|
254
|
+
find_first
|
255
|
+
find_record_ids
|
256
|
+
get_id_by_domain
|
257
|
+
records_for
|
258
|
+
update_record
|
259
|
+
update_records
|
260
|
+
```
|
261
|
+
|
262
|
+
For example:
|
263
|
+
|
264
|
+
```bash
|
265
|
+
❯ dme domains moo.com
|
266
|
+
```
|
267
|
+
|
268
|
+
is equivalent to `DME.domains("moo.com")`. You can use any operation listed above, and output the result in either `YAML` or `JSON` (in addition to the default "awesome_print"), for example:
|
269
|
+
|
270
|
+
```bash
|
271
|
+
❯ dme --yaml find_all moo.com www CNAME
|
272
|
+
---
|
273
|
+
- dynamicDns: false
|
274
|
+
failed: false
|
275
|
+
gtdLocation: DEFAULT
|
276
|
+
hardLink: false
|
277
|
+
ttl: 60
|
278
|
+
failover: false
|
279
|
+
monitor: false
|
280
|
+
sourceId: 5861234
|
281
|
+
source: 1
|
282
|
+
name: www
|
283
|
+
value: ec2-54-202-251-7.us-west-2.compute.amazonaws.com
|
284
|
+
id: 43509989
|
285
|
+
type: CNAME
|
286
|
+
```
|
141
287
|
|
142
288
|
### Managing Domains
|
143
289
|
|
290
|
+
> NOTE: below we can be using `@client` instantiated with given key and secret, or
|
291
|
+
> `DME` or `DnsMadeEasy` module.
|
292
|
+
|
144
293
|
To retrieve all domains:
|
145
294
|
|
146
295
|
```ruby
|
147
|
-
|
296
|
+
require 'dnsmadeeasy/dme'
|
297
|
+
DME.domains
|
148
298
|
```
|
149
299
|
|
150
300
|
To retreive the id of a domain by the domain name:
|
151
301
|
|
152
302
|
```ruby
|
153
|
-
|
303
|
+
DME.get_id_by_domain('test.io')
|
154
304
|
```
|
155
305
|
|
156
306
|
To retrieve the full domain record by domain name:
|
157
307
|
|
158
308
|
```ruby
|
159
|
-
|
309
|
+
DME.domain('test.io')
|
160
310
|
```
|
161
311
|
|
162
312
|
To create a domain:
|
163
313
|
|
164
314
|
```ruby
|
165
|
-
|
166
|
-
|
315
|
+
DME.create_domain('test.io')
|
167
316
|
# Multiple domains can be created by:
|
168
|
-
|
317
|
+
DME.create_domains(%w[test.io moo.re])
|
169
318
|
```
|
170
319
|
|
171
320
|
To delete a domain:
|
172
321
|
|
173
322
|
```ruby
|
174
|
-
|
323
|
+
DME.delete_domain ('test.io')
|
175
324
|
```
|
176
325
|
|
177
326
|
### Managing Records
|
@@ -179,62 +328,68 @@ To delete a domain:
|
|
179
328
|
To retrieve all records for a given domain name:
|
180
329
|
|
181
330
|
```ruby
|
182
|
-
|
331
|
+
DME.all('test.io')
|
183
332
|
```
|
184
333
|
|
185
334
|
To find the record id for a given domain, name, and type:
|
186
335
|
|
187
|
-
This finds
|
336
|
+
This finds all of the IDs matching 'woah.test.io' type 'A':
|
188
337
|
|
189
338
|
```ruby
|
190
|
-
|
339
|
+
DME.find_record_ids ('test.io', 'woah', 'A')
|
340
|
+
# => [ 234234, 2342345 ]
|
191
341
|
```
|
192
342
|
|
193
|
-
To delete a record by domain name and record id (the record id can be retrieved from `find_record_id`:
|
194
|
-
|
195
343
|
```ruby
|
196
|
-
|
197
|
-
|
344
|
+
# To delete a record by domain name and record id (the record id can be retrieved from `find_record_id`:
|
345
|
+
DME.delete_record ('test.io', 123)
|
198
346
|
# To delete multiple records:
|
199
|
-
|
200
|
-
@client.delete_records ('test.io', [123, 143])
|
201
|
-
|
347
|
+
DME.delete_records ('test.io', [123, 143])
|
202
348
|
# To delete all records in the domain:
|
349
|
+
DME.delete_all_records ('test.io')
|
350
|
+
```
|
203
351
|
|
204
|
-
|
352
|
+
To create records of various types:
|
353
|
+
|
354
|
+
```ruby
|
355
|
+
# The generic method:
|
356
|
+
DME.create_record ('test.io', 'woah', 'A', '127.0.0.1', { 'ttl' => '60' })
|
357
|
+
|
358
|
+
# Specialized methods:
|
359
|
+
DME.create_a_record ('test.io', 'woah', '127.0.0.1', {})
|
360
|
+
DME.create_aaaa_record ('test.io', 'woah', '127.0.0.1', {})
|
361
|
+
DME.create_ptr_record ('test.io', 'woah', '127.0.0.1', {})
|
362
|
+
DME.create_txt_record ('test.io', 'woah', '127.0.0.1', {})
|
363
|
+
DME.create_cname_record ('test.io', 'woah', '127.0.0.1', {})
|
364
|
+
DME.create_ns_record ('test.io', 'woah', '127.0.0.1', {})
|
365
|
+
DME.create_spf_record ('test.io', 'woah', '127.0.0.1', {})
|
205
366
|
```
|
206
367
|
|
207
|
-
|
368
|
+
#### Specialized Record Types
|
369
|
+
|
370
|
+
Below are the method calls for `MX`, `SRV`, and `HTTPRED` types:
|
208
371
|
|
209
372
|
```ruby
|
210
|
-
@client.create_record ('test.io', 'woah', 'A', '127.0.0.1', { 'ttl' => '60' })
|
211
|
-
@client.create_a_record ('test.io', 'woah', '127.0.0.1', {})
|
212
|
-
@client.create_aaaa_record ('test.io', 'woah', '127.0.0.1', {})
|
213
|
-
@client.create_ptr_record ('test.io', 'woah', '127.0.0.1', {})
|
214
|
-
@client.create_txt_record ('test.io', 'woah', '127.0.0.1', {})
|
215
|
-
@client.create_cname_record ('test.io', 'woah', '127.0.0.1', {})
|
216
|
-
@client.create_ns_record ('test.io', 'woah', '127.0.0.1', {})
|
217
|
-
@client.create_spf_record ('test.io', 'woah', '127.0.0.1', {})
|
218
373
|
# Arguments are: domain_name, name, priority, value, options = {}
|
219
|
-
|
374
|
+
DME.create_mx_record ('test.io', 'woah', 5, '127.0.0.1', {})
|
220
375
|
# Arguments are: domain_name, name, priority, weight, port, value, options = {}
|
221
|
-
|
222
|
-
# Arguments are: domain_name, name, value, redirectType,
|
223
|
-
|
376
|
+
DME.create_srv_record ('test.io', 'woah', 1, 5, 80, '127.0.0.1', {})
|
377
|
+
# Arguments are: domain_name, name, value, redirectType,
|
378
|
+
DME.create_httpred_record('test.io', 'woah', '127.0.0.1', 'STANDARD - 302',
|
379
|
+
# description, keywords, title, options = {}
|
224
380
|
'a description', 'keywords', 'a title', {})
|
225
381
|
```
|
226
382
|
|
227
383
|
To update a record:
|
228
384
|
|
229
385
|
```ruby
|
230
|
-
|
231
|
-
{ 'ttl' => '60' })
|
386
|
+
DME.update_record('test.io', 123, 'woah', 'A', '127.0.1.1', { 'ttl' => '60' })
|
232
387
|
```
|
233
388
|
|
234
389
|
To update several records:
|
235
390
|
|
236
391
|
```ruby
|
237
|
-
|
392
|
+
DME.update_records('test.io',
|
238
393
|
[
|
239
394
|
{ 'id' => 123,
|
240
395
|
'name' => 'buddy',
|
@@ -248,7 +403,7 @@ To update several records:
|
|
248
403
|
To get the number of API requests remaining after a call:
|
249
404
|
|
250
405
|
```ruby
|
251
|
-
|
406
|
+
DME.requests_remaining
|
252
407
|
#=> 19898
|
253
408
|
```
|
254
409
|
> NOTE: Information is not available until an API call has been made
|
@@ -256,10 +411,11 @@ To get the number of API requests remaining after a call:
|
|
256
411
|
To get the API request total limit after a call:
|
257
412
|
|
258
413
|
```ruby
|
259
|
-
|
414
|
+
DME.request_limit
|
260
415
|
#=> 2342
|
261
416
|
```
|
262
|
-
>Information is not available until an API call has been made
|
417
|
+
> NOTE: Information is not available until an API call has been made
|
418
|
+
|
263
419
|
|
264
420
|
## Installation
|
265
421
|
|
@@ -294,7 +450,7 @@ The current maintainer [Konstantin Gredeskoul](https://github.com/kigster) wishe
|
|
294
450
|
|
295
451
|
* Arnoud Vermeer for the original `dnsmadeeasy-rest-api` gem
|
296
452
|
* Andre Arko, Paul Henry, James Hart formerly of [Wanelo](wanelo.com) fame, for bringing the REST API gem up to the level.
|
297
|
-
* Phil Cohen, who graciously transferred the ownership of this gem on RubyGems to the current maintainer.
|
453
|
+
* Phil Cohen, who graciously transferred the ownership of the name of this gem on RubyGems.org to the current maintainer.
|
298
454
|
|
299
455
|
|
300
456
|
## Contributing
|
@@ -304,3 +460,5 @@ Bug reports and pull requests are welcome on GitHub at [https://github.com/kigst
|
|
304
460
|
## License
|
305
461
|
|
306
462
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
463
|
+
|
464
|
+
|
data/dnsmadeeasy.gemspec
CHANGED
@@ -18,6 +18,19 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.email = %w(kigster@gmail.com letuboy@gmail.com hjhart@gmail.com)
|
19
19
|
spec.summary = DnsMadeEasy::DESCRIPTION
|
20
20
|
spec.description = DnsMadeEasy::DESCRIPTION
|
21
|
+
spec.post_install_message = <<-EOF
|
22
|
+
|
23
|
+
Thank you for using the DnsMadeEasy ruby gem, the Ruby client
|
24
|
+
API for DnsMadeEasy.com's SDK v2. Please note that this gem
|
25
|
+
comes with a command line utility 'dme' which you can use
|
26
|
+
instead of the ruby API if you prefer. Run `dme` with no
|
27
|
+
arguments to see the help message.
|
28
|
+
|
29
|
+
You can store your credentials in a YAML file in your home
|
30
|
+
directory. For more information, please see README at:
|
31
|
+
https://github.com/kigster/dnsmadeeasy
|
32
|
+
|
33
|
+
EOF
|
21
34
|
|
22
35
|
spec.homepage = 'https://github.com/kigster/dnsmadeeasy'
|
23
36
|
spec.license = 'MIT'
|
@@ -31,6 +44,8 @@ Gem::Specification.new do |spec|
|
|
31
44
|
spec.require_paths = ['lib']
|
32
45
|
|
33
46
|
spec.add_dependency 'hashie'
|
47
|
+
spec.add_dependency 'colored2'
|
48
|
+
spec.add_dependency 'awesome_print'
|
34
49
|
|
35
50
|
spec.add_development_dependency 'yard'
|
36
51
|
spec.add_development_dependency 'simplecov'
|
data/exe/dme
CHANGED
data/lib/dme.rb
CHANGED
data/lib/dnsmadeeasy.rb
CHANGED
@@ -3,11 +3,12 @@ module DnsMadeEasy
|
|
3
3
|
API_BASE_URL_SANDBOX = 'https://sandboxapi.dnsmadeeasy.com/V2.0'
|
4
4
|
end
|
5
5
|
|
6
|
-
|
7
|
-
|
6
|
+
require 'dnsmadeeasy/credentials'
|
7
|
+
require 'dnsmadeeasy/api/client'
|
8
8
|
|
9
9
|
module DnsMadeEasy
|
10
10
|
class Error < StandardError; end
|
11
|
+
class AuthenticationError < Error; end
|
11
12
|
class APIKeyAndSecretMissingError < Error; end
|
12
13
|
|
13
14
|
class << self
|
@@ -48,8 +49,13 @@ module DnsMadeEasy
|
|
48
49
|
end
|
49
50
|
|
50
51
|
def default!
|
52
|
+
assign_default_credentials
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
def assign_default_credentials
|
51
57
|
if Credentials.exist?
|
52
|
-
self.credentials = Credentials.
|
58
|
+
self.credentials = Credentials.default_credentials_file
|
53
59
|
end
|
54
60
|
end
|
55
61
|
|
@@ -4,27 +4,46 @@ require 'json'
|
|
4
4
|
require 'uri'
|
5
5
|
require 'net/http'
|
6
6
|
require 'hashie/mash'
|
7
|
+
require 'dnsmadeeasy/credentials'
|
7
8
|
|
8
9
|
module DnsMadeEasy
|
9
10
|
module Api
|
10
11
|
class Client
|
11
12
|
|
13
|
+
class << self
|
14
|
+
def public_operations
|
15
|
+
(new('a', 'b').methods - Object.methods).map(&:to_s).reject { |r| r =~ /[=]$|^(api_|on_|request)/ }.sort
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
12
19
|
attr_accessor :base_uri
|
13
|
-
attr_reader :requests_remaining
|
14
|
-
|
20
|
+
attr_reader :requests_remaining,
|
21
|
+
:request_limit,
|
22
|
+
:api_key,
|
23
|
+
:api_secret
|
15
24
|
|
16
25
|
|
17
26
|
def initialize(api_key, api_secret, sandbox = false, options = {})
|
18
27
|
fail 'api_key is undefined' unless api_key
|
19
28
|
fail 'api_secret is undefined' unless api_secret
|
20
29
|
|
21
|
-
@api_key
|
22
|
-
@api_secret
|
23
|
-
@options
|
30
|
+
@api_key = api_key
|
31
|
+
@api_secret = api_secret
|
32
|
+
@options = options
|
24
33
|
@requests_remaining = -1
|
25
|
-
@request_limit
|
34
|
+
@request_limit = -1
|
35
|
+
|
36
|
+
sandbox ? on_sandbox : on_production
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
def on_sandbox(&block)
|
41
|
+
with_url(::DnsMadeEasy::API_BASE_URL_SANDBOX, &block)
|
42
|
+
end
|
43
|
+
|
26
44
|
|
27
|
-
|
45
|
+
def on_production(&block)
|
46
|
+
with_url(::DnsMadeEasy::API_BASE_URL_PRODUCTION, &block)
|
28
47
|
end
|
29
48
|
|
30
49
|
|
@@ -71,15 +90,25 @@ module DnsMadeEasy
|
|
71
90
|
end
|
72
91
|
|
73
92
|
|
74
|
-
|
93
|
+
alias all records_for
|
94
|
+
|
95
|
+
|
96
|
+
def find_all(domain_name, name, type)
|
75
97
|
records = records_for(domain_name)
|
76
|
-
|
98
|
+
return nil unless records
|
99
|
+
records['data'].select { |r| r['name'] == name && r['type'] == type }
|
77
100
|
end
|
78
101
|
|
79
102
|
|
80
|
-
def
|
103
|
+
def find_first(domain_name, name, type)
|
81
104
|
records = records_for(domain_name)
|
105
|
+
return nil unless records
|
106
|
+
records['data'].detect { |r| r['name'] == name && r['type'] == type }
|
107
|
+
end
|
82
108
|
|
109
|
+
|
110
|
+
def find_record_ids(domain_name, name, type)
|
111
|
+
records = records_for(domain_name)
|
83
112
|
records['data'].select { |r| r['name'] == name && r['type'] == type }.map { |r| r['id'] }
|
84
113
|
end
|
85
114
|
|
@@ -109,6 +138,8 @@ module DnsMadeEasy
|
|
109
138
|
end
|
110
139
|
|
111
140
|
|
141
|
+
# Specific record types
|
142
|
+
|
112
143
|
def create_a_record(domain_name, name, value, options = {})
|
113
144
|
# TODO: match IPv4 for value
|
114
145
|
create_record domain_name, name, 'A', value, options
|
@@ -178,12 +209,12 @@ module DnsMadeEasy
|
|
178
209
|
def update_records(domain, records, options = {})
|
179
210
|
body = records.map do |record|
|
180
211
|
{
|
181
|
-
'id'
|
182
|
-
'name'
|
183
|
-
'type'
|
184
|
-
'value'
|
212
|
+
'id' => record['id'],
|
213
|
+
'name' => record['name'],
|
214
|
+
'type' => record['type'],
|
215
|
+
'value' => record['value'],
|
185
216
|
'gtdLocation' => record['gtdLocation'],
|
186
|
-
'ttl'
|
217
|
+
'ttl' => record['ttl']
|
187
218
|
}.merge(options)
|
188
219
|
end
|
189
220
|
put "/dns/managed/#{get_id_by_domain(domain)}/records/updateMulti/", body
|
@@ -201,7 +232,7 @@ module DnsMadeEasy
|
|
201
232
|
|
202
233
|
def delete(path, body = nil)
|
203
234
|
request(path) do |uri|
|
204
|
-
req
|
235
|
+
req = Net::HTTP::Delete.new(uri)
|
205
236
|
req.body = body.to_json if body
|
206
237
|
req
|
207
238
|
end
|
@@ -210,7 +241,7 @@ module DnsMadeEasy
|
|
210
241
|
|
211
242
|
def put(path, body = nil)
|
212
243
|
request(path) do |uri|
|
213
|
-
req
|
244
|
+
req = Net::HTTP::Put.new(uri)
|
214
245
|
req.body = body.to_json if body
|
215
246
|
req
|
216
247
|
end
|
@@ -219,7 +250,7 @@ module DnsMadeEasy
|
|
219
250
|
|
220
251
|
def post(path, body)
|
221
252
|
request(path) do |uri|
|
222
|
-
req
|
253
|
+
req = Net::HTTP::Post.new(uri)
|
223
254
|
req.body = body.to_json
|
224
255
|
req
|
225
256
|
end
|
@@ -229,9 +260,9 @@ module DnsMadeEasy
|
|
229
260
|
def request(path)
|
230
261
|
uri = URI("#{base_uri}#{path}")
|
231
262
|
|
232
|
-
http
|
233
|
-
http.use_ssl
|
234
|
-
http.verify_mode
|
263
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
264
|
+
http.use_ssl = true
|
265
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE if @options.key?(:ssl_verify_none)
|
235
266
|
http.open_timeout = @options[:open_timeout] if @options.key?(:open_timeout)
|
236
267
|
http.read_timeout = @options[:read_timeout] if @options.key?(:read_timeout)
|
237
268
|
|
@@ -241,35 +272,53 @@ module DnsMadeEasy
|
|
241
272
|
request[key] = value
|
242
273
|
end
|
243
274
|
|
244
|
-
|
245
|
-
|
275
|
+
process_response!(http.request(request))
|
276
|
+
end
|
246
277
|
|
247
|
-
process_rate_limits(response)
|
248
278
|
|
279
|
+
def process_response!(response)
|
280
|
+
response.value # raise Net::HTTPServerException unless response was 2xx
|
281
|
+
process_rate_limits(response)
|
249
282
|
unparsed_json = response.body.to_s.empty? ? '{}' : response.body
|
250
|
-
|
251
283
|
Hashie::Mash.new(JSON.parse(unparsed_json))
|
284
|
+
rescue Net::HTTPServerException => e
|
285
|
+
if e.message =~ /403.*forbidden/i
|
286
|
+
raise ::DnsMadeEasy::AuthenticationError.new(e)
|
287
|
+
else
|
288
|
+
raise e
|
289
|
+
end
|
252
290
|
end
|
253
291
|
|
254
292
|
|
255
293
|
def process_rate_limits(response)
|
256
294
|
response.each_header do |header, value|
|
257
295
|
@requests_remaining = value.to_i if header == 'x-dnsme-requestsremaining'
|
258
|
-
@request_limit
|
296
|
+
@request_limit = value.to_i if header == 'x-dnsme-requestlimit'
|
259
297
|
end
|
260
298
|
end
|
261
299
|
|
262
300
|
|
263
301
|
def request_headers
|
264
302
|
request_date = Time.now.httpdate
|
265
|
-
hmac
|
303
|
+
hmac = OpenSSL::HMAC.hexdigest('sha1', @api_secret, request_date)
|
266
304
|
{
|
267
|
-
'Accept'
|
268
|
-
'x-dnsme-apiKey'
|
305
|
+
'Accept' => 'application/json',
|
306
|
+
'x-dnsme-apiKey' => @api_key,
|
269
307
|
'x-dnsme-requestDate' => request_date,
|
270
|
-
'x-dnsme-hmac'
|
308
|
+
'x-dnsme-hmac' => hmac
|
271
309
|
}
|
272
310
|
end
|
311
|
+
|
312
|
+
|
313
|
+
def with_url(url)
|
314
|
+
old_value = self.base_uri
|
315
|
+
self.base_uri = url
|
316
|
+
if block_given?
|
317
|
+
yield
|
318
|
+
self.base_uri = old_value
|
319
|
+
end
|
320
|
+
self
|
321
|
+
end
|
273
322
|
end
|
274
323
|
end
|
275
324
|
end
|
@@ -25,7 +25,7 @@ module DnsMadeEasy
|
|
25
25
|
#
|
26
26
|
#
|
27
27
|
class Credentials < Hash
|
28
|
-
DEFAULT_CREDENTIALS_FILE = File.expand_path('~/.dnsmadeeasy/credentials.yml').freeze
|
28
|
+
#DEFAULT_CREDENTIALS_FILE = File.expand_path('~/.dnsmadeeasy/credentials.yml').freeze
|
29
29
|
|
30
30
|
class CredentialsFileNotFound < StandardError
|
31
31
|
end
|
@@ -33,13 +33,16 @@ module DnsMadeEasy
|
|
33
33
|
#
|
34
34
|
# Class Methods
|
35
35
|
#
|
36
|
-
|
36
|
+
#
|
37
37
|
class << self
|
38
|
-
|
38
|
+
# Default credential file that's used if no argument is passed.
|
39
|
+
attr_accessor :default_credentials_file
|
40
|
+
|
41
|
+
def exist?(file = default_credentials_file)
|
39
42
|
File.exist?(file)
|
40
43
|
end
|
41
44
|
|
42
|
-
def load(file =
|
45
|
+
def load(file = default_credentials_file)
|
43
46
|
validate_argument(file)
|
44
47
|
|
45
48
|
new.tap do |local|
|
@@ -48,10 +51,6 @@ module DnsMadeEasy
|
|
48
51
|
end
|
49
52
|
end
|
50
53
|
|
51
|
-
def default_file
|
52
|
-
DEFAULT_CREDENTIALS_FILE
|
53
|
-
end
|
54
|
-
|
55
54
|
|
56
55
|
private
|
57
56
|
|
@@ -72,6 +71,8 @@ module DnsMadeEasy
|
|
72
71
|
end
|
73
72
|
end
|
74
73
|
|
74
|
+
# Set the default
|
75
|
+
self.default_credentials_file ||= File.expand_path('~/.dnsmadeeasy/credentials.yml').freeze
|
75
76
|
|
76
77
|
# Instance Methods
|
77
78
|
# NOTE: we are subclassing Hash, which isn't awesome, but gets the job done.
|
@@ -116,7 +117,7 @@ module DnsMadeEasy
|
|
116
117
|
when String, Symbol
|
117
118
|
hash[key.to_sym] = value
|
118
119
|
else
|
119
|
-
hash[key] = value
|
120
|
+
hash[key.to_s.to_sym] = value
|
120
121
|
end
|
121
122
|
end
|
122
123
|
|
@@ -0,0 +1,205 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'colored2'
|
4
|
+
require 'awesome_print'
|
5
|
+
require 'dnsmadeeasy'
|
6
|
+
require 'dnsmadeeasy/api/client'
|
7
|
+
|
8
|
+
|
9
|
+
module DnsMadeEasy
|
10
|
+
class Runner
|
11
|
+
SUPPORTED_FORMATS = %w(json yaml)
|
12
|
+
|
13
|
+
attr_accessor :format, :argv, :operation
|
14
|
+
|
15
|
+
|
16
|
+
def initialize(argv = nil)
|
17
|
+
self.argv = argv || ARGV.dup
|
18
|
+
configure_authentication
|
19
|
+
self.format = process_flags_format
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
def execute!
|
24
|
+
if argv.empty? || argv.size < 1
|
25
|
+
print_help_message
|
26
|
+
else
|
27
|
+
self.operation = argv.shift.to_sym
|
28
|
+
exit call_through_client(operation)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def call_through_client(method)
|
36
|
+
begin
|
37
|
+
result = DnsMadeEasy.client.send(method, *argv)
|
38
|
+
case result
|
39
|
+
when NilClass
|
40
|
+
puts 'No records returned.'
|
41
|
+
when Hashie::Mash
|
42
|
+
print_formatted(result.to_hash, format)
|
43
|
+
when Array
|
44
|
+
print_formatted(result.map(&:to_hash), format)
|
45
|
+
else
|
46
|
+
print_formatted(result, format)
|
47
|
+
end
|
48
|
+
0
|
49
|
+
rescue ArgumentError => e
|
50
|
+
sig = method_signature(e, method)
|
51
|
+
(sig.shift == method.to_s) ?
|
52
|
+
print_signature(method, sig) :
|
53
|
+
print_error('Action', "#{method.to_s.bold.yellow}", 'has generated an error'.red, exception: e)
|
54
|
+
1
|
55
|
+
rescue NoMethodError
|
56
|
+
print_error('Action', "#{method.to_s.bold.yellow}", 'is not valid.'.red)
|
57
|
+
puts 'HINT: try running ' + 'dme operations'.bold.green + ' to see the list of valid operations.'
|
58
|
+
2
|
59
|
+
rescue Net::HTTPServerException => e
|
60
|
+
print_error(exception: e)
|
61
|
+
3
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
def print_error(*args, exception: nil)
|
67
|
+
unless args.empty?
|
68
|
+
puts <<-EOF
|
69
|
+
#{'Error:'.bold.red} #{args.join(' ').red}
|
70
|
+
EOF
|
71
|
+
end
|
72
|
+
|
73
|
+
if exception
|
74
|
+
puts <<-EOF
|
75
|
+
#{'Exception: '.bold.red}#{exception.inspect.red}
|
76
|
+
EOF
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
def print_signature(method, sig)
|
82
|
+
puts <<-EOF
|
83
|
+
#{'Error: '.bold.yellow}
|
84
|
+
#{'You are missing some arguments for this operation:'.red}
|
85
|
+
|
86
|
+
#{'Correct Usage: '.bold.yellow}
|
87
|
+
#{method.to_s.bold.green} #{sig.join(' ').blue }
|
88
|
+
|
89
|
+
EOF
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
def process_flags_format
|
94
|
+
if argv.first&.start_with?('--')
|
95
|
+
format = argv.shift.gsub(/^--/, '')
|
96
|
+
if format =~ /^h(elp)?$/i
|
97
|
+
print_help_message
|
98
|
+
end
|
99
|
+
unless SUPPORTED_FORMATS.include?(format)
|
100
|
+
puts "Error: format #{format.bold.red} is not supported."
|
101
|
+
puts "Supported values are: #{SUPPORTED_FORMATS.join(', ')}"
|
102
|
+
exit 1
|
103
|
+
end
|
104
|
+
elsif argv.first =~ /^ope?r?a?t?i?o?n?$/i
|
105
|
+
print_supported_operations
|
106
|
+
exit 0
|
107
|
+
end
|
108
|
+
format
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
def configure_authentication
|
113
|
+
if ENV['DNSMADEEASY_API_KEY'] && ENV['DNSMADEEASY_API_SECRET']
|
114
|
+
DnsMadeEasy.configure do |config|
|
115
|
+
config.api_key = ENV['DNSMADEEASY_API_KEY']
|
116
|
+
config.api_secret = ENV['DNSMADEEASY_API_SECRET']
|
117
|
+
end
|
118
|
+
else
|
119
|
+
DnsMadeEasy.credentials = (ENV['DNSMADEEASY_CREDENTIALS'] || DnsMadeEasy::Credentials.default_credentials_file)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
|
124
|
+
def print_usage_message
|
125
|
+
puts <<-EOF
|
126
|
+
#{'Usage:'.bold.yellow}
|
127
|
+
#{'# Execute an API call:'.dark}
|
128
|
+
#{"dme [ #{SUPPORTED_FORMATS.map { |f| "--#{f}" }.join(' | ')} ] operation [ arg1 arg2 ... ] ".bold.green}
|
129
|
+
|
130
|
+
#{'# Print suported operations:'.dark}
|
131
|
+
#{'dme op[erations]'.bold.green}
|
132
|
+
|
133
|
+
EOF
|
134
|
+
end
|
135
|
+
|
136
|
+
|
137
|
+
def print_help_message
|
138
|
+
print_usage_message
|
139
|
+
|
140
|
+
puts <<-EOF
|
141
|
+
#{'Credentials:'.bold.yellow}
|
142
|
+
Store your credentials in a YAML file
|
143
|
+
#{DnsMadeEasy::Credentials.default_credentials_file} as follows:
|
144
|
+
|
145
|
+
#{'credentials:
|
146
|
+
api_key: XXXX
|
147
|
+
api_secret: YYYY'.bold.magenta}
|
148
|
+
|
149
|
+
#{'Examples:'.bold.yellow}
|
150
|
+
#{'dme domain moo.com
|
151
|
+
dme --json domain moo.com
|
152
|
+
dme find_all moo.com A www
|
153
|
+
dme find_first moo.com CNAME vpn-west
|
154
|
+
dme --yaml find_first moo.com CNAME vpn-west'.green}
|
155
|
+
|
156
|
+
EOF
|
157
|
+
exit 1
|
158
|
+
end
|
159
|
+
|
160
|
+
|
161
|
+
def print_supported_operations
|
162
|
+
puts <<-EOF
|
163
|
+
#{'Actions:'.bold.yellow}
|
164
|
+
Checkout the README and RubyDoc for the arguments to each operation,
|
165
|
+
which is basically a method on a DnsMadeEasy::Api::Client instance.
|
166
|
+
#{'http://www.rubydoc.info/gems/dnsmadeeasy/DnsMadeEasy/Api/Client'.blue.bold.underlined}
|
167
|
+
|
168
|
+
#{'Valid Operations Are:'.bold.yellow}
|
169
|
+
#{DnsMadeEasy::Api::Client.public_operations.join("\n ").green.bold}
|
170
|
+
|
171
|
+
EOF
|
172
|
+
end
|
173
|
+
|
174
|
+
|
175
|
+
def print_formatted(result, format = nil)
|
176
|
+
if format
|
177
|
+
puts result.send("to_#{format}".to_sym)
|
178
|
+
else
|
179
|
+
ap(result, indent: 10)
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
|
184
|
+
# e.backtrack.first looks like this:
|
185
|
+
# ..../dnsmadeeasy/lib/dnsmadeeasy/api/client.rb:143:in `create_a_record'
|
186
|
+
def method_signature(e, method)
|
187
|
+
file, line, call_method = e.backtrace.first.split(':')
|
188
|
+
call_method = call_method.gsub(/[']/, '').split('`').last
|
189
|
+
if call_method && call_method.to_sym == method.to_sym
|
190
|
+
source_line = File.open(file).to_a[line.to_i - 1].chomp!
|
191
|
+
if source_line =~ /def #{method}/
|
192
|
+
signature = source_line.strip.gsub(/,/, '').split(%r{[ ()]})
|
193
|
+
signature.shift # remove def
|
194
|
+
return signature.reject { |a| a =~ /^([={}\)\(])*$/ }
|
195
|
+
end
|
196
|
+
end
|
197
|
+
[]
|
198
|
+
rescue
|
199
|
+
[]
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
|
205
|
+
|
data/lib/dnsmadeeasy/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dnsmadeeasy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Konstantin Gredeskoul
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: exe
|
14
14
|
cert_chain: []
|
15
|
-
date: 2017-12-
|
15
|
+
date: 2017-12-14 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: hashie
|
@@ -28,6 +28,34 @@ dependencies:
|
|
28
28
|
- - ">="
|
29
29
|
- !ruby/object:Gem::Version
|
30
30
|
version: '0'
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: colored2
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - ">="
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
45
|
+
- !ruby/object:Gem::Dependency
|
46
|
+
name: awesome_print
|
47
|
+
requirement: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
type: :runtime
|
53
|
+
prerelease: false
|
54
|
+
version_requirements: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: '0'
|
31
59
|
- !ruby/object:Gem::Dependency
|
32
60
|
name: yard
|
33
61
|
requirement: !ruby/object:Gem::Requirement
|
@@ -170,12 +198,18 @@ files:
|
|
170
198
|
- lib/dnsmadeeasy/api/client.rb
|
171
199
|
- lib/dnsmadeeasy/credentials.rb
|
172
200
|
- lib/dnsmadeeasy/dme.rb
|
201
|
+
- lib/dnsmadeeasy/runner.rb
|
173
202
|
- lib/dnsmadeeasy/version.rb
|
174
203
|
homepage: https://github.com/kigster/dnsmadeeasy
|
175
204
|
licenses:
|
176
205
|
- MIT
|
177
206
|
metadata: {}
|
178
|
-
post_install_message:
|
207
|
+
post_install_message: "\nThank you for using the DnsMadeEasy ruby gem, the Ruby client
|
208
|
+
\nAPI for DnsMadeEasy.com's SDK v2. Please note that this gem \ncomes with a command
|
209
|
+
line utility 'dme' which you can use \ninstead of the ruby API if you prefer. Run
|
210
|
+
`dme` with no\narguments to see the help message.\n\nYou can store your credentials
|
211
|
+
in a YAML file in your home\ndirectory. For more information, please see README
|
212
|
+
at:\nhttps://github.com/kigster/dnsmadeeasy\n\n"
|
179
213
|
rdoc_options: []
|
180
214
|
require_paths:
|
181
215
|
- lib
|