acquia_toolbelt 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.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YzQwNDA2Y2I3N2ZkMTY3NDUyZDRhZmEzYTBiZWY4NmNhYWM0MDdiMQ==
5
+ data.tar.gz: !binary |-
6
+ NmNlMTgyMTIyMTgyNWVkODQ4MGQ5NGY1OTQyNTRhNDhhNTliZWYzZg==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ ZThiNWRmYWExYzE4NDE2NDQwMzYzNmUwNWQzYzM0YzNhZThhNjM4MjdlOGFk
10
+ YzVkNjlhNTY4Y2U5MzFjYjNlMzYyZDZlOThhZTU4MzRhM2I3ZjY3YjFlNWJl
11
+ MzgxMmNmNjUzMDVmNjM2ZmMzZmRhMTA2N2U3NzdjODE4MTRjZTU=
12
+ data.tar.gz: !binary |-
13
+ OWQwNjMzZjVmYTViN2JhYzc1ZDMzYTUwYWZjZmI5YzJmMzU2MzBjMGNhZWIy
14
+ YWUwOWYyNzE5ZDM3YWZiODVjZWMyNDExNzY2ODczNGJjNWU4MjNiN2FiOTZm
15
+ ZTJlNzhmMTNjYmI2NzJjOWQ1MTI4ZjY0MTBlNmVlOTRhNTY5MjU=
@@ -0,0 +1,3 @@
1
+ .DS_Store
2
+ .tmp
3
+ .swp
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2012 Jacob Bednarz.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ this software and associated documentation files (the "Software"), to deal in
5
+ the Software without restriction, including without limitation the rights to
6
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7
+ of the Software, and to permit persons to whom the Software is furnished to do
8
+ so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
Binary file
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'acquia_toolbelt/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "acquia_toolbelt"
8
+ spec.version = AcquiaToolbelt::VERSION
9
+ spec.authors = ["Jacob Bednarz"]
10
+ spec.email = ["jacob.bednarz@gmail.com"]
11
+ spec.description = %q{A CLI tool for interacting with Acquia's hosting services.}
12
+ spec.summary = ""
13
+ spec.homepage = "https://github.com/jacobbednarz/acquia-toolbelt"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_runtime_dependency "thor", "0.18.1"
22
+ spec.add_runtime_dependency "netrc", "0.7.7"
23
+ spec.add_runtime_dependency "highline", "1.6.19"
24
+ spec.add_runtime_dependency "faraday", "0.8.8"
25
+ spec.add_runtime_dependency "json", "1.8.0"
26
+
27
+ spec.add_development_dependency "bundler", "~> 1.3"
28
+ spec.add_development_dependency "rake"
29
+ end
@@ -0,0 +1,444 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "thor"
4
+ require "netrc"
5
+ require "highline/import"
6
+ require "faraday"
7
+ require "json"
8
+
9
+ class Acquia < Thor
10
+ # A no_commands block is designed to show the methods that cannot be invoked
11
+ # and as such, do not have a description.
12
+ no_commands {
13
+ # Internal: Used for outputting a pretty success message.
14
+ #
15
+ # Returns the coloured and formatted string.
16
+ def success(text)
17
+ puts "\e[#32m#{text}\e[0m"
18
+ end
19
+
20
+ # Internal: Used for outputting a pretty error message.
21
+ #
22
+ # Returns the coloured and formatted string.
23
+ def fail(text)
24
+ puts "\e[#31m#{text}\e[0m"
25
+ end
26
+
27
+ # Internal: Used for outputting a pretty info message.
28
+ #
29
+ # Returns the coloured and formatted string.
30
+ def info(text)
31
+ puts "\e[#36m#{text}\e[0m"
32
+ end
33
+
34
+ # Internal: Create a request to the Acquia API.
35
+ #
36
+ # The request generated contains all the correct user authentication and
37
+ # headers.
38
+ #
39
+ # Returns a JSON string of the body.
40
+ def acquia_api_call(resource, method = "GET", data = {})
41
+ n = Netrc.read
42
+ @acquia_user, @acquia_password = n["cloudapi.acquia.com"]
43
+
44
+ #conn = Faraday.new(:proxy => "http://csydl217.au.fcl.internal:3128")
45
+ conn = Faraday.new
46
+ conn.basic_auth(@acquia_user, @acquia_password)
47
+
48
+ case method
49
+ when "GET"
50
+ response = conn.get "https://cloudapi.acquia.com/v1/#{resource}.json"
51
+ JSON.parse response.body
52
+ when "POST"
53
+ response = conn.post "https://cloudapi.acquia.com/v1/#{resource}.json", data.to_json
54
+ JSON.parse response.body
55
+ when "DELETE"
56
+ response = conn.delete "https://cloudapi.acquia.com/v1/#{resource}.json"
57
+ JSON.parse response.body
58
+ else
59
+ end
60
+ end
61
+
62
+ # Internal: Get defined subscription environments.
63
+ #
64
+ # This is a helper method that fetches all the available environments for a
65
+ # subscription and returns them for use in other methods.
66
+ #
67
+ # Returns an array of environments.
68
+ def get_acquia_environments(subscription)
69
+ env_data = acquia_api_call "sites/#{subscription}/envs"
70
+
71
+ envs = []
72
+ env_data.each do |env|
73
+ envs << env["name"]
74
+ end
75
+
76
+ envs
77
+ end
78
+
79
+ # Internal: Truncate a SSH key to a secure and recognisable size.
80
+ #
81
+ # Displaying whole SSH keys is probably a bad idea so instead we are getting
82
+ # the first 30 characters and the last 100 characters of the key and
83
+ # separating them with an ellipis. This allows you to recognise the
84
+ # important parts of the key instead of the whole thing.
85
+ #
86
+ # Returns string.
87
+ def truncate_ssh_key(ssh_key)
88
+ front_part = ssh_key[0...30]
89
+ back_part = ssh_key[-50, 50]
90
+ new_ssh_key = "#{front_part}...#{back_part}"
91
+ end
92
+
93
+ # Internal: Send a request to purge a domain's cache.
94
+ #
95
+ # Purge the web cache via an API call.
96
+ #
97
+ # Returns a status message.
98
+ def purge_acquia_domain(subscription, environment, domain)
99
+ # Ensure all the required fields are available.
100
+ if subscription.nil? || environment.nil? || domain.nil?
101
+ fail "Purge request is missing a required parameter."
102
+ return
103
+ end
104
+
105
+ purge_request = acquia_api_call "sites/#{subscription}/envs/#{environment}/domains/#{domain}/cache", "DELETE"
106
+ success "#{domain} has been successfully purged." if purge_request["id"]
107
+ end
108
+ }
109
+
110
+ # Public: Log into the Acquia Cloud API.
111
+ #
112
+ # This sets up the user account within the netrc file so that subsequent
113
+ # calls can reuse the authentication without the user being prompted for it.
114
+ #
115
+ # Returns the status of your login attempt.
116
+ desc "login", "Login to your Acquia account."
117
+ def login
118
+ user = ask "Enter your username:"
119
+ password = ask "Enter your password:"
120
+
121
+ # Update (or create if needed) the netrc file that will contain the user
122
+ # authentication details.
123
+ n = Netrc.read
124
+ n.new_item_prefix = "# This entry was added for connecting to the Acquia Cloud API\n"
125
+ n["cloudapi.acquia.com"] = user, password
126
+ n.save
127
+
128
+ success "Your user credentials have been successfully set."
129
+ end
130
+
131
+ # Public: Display an overview of the subscriptions.
132
+ #
133
+ # Returns all subscriptions with their respective data.
134
+ desc "list-subscriptions", "Find all subscriptions that you have access to."
135
+ def list_subscriptions
136
+ subscriptions = acquia_api_call "sites"
137
+
138
+ subscriptions.each do |subscription|
139
+ say
140
+ # Get the individual subscription information.
141
+ subscription_info = acquia_api_call "sites/#{subscription}"
142
+ say "#{subscription_info["title"]}"
143
+ say "> Username: #{subscription_info["unix_username"]}"
144
+ say "> Subscription: #{subscription_info["name"]}"
145
+
146
+ # If the VCS type is SVN, we want it in all uppercase, otherwise just
147
+ # capitilise it.
148
+ if subscription_info["vcs_type"] == 'svn'
149
+ say "> #{subscription_info["vcs_type"].upcase} URL: #{subscription_info["vcs_url"]}"
150
+ else
151
+ say "> #{subscription_info["vcs_type"].capitalize} URL: #{subscription_info["vcs_url"]}"
152
+ end
153
+ end
154
+ end
155
+
156
+ # Public: Provide an overview of the environments in your subscription.
157
+ #
158
+ # Returns the environment data in a pretty format.
159
+ desc "list-environments <subscription>", "Provide an overview of the environments in your subscription."
160
+ option :environment, :aliases => "-e"
161
+ def list_environments(subscription)
162
+ # If the environment option is set, just fetch a single environment.
163
+ if options[:environment]
164
+ subscription_envs = [options[:environment]]
165
+ else
166
+ subscription_envs = get_acquia_environments(subscription)
167
+ end
168
+
169
+ subscription_envs.each do |environment|
170
+ env_info = acquia_api_call "sites/#{subscription}/envs/#{environment}"
171
+ say
172
+ say "> Host: #{env_info["ssh_host"]}"
173
+ say "> Environment: #{env_info["name"]}"
174
+ say "> Current release: #{env_info["vcs_path"]}"
175
+ say "> DB clusters: #{env_info["db_clusters"].to_s unless env_info["db_clusters"].nil?}"
176
+ say "> Default domain: #{env_info["default_domain"]}"
177
+ end
178
+ end
179
+
180
+ # Public: Get server specs and information from an environment.
181
+ #
182
+ # This allows the ability to get all the server data from all server types
183
+ # that are available within the subscription's environments.
184
+ #
185
+ # Returns server information on a per environment basis.
186
+ desc "list-servers <subscription>", "Get a list of servers specifications for an environment."
187
+ option :environment, :aliases => "-e"
188
+ def list_servers(subscription)
189
+ # Determine if we want just a single environment, or all of them at once.
190
+ if options[:environment]
191
+ subscription_envs = [options[:environment]]
192
+ else
193
+ subscription_envs = get_acquia_environments(subscription)
194
+ end
195
+
196
+ # Loop over each environment and get all the associated server data.
197
+ subscription_envs.each do |environment|
198
+ if options[:environment].nil?
199
+ say
200
+ say "Environment: #{environment}"
201
+ end
202
+
203
+ server_env = acquia_api_call "sites/#{subscription}/envs/#{environment}/servers"
204
+ server_env.each do |server|
205
+ say
206
+ say "> Host: #{server["fqdn"]}"
207
+ say "> EC2 region: #{server["ec2_region"]}"
208
+ say "> Availability zone: #{server["ec2_availability_zone"]}"
209
+ say "> EC2 instance type: #{server["ami_type"]}"
210
+
211
+ # Show how many PHP processes this node can have. Note, this is only
212
+ # available on the web servers.
213
+ if server["services"] && server["services"]["php_max_procs"]
214
+ say "> PHP max processes: #{server["services"]["php_max_procs"]}"
215
+ end
216
+
217
+ if server["services"] && server["services"]["status"]
218
+ say "> Status: #{server["services"]["status"]}"
219
+ end
220
+
221
+ if server["services"] && server["services"]["web"]
222
+ say "> Web status: #{server["services"]["web"]["status"]}"
223
+ end
224
+
225
+ # The state of varnish.
226
+ if server["services"] && server["services"]["varnish"]
227
+ say "> Varnish status: #{server["services"]["varnish"]["status"]}"
228
+ end
229
+
230
+ # Only load balancers will have the "external IP" property.
231
+ if server["services"] && server["services"]["external_ip"]
232
+ say "> External IP: #{server["services"]["external_ip"]}"
233
+ end
234
+ end
235
+ end
236
+ end
237
+
238
+ # Public: Get information regarding the database instances.
239
+ #
240
+ # Within this method we have a few different options to get the information we
241
+ # require. If just an environment is passed, only the names are returned. Pass
242
+ # the environment param and the username, pasword, host, db cluster and
243
+ # instance name are returned for each database available. Passing a database
244
+ # name and the environment will only return that particular database.
245
+ #
246
+ # Returns database information.
247
+ desc "list-databases <subscription>", "See information about the databases within a subscription."
248
+ option :environment, :aliases => "-e"
249
+ option :database, :aliases => "-d"
250
+ def list_databases(subscription)
251
+ # If we have both the database name and environment, only fetch a single
252
+ # result.
253
+ if options[:database] && options[:environment]
254
+ database = acquia_api_call "sites/#{subscription}/envs/#{options[:environment]}/dbs/#{options[:database]}"
255
+ say
256
+ say "> Username: #{database["username"]}"
257
+ say "> Password: #{database["password"]}"
258
+ say "> Host: #{database["host"]}"
259
+ say "> DB cluster: #{database["db_cluster"]}"
260
+ say "> Instance name: #{database["instance_name"]}"
261
+ return
262
+ end
263
+
264
+ # Fetch all the databases in a specific environment.
265
+ if options[:environment]
266
+ databases = acquia_api_call "sites/#{subscription}/envs/#{options[:environment]}/dbs"
267
+ databases.each do |db|
268
+ say
269
+ say "#{db["name"]}"
270
+ say "> Username: #{db["username"]}"
271
+ say "> Password: #{db["password"]}"
272
+ say "> Host: #{db["host"]}"
273
+ say "> DB cluster: #{db["db_cluster"]}"
274
+ say "> Instance name: #{db["instance_name"]}"
275
+ end
276
+ else
277
+ subscription_envs = [options[:environment]]
278
+ databases = acquia_api_call "sites/#{subscription}/dbs"
279
+
280
+ say
281
+ databases.each do |db|
282
+ say "> #{db["name"]}"
283
+ end
284
+ end
285
+ end
286
+
287
+ # Public: List all backups for a database instance.
288
+ #
289
+ # Fetching all database backups for an instance is a pretty heavy call as the
290
+ # data isn't restricted in any way by time, id's, etc.
291
+ #
292
+ # Returns a database backup listing.
293
+ desc "list-database-backups <subscription> <environment> <database>", "Get all backups for a database instance."
294
+ def list_database_backups(subscription, environment, database)
295
+ backups = acquia_api_call "sites/#{subscription}/envs/#{environment}/dbs/#{database}/backups"
296
+ backups.each do |backup|
297
+ say
298
+ say "> ID: #{backup["id"]}"
299
+ say "> MD5: #{backup["checksum"]}"
300
+ say "> Type: #{backup["type"]}"
301
+ say "> Path: #{backup["path"]}"
302
+ say "> Link: #{backup["link"]}"
303
+ say "> Started: #{Time.at(backup["started"].to_i)}"
304
+ say "> Completed: #{Time.at(backup["completed"].to_i)}"
305
+ end
306
+ end
307
+
308
+ # Public: Create a new database instance.
309
+ #
310
+ # Returns a success message upon creation.
311
+ desc "add-database <subscription> <database>", "Create a new database instance."
312
+ def add_database(subscription, database)
313
+ add_database = acquia_api_call "sites/#{subscription}/dbs", "POST", :db => "#{database}"
314
+ success "A new database has been created." if add_database["id"]
315
+ end
316
+
317
+ # Public: Delete a database instance.
318
+ #
319
+ # Returns a status message based on the task completion.
320
+ desc "delete-database <subscription> <database>", "Remove all instances of a database."
321
+ def delete_database(subscription, database)
322
+ delete_db = acquia_api_call "sites/#{subscription}/dbs/#{database}?backup=0", "DELETE"
323
+ success "Database has been successfully deleted." if delete_db["id"]
324
+ end
325
+
326
+ # Public: Copy a database from one environment to another.
327
+ #
328
+ # Returns the status message.
329
+ desc "copy-database <subscription> <database> <source> <destination>", "Copy a database one from environment to another."
330
+ def copy_database(subscription, database, source, destination)
331
+ copy_database = acquia_api_call "sites/#{subscription}/dbs/#{database}/db-copy/#{source}/#{destination}", "POST"
332
+ success "Database #{database} has been copied from #{source} to #{destination}." if copy_database["id"]
333
+ end
334
+
335
+ # Public: Show all the available domains for a subscription.
336
+ #
337
+ # Returns a list of the domains available.
338
+ desc "list-domains <subscription>", "Show all available domains for a subscription."
339
+ option :environment, :aliases => "-e"
340
+ def list_domains(subscription)
341
+ if options[:environment]
342
+ subscription_envs = [options[:environment]]
343
+ else
344
+ subscription_envs = get_acquia_environments(subscription)
345
+ end
346
+
347
+ subscription_envs.each do |environment|
348
+ domains = acquia_api_call "sites/#{subscription}/envs/#{environment}/domains"
349
+ # Got top padding?
350
+ if options[:environment]
351
+ say
352
+ else
353
+ say
354
+ say "Environment: #{environment}"
355
+ end
356
+ domains.each do |domain|
357
+ say "> #{domain["name"]}"
358
+ end
359
+ end
360
+ end
361
+
362
+ # Public: Clear a web cache on a domain.
363
+ #
364
+ # Send off a DELETE request to clear the web cache for a particular domain or
365
+ # environment.
366
+ #
367
+ # Note: Clearing a whole environment is pretty perfomance heavy - use with
368
+ # caution!
369
+ #
370
+ # Returns a status message form the purge request.
371
+ desc "purge-domain <subscription> <environment>", "Clear the web cache of an environment or domain."
372
+ option :environment, :aliases => "-e"
373
+ option :domain, :aliases => "-d"
374
+ def purge_domain(subscription, environment)
375
+ domain = options[:domain]
376
+
377
+ # If the domain is not defined, we are going to clear a whole environmnt.
378
+ # This can have severe performance impacts on your environments. We need to
379
+ # be sure this is defintely what you want to do.
380
+ if domain
381
+ purge_acquia_domain(subscription, environment, domain)
382
+ else
383
+ all_env_clear = ask "You are about to clear all domains in the #{environment} environment. Are you sure? (y/n)"
384
+ # Last chance to bail out.
385
+ if all_env_clear == "y"
386
+ domains = acquia_api_call "sites/#{subscription}/envs/#{environment}/domains"
387
+ domains.each do |domain|
388
+ purge_acquia_domain("#{subscription}", "#{environment}", "#{domain["name"]}")
389
+ end
390
+ else
391
+ info "Ok, no action has been taken."
392
+ end
393
+ end
394
+ end
395
+
396
+ # Public: Get all the SVN users.
397
+ #
398
+ # Returns a list of the SVN users.
399
+ desc "list-svn-users <subscription>", "See all the SVN users on a subscription."
400
+ def list_svn_users(subscription)
401
+ svn_users = acquia_api_call "sites/#{subscription}/svnusers"
402
+
403
+ svn_users.each do |user|
404
+ say
405
+ say "> ID: #{user["id"]}"
406
+ say "> Name: #{user["username"]}"
407
+ end
408
+ end
409
+
410
+ desc "delete-svn-user <subscription> <userid>", "Delete a SVN user."
411
+ def delete_svn_user(subscription, userid)
412
+ svn_user_removal = acquia_api_call "sites/#{subscription}/svnusers/#{userid}", "DELETE"
413
+ success "#{userid} has been removed from the SVN users." if svn_user_removal["id"]
414
+ end
415
+
416
+ # Public: Get users on the subscription.
417
+ #
418
+ # Display a user listing with a truncated SSH key for security and ease of
419
+ # use.
420
+ #
421
+ # Returns a list of users and truncated SSH keys.
422
+ desc "list-ssh-users <subscription>", "Find out who has access and SSH keys."
423
+ def list_ssh_users(subscription)
424
+ users = acquia_api_call "sites/#{subscription}/sshkeys"
425
+
426
+ users.each do |user|
427
+ say
428
+ say "> ID: #{user["id"]}"
429
+ say "> Name: #{user["nickname"]}"
430
+ say "> Key: #{truncate_ssh_key user["ssh_pub_key"]}"
431
+ end
432
+ end
433
+
434
+ # Public: Copy files from one environment to another.
435
+ #
436
+ # Returns a status message.
437
+ desc "copy-files <subscription> <source> <destination>", "Copy files from one environment to another."
438
+ def copy_files(subscription, source, destination)
439
+ file_copy = acquia_api_call "/sites/#{subscription}/files-copy/#{source}/#{target}", "POST"
440
+ success "File copy from #{source} to #{destination} has started." if file_copy["id"]
441
+ end
442
+ end
443
+
444
+ Acquia.start
@@ -0,0 +1,4 @@
1
+ require "acquia_toolbelt/version"
2
+
3
+ module AcquiaToolbelt
4
+ end
@@ -0,0 +1,3 @@
1
+ module AcquiaToolbelt
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,53 @@
1
+ # Acquia Toolbelt
2
+
3
+ The Acquia Toolbelt is a CLI tool for using the Acquia Cloud API. Some of the
4
+ features include getting information around your servers, subscription,
5
+ databases, tasks and domains.
6
+
7
+ ## Installation
8
+
9
+ Installation is available (and recommended) via Ruby Gems.
10
+
11
+ ```
12
+ $ gem install acquia_toolbelt
13
+ ```
14
+
15
+ Once installed, the toolbelt is accessible via invoking `acquia` within the command line.
16
+
17
+ ## Usage
18
+
19
+ You can see all available commands by running `acquia` without any commands or parameters. Additonally, more information on each command is available via `acquia help [COMMAND]`.
20
+
21
+ ```
22
+ $ acquia
23
+
24
+ Commands:
25
+ acquia add-database <subscription> <database> # Create a new database instance.
26
+ acquia copy-database <subscription> <database> <source> <destination> # Copy a database one from environment to another.
27
+ acquia copy-files <subscription> <source> <destination> # Copy files from one environment to another.
28
+ acquia delete-database <subscription> <database> # Remove all instances of a database.
29
+ acquia delete-svn-user <subscription> <userid> # Delete a SVN user.
30
+ acquia help [COMMAND] # Describe available commands or one specific command
31
+ acquia list-database-backups <subscription> <environment> <database> # Get all backups for a database instance.
32
+ acquia list-databases <subscription> # See information about the databases within a subscription.
33
+ acquia list-domains <subscription> # Show all available domains for a subscription.
34
+ acquia list-environments <subscription> # Provide an overview of the environments in your subscription.
35
+ acquia list-servers <subscription> # Get a list of servers specifications for an environment.
36
+ acquia list-ssh-users <subscription> # Find out who has access and SSH keys.
37
+ acquia list-subscriptions # Find all subscriptions that you have access to.
38
+ acquia list-svn-users <subscription> # See all the SVN users on a subscription.
39
+ acquia login # Login to your Acquia account.
40
+ acquia purge-domain <subscription> # Clear the web cache of an environment or domain.
41
+ ```
42
+
43
+ ## Getting started
44
+
45
+ Before you can start using any commands, you need to first run `acquia login`. This will write your login details to a local netrc file so that you won't be prompted for login details every time a request is made. After that, the sky is the limit!
46
+
47
+ ## Contributing
48
+
49
+ 1. Fork it
50
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
51
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
52
+ 4. Push to the branch (`git push origin my-new-feature`)
53
+ 5. Create new Pull Request
metadata ADDED
@@ -0,0 +1,153 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: acquia_toolbelt
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Jacob Bednarz
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-09-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 0.18.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 0.18.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: netrc
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.7.7
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.7.7
41
+ - !ruby/object:Gem::Dependency
42
+ name: highline
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 1.6.19
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 1.6.19
55
+ - !ruby/object:Gem::Dependency
56
+ name: faraday
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.8.8
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 0.8.8
69
+ - !ruby/object:Gem::Dependency
70
+ name: json
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 1.8.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 1.8.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: bundler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: '1.3'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: '1.3'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: A CLI tool for interacting with Acquia's hosting services.
112
+ email:
113
+ - jacob.bednarz@gmail.com
114
+ executables:
115
+ - acquia
116
+ extensions: []
117
+ extra_rdoc_files: []
118
+ files:
119
+ - .gitignore
120
+ - Gemfile
121
+ - LICENSE
122
+ - Rakefile
123
+ - acquia_toolbelt-0.0.1.gem
124
+ - acquia_toolbelt.gemspec
125
+ - bin/acquia
126
+ - lib/acquia_toolbelt.rb
127
+ - lib/acquia_toolbelt/version.rb
128
+ - readme.md
129
+ homepage: https://github.com/jacobbednarz/acquia-toolbelt
130
+ licenses:
131
+ - MIT
132
+ metadata: {}
133
+ post_install_message:
134
+ rdoc_options: []
135
+ require_paths:
136
+ - lib
137
+ required_ruby_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ required_rubygems_version: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ! '>='
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ requirements: []
148
+ rubyforge_project:
149
+ rubygems_version: 2.0.3
150
+ signing_key:
151
+ specification_version: 4
152
+ summary: ''
153
+ test_files: []