lita-digitalocean 0.0.1 → 1.0.0
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/README.md +178 -6
- data/lib/lita-digitalocean.rb +18 -0
- data/lib/lita/handlers/digitalocean.rb +0 -147
- data/lib/lita/handlers/digitalocean/base.rb +62 -0
- data/lib/lita/handlers/digitalocean/domain.rb +61 -0
- data/lib/lita/handlers/digitalocean/domain_record.rb +99 -0
- data/lib/lita/handlers/digitalocean/droplet.rb +236 -0
- data/lib/lita/handlers/digitalocean/image.rb +68 -0
- data/lib/lita/handlers/digitalocean/region.rb +23 -0
- data/lib/lita/handlers/digitalocean/size.rb +23 -0
- data/lib/lita/handlers/digitalocean/ssh_key.rb +94 -0
- data/lita-digitalocean.gemspec +4 -3
- data/locales/en.yml +142 -5
- data/spec/lita/handlers/digitalocean/base_spec.rb +39 -0
- data/spec/lita/handlers/digitalocean/domain_record_spec.rb +118 -0
- data/spec/lita/handlers/digitalocean/domain_spec.rb +85 -0
- data/spec/lita/handlers/digitalocean/droplet_spec.rb +238 -0
- data/spec/lita/handlers/digitalocean/image_spec.rb +121 -0
- data/spec/lita/handlers/digitalocean/region_spec.rb +44 -0
- data/spec/lita/handlers/digitalocean/size_spec.rb +44 -0
- data/spec/lita/handlers/digitalocean/ssh_key_spec.rb +119 -0
- metadata +44 -8
- data/spec/lita/handlers/digitalocean_spec.rb +0 -130
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ceb867fa1a82a608494d9af9340cc2a9f2ccff2f
|
4
|
+
data.tar.gz: 79c78fd54b3ba4fb044e71c2d3687909c594af7f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 28c176473b7afe92034be4a40e66855264a7d6f2281b8760a1e8dd99eca7566c1997aa3daf58caf3b97a821ff74a802c8843d80166825c8e890fe6c47a9867fb
|
7
|
+
data.tar.gz: 6d9cda0c6800bee0cec9c2a015dbfd71eb7ec9b8c6d9d7c1573d2550f81a51c9bc9a0c99ef12c6fd542c082650c30fad628a41a0090436070e126a0ed48eafd0
|
data/README.md
CHANGED
@@ -36,19 +36,187 @@ To use any of the DigitalOcean commands, the user sending the message must be in
|
|
36
36
|
|
37
37
|
### Domain commands
|
38
38
|
|
39
|
-
|
39
|
+
To create a new DNS record set:
|
40
|
+
|
41
|
+
```
|
42
|
+
Lita: do domains create NAME IP
|
43
|
+
```
|
44
|
+
|
45
|
+
To delete a DNS record set:
|
46
|
+
|
47
|
+
```
|
48
|
+
Lita: do domains delete DOMAIN_NAME_OR_ID
|
49
|
+
```
|
50
|
+
|
51
|
+
To list all DNS record sets:
|
52
|
+
|
53
|
+
```
|
54
|
+
Lita: do domains list
|
55
|
+
```
|
56
|
+
|
57
|
+
To show the details of a DNS record set:
|
58
|
+
|
59
|
+
```
|
60
|
+
Lita: do domains show DOMAIN_NAME_OR_ID
|
61
|
+
```
|
62
|
+
|
63
|
+
### Domain record commands
|
64
|
+
|
65
|
+
To create a new DNS record:
|
66
|
+
|
67
|
+
```
|
68
|
+
Lita: do domain records create DOMAIN_NAME_OR_ID TYPE DATA [--name NAME] [--priority PRIORITY] [--port PORT] [--weight WEIGHT]
|
69
|
+
```
|
70
|
+
|
71
|
+
To delete a DNS record:
|
72
|
+
|
73
|
+
```
|
74
|
+
Lita: do domain records delete DOMAIN_NAME_OR_ID DOMAIN_RECORD_ID
|
75
|
+
```
|
76
|
+
|
77
|
+
To edit a DNS record:
|
78
|
+
|
79
|
+
```
|
80
|
+
Lita: do domain records edit DOMAIN_NAME_OR_ID DOMAIN_RECORD_ID TYPE DATA [--name NAME] [--priority PRIORITY] [--port PORT] [--weight WEIGHT]
|
81
|
+
```
|
82
|
+
|
83
|
+
To list all DNS records for a DNS record set:
|
84
|
+
|
85
|
+
```
|
86
|
+
Lita: do domain records list DOMAIN_NAME_OR_ID
|
87
|
+
```
|
88
|
+
|
89
|
+
To show the details of a DNS record:
|
90
|
+
|
91
|
+
```
|
92
|
+
Lita: do domain records show DOMAIN_NAME_OR_ID DOMAIN_RECORD_ID
|
93
|
+
```
|
40
94
|
|
41
95
|
### Droplet commands
|
42
96
|
|
43
|
-
|
97
|
+
To create a droplet:
|
98
|
+
|
99
|
+
```
|
100
|
+
Lita: do droplets create HOSTNAME SIZE_ID_OR_SLUG IMAGE_ID_OR_SLUG REGION_ID_OR_SLUG [--ssh-key-ids SSH_KEY_IDS] [--private-networking] [--backups-enabled]
|
101
|
+
```
|
102
|
+
|
103
|
+
To delete a droplet, optionally writing zeroes to the disk first:
|
104
|
+
|
105
|
+
```
|
106
|
+
Lita: do droplets delete ID [--scrub]
|
107
|
+
```
|
108
|
+
|
109
|
+
To list all droplets:
|
110
|
+
|
111
|
+
```
|
112
|
+
Lita: do droplets list
|
113
|
+
```
|
114
|
+
|
115
|
+
To reset the root password for a droplet:
|
116
|
+
|
117
|
+
```
|
118
|
+
Lita: do droplets password reset ID
|
119
|
+
```
|
120
|
+
|
121
|
+
To power cycle a droplet:
|
122
|
+
|
123
|
+
```
|
124
|
+
Lita: do droplets power cycle ID
|
125
|
+
```
|
126
|
+
|
127
|
+
To power off a droplet:
|
128
|
+
|
129
|
+
```
|
130
|
+
Lita: do droplets power off ID
|
131
|
+
```
|
132
|
+
|
133
|
+
To power on a droplet:
|
134
|
+
|
135
|
+
```
|
136
|
+
Lita: do droplets power on ID
|
137
|
+
```
|
138
|
+
|
139
|
+
To reboot a droplet:
|
140
|
+
|
141
|
+
```
|
142
|
+
Lita: do droplets reboot ID
|
143
|
+
```
|
144
|
+
|
145
|
+
To rebuild a droplet:
|
146
|
+
|
147
|
+
```
|
148
|
+
Lita: do droplets rebuild ID IMAGE_ID
|
149
|
+
```
|
150
|
+
|
151
|
+
To resize a droplet's disk:
|
152
|
+
|
153
|
+
```
|
154
|
+
Lita: do droplets resize ID SIZE_ID_OR_SLUG
|
155
|
+
```
|
156
|
+
|
157
|
+
To restore a droplet from an image:
|
158
|
+
|
159
|
+
```
|
160
|
+
Lita: do droplets restore ID IMAGE_ID
|
161
|
+
```
|
162
|
+
|
163
|
+
To show the details of a droplet:
|
164
|
+
|
165
|
+
```
|
166
|
+
Lita: do droplets show ID
|
167
|
+
```
|
168
|
+
|
169
|
+
To shut down a droplet:
|
170
|
+
|
171
|
+
```
|
172
|
+
Lita: do droplets shutdown ID
|
173
|
+
```
|
174
|
+
|
175
|
+
To take a snapshot of a droplet, optionally naming the snapshot:
|
176
|
+
|
177
|
+
```
|
178
|
+
Lita: do droplets snapshot ID [NAME]
|
179
|
+
```
|
44
180
|
|
45
181
|
### Image commands
|
46
182
|
|
47
|
-
|
183
|
+
To delete an image:
|
184
|
+
|
185
|
+
```
|
186
|
+
Lita: do images delete ID_OR_SLUG
|
187
|
+
```
|
188
|
+
|
189
|
+
To list all possible images:
|
190
|
+
|
191
|
+
```
|
192
|
+
Lita: do images list
|
193
|
+
```
|
194
|
+
|
195
|
+
To list only global images:
|
196
|
+
|
197
|
+
```
|
198
|
+
Lita: do images list global
|
199
|
+
```
|
200
|
+
|
201
|
+
To list only your own images:
|
202
|
+
|
203
|
+
```
|
204
|
+
Lita: do images list my_images
|
205
|
+
```
|
206
|
+
|
207
|
+
To show the details of an image:
|
208
|
+
|
209
|
+
```
|
210
|
+
Lita: do images show ID_OR_SLUG
|
211
|
+
```
|
48
212
|
|
49
213
|
### Region commands
|
50
214
|
|
51
|
-
|
215
|
+
To list all the possible regions:
|
216
|
+
|
217
|
+
```
|
218
|
+
Lita: do regions list
|
219
|
+
```
|
52
220
|
|
53
221
|
### SSH key commands
|
54
222
|
|
@@ -67,7 +235,7 @@ Lita: do ssh keys delete ID
|
|
67
235
|
To edit the name and/or public key of an existing SSH key:
|
68
236
|
|
69
237
|
```
|
70
|
-
Lita: do ssh keys edit ID [name
|
238
|
+
Lita: do ssh keys edit ID [--name NAME] [--public-key PUBLIC_KEY]
|
71
239
|
```
|
72
240
|
|
73
241
|
To list the names and IDs of all SSH keys:
|
@@ -84,7 +252,11 @@ Lita: do ssh keys show ID
|
|
84
252
|
|
85
253
|
### Size commands
|
86
254
|
|
87
|
-
|
255
|
+
To list all the possible image sizes:
|
256
|
+
|
257
|
+
```
|
258
|
+
Lita: do sizes list
|
259
|
+
```
|
88
260
|
|
89
261
|
## License
|
90
262
|
|
data/lib/lita-digitalocean.rb
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
# This unfortunate monkey patch can be removed when a new i18n gem is released with the
|
2
|
+
# following patch in it: https://github.com/svenfuchs/i18n/pull/250
|
3
|
+
class Hash
|
4
|
+
def slice(*keep_keys)
|
5
|
+
h = self.class.new
|
6
|
+
keep_keys.each { |key| h[key] = fetch(key) }
|
7
|
+
h
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
1
11
|
require "lita"
|
2
12
|
|
3
13
|
Lita.load_locales Dir[File.expand_path(
|
@@ -5,3 +15,11 @@ Lita.load_locales Dir[File.expand_path(
|
|
5
15
|
)]
|
6
16
|
|
7
17
|
require "lita/handlers/digitalocean"
|
18
|
+
require "lita/handlers/digitalocean/base"
|
19
|
+
require "lita/handlers/digitalocean/domain"
|
20
|
+
require "lita/handlers/digitalocean/domain_record"
|
21
|
+
require "lita/handlers/digitalocean/droplet"
|
22
|
+
require "lita/handlers/digitalocean/image"
|
23
|
+
require "lita/handlers/digitalocean/region"
|
24
|
+
require "lita/handlers/digitalocean/ssh_key"
|
25
|
+
require "lita/handlers/digitalocean/size"
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require "digital_ocean"
|
2
|
-
|
3
1
|
module Lita
|
4
2
|
module Handlers
|
5
3
|
class Digitalocean < Handler
|
@@ -7,151 +5,6 @@ module Lita
|
|
7
5
|
config.client_id = nil
|
8
6
|
config.api_key = nil
|
9
7
|
end
|
10
|
-
|
11
|
-
private
|
12
|
-
|
13
|
-
def self.do_route(regexp, route_name, help)
|
14
|
-
route(regexp, route_name, command: true, restrict_to: :digitalocean_admins, help: help)
|
15
|
-
end
|
16
|
-
|
17
|
-
public
|
18
|
-
|
19
|
-
do_route /^do\s+ssh\s+keys?\s+add\s+.+$/i, :ssh_keys_add, {
|
20
|
-
t("help.ssh_keys.add_key") => t("help.ssh_keys.add_value")
|
21
|
-
}
|
22
|
-
|
23
|
-
do_route /^do\s+ssh\s+keys?\s+delete\s+(\d+)$/i, :ssh_keys_delete, {
|
24
|
-
t("help.ssh_keys.delete_key") => t("help.ssh_keys.delete_value")
|
25
|
-
}
|
26
|
-
|
27
|
-
do_route /^do\s+ssh\s+keys?\s+edit\s+(\d+)\s+.+$/i, :ssh_keys_edit, {
|
28
|
-
t("help.ssh_keys.edit_key") => t("help.ssh_keys.edit_value")
|
29
|
-
}
|
30
|
-
|
31
|
-
do_route /^do\s+ssh\s+keys?\s+list$/i, :ssh_keys_list, {
|
32
|
-
t("help.ssh_keys.list_key") => t("help.ssh_keys.list_value")
|
33
|
-
}
|
34
|
-
|
35
|
-
do_route /^do\s+ssh\s+keys?\s+show\s+(\d+)$/i, :ssh_keys_show, {
|
36
|
-
t("help.ssh_keys.show_key") => t("help.ssh_keys.show_value"),
|
37
|
-
}
|
38
|
-
|
39
|
-
def ssh_keys_add(response)
|
40
|
-
name, public_key = response.args[3..4]
|
41
|
-
|
42
|
-
unless name && public_key
|
43
|
-
return response.reply("#{t('format')}: #{t('help.ssh_keys.add_key')}")
|
44
|
-
end
|
45
|
-
|
46
|
-
do_response = do_call(response) do |client|
|
47
|
-
client.ssh_keys.add(name: name, ssh_pub_key: public_key)
|
48
|
-
end or return
|
49
|
-
|
50
|
-
key = do_response.ssh_key
|
51
|
-
response.reply(
|
52
|
-
t("ssh_keys.add.created", message: "#{key.id} (#{key.name}): #{key.ssh_pub_key}")
|
53
|
-
)
|
54
|
-
end
|
55
|
-
|
56
|
-
def ssh_keys_delete(response)
|
57
|
-
key_id = response.matches[0][0]
|
58
|
-
|
59
|
-
do_call(response) do |client|
|
60
|
-
client.ssh_keys.delete(key_id)
|
61
|
-
end or return
|
62
|
-
|
63
|
-
response.reply(t("ssh_keys.delete.deleted", key_id: key_id))
|
64
|
-
end
|
65
|
-
|
66
|
-
def ssh_keys_edit(response)
|
67
|
-
args = extract_named_args(response.args, :name, :public_key)
|
68
|
-
|
69
|
-
if args[:public_key]
|
70
|
-
args[:ssh_pub_key] = args.delete(:public_key)
|
71
|
-
end
|
72
|
-
|
73
|
-
do_response = do_call(response) do |client|
|
74
|
-
client.ssh_keys.edit(response.matches[0][0], args)
|
75
|
-
end or return
|
76
|
-
|
77
|
-
key = do_response.ssh_key
|
78
|
-
response.reply(
|
79
|
-
t("ssh_keys.edit.updated", message: "#{key.id} (#{key.name}): #{key.ssh_pub_key}")
|
80
|
-
)
|
81
|
-
end
|
82
|
-
|
83
|
-
def ssh_keys_list(response)
|
84
|
-
do_response = do_call(response) do |client|
|
85
|
-
client.ssh_keys.list
|
86
|
-
end or return
|
87
|
-
|
88
|
-
if do_response.ssh_keys.empty?
|
89
|
-
response.reply(t("ssh_keys.list.empty"))
|
90
|
-
else
|
91
|
-
do_response.ssh_keys.each do |key|
|
92
|
-
response.reply("#{key.id} (#{key.name})")
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
def ssh_keys_show(response)
|
98
|
-
do_response = do_call(response) do |client|
|
99
|
-
client.ssh_keys.show(response.matches[0][0])
|
100
|
-
end or return
|
101
|
-
|
102
|
-
key = do_response.ssh_key
|
103
|
-
response.reply("#{key.id} (#{key.name}): #{key.ssh_pub_key}")
|
104
|
-
end
|
105
|
-
|
106
|
-
private
|
107
|
-
|
108
|
-
def api_key
|
109
|
-
config.api_key
|
110
|
-
end
|
111
|
-
|
112
|
-
def client
|
113
|
-
@client ||= ::DigitalOcean::API.new(client_id: client_id, api_key: api_key)
|
114
|
-
end
|
115
|
-
|
116
|
-
def client_id
|
117
|
-
config.client_id
|
118
|
-
end
|
119
|
-
|
120
|
-
def config
|
121
|
-
Lita.config.handlers.digitalocean
|
122
|
-
end
|
123
|
-
|
124
|
-
def do_call(response)
|
125
|
-
unless api_key && client_id
|
126
|
-
response.reply(t("credentials_missing"))
|
127
|
-
return
|
128
|
-
end
|
129
|
-
|
130
|
-
do_response = yield client
|
131
|
-
|
132
|
-
if do_response.status != "OK"
|
133
|
-
response.reply(t("error", message: do_response.message))
|
134
|
-
return
|
135
|
-
end
|
136
|
-
|
137
|
-
do_response
|
138
|
-
end
|
139
|
-
|
140
|
-
def extract_named_args(args, *keys)
|
141
|
-
args.inject({}) do |hash, arg|
|
142
|
-
key, value = arg.split("=", 2)
|
143
|
-
|
144
|
-
if value
|
145
|
-
normalized_key = key.downcase.to_sym
|
146
|
-
|
147
|
-
if keys.include?(normalized_key)
|
148
|
-
hash[normalized_key] = value.gsub(/\A["']|["']\Z/, "")
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
hash
|
153
|
-
end
|
154
|
-
end
|
155
8
|
end
|
156
9
|
|
157
10
|
Lita.register_handler(Digitalocean)
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require "digital_ocean"
|
2
|
+
require "lita-keyword-arguments"
|
3
|
+
require "hashie"
|
4
|
+
|
5
|
+
module Lita
|
6
|
+
module Handlers
|
7
|
+
class Digitalocean < Handler
|
8
|
+
class Base < Handler
|
9
|
+
# Override key for locale namespace.
|
10
|
+
def self.name
|
11
|
+
"Digitalocean"
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def self.do_route(regexp, route_name, help, kwargs = nil)
|
17
|
+
options = {
|
18
|
+
command: true,
|
19
|
+
help: help,
|
20
|
+
restrict_to: :digitalocean_admins
|
21
|
+
}
|
22
|
+
|
23
|
+
options[:kwargs] = kwargs if kwargs
|
24
|
+
|
25
|
+
route(regexp, route_name, options)
|
26
|
+
end
|
27
|
+
|
28
|
+
def api_key
|
29
|
+
config.api_key
|
30
|
+
end
|
31
|
+
|
32
|
+
def client
|
33
|
+
@client ||= ::DigitalOcean::API.new(client_id: client_id, api_key: api_key)
|
34
|
+
end
|
35
|
+
|
36
|
+
def client_id
|
37
|
+
config.client_id
|
38
|
+
end
|
39
|
+
|
40
|
+
def do_call(response)
|
41
|
+
unless api_key && client_id
|
42
|
+
response.reply(t("credentials_missing"))
|
43
|
+
return
|
44
|
+
end
|
45
|
+
|
46
|
+
do_response = yield client
|
47
|
+
|
48
|
+
if do_response[:status] != "OK"
|
49
|
+
response.reply(t("error", message: do_response[:message]))
|
50
|
+
return
|
51
|
+
end
|
52
|
+
|
53
|
+
do_response
|
54
|
+
end
|
55
|
+
|
56
|
+
def format_array(array)
|
57
|
+
%([#{array.join(",")}])
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|