lita-digitalocean 0.0.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|