pbox 1.17.2
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 +7 -0
- data/COPYRIGHT +1 -0
- data/LICENSE +11 -0
- data/README.md +40 -0
- data/Rakefile +6 -0
- data/autocomplete/pbox_bash +1639 -0
- data/bin/pbox +37 -0
- data/conf/protonbox.conf +8 -0
- data/features/assets/deploy.tar.gz +0 -0
- data/features/core_feature.rb +178 -0
- data/features/deployments_feature.rb +127 -0
- data/features/domains_feature.rb +49 -0
- data/features/keys_feature.rb +37 -0
- data/features/members_feature.rb +166 -0
- data/lib/rhc/auth/basic.rb +64 -0
- data/lib/rhc/auth/token.rb +102 -0
- data/lib/rhc/auth/token_store.rb +53 -0
- data/lib/rhc/auth.rb +5 -0
- data/lib/rhc/autocomplete.rb +66 -0
- data/lib/rhc/autocomplete_templates/bash.erb +39 -0
- data/lib/rhc/cartridge_helpers.rb +118 -0
- data/lib/rhc/cli.rb +40 -0
- data/lib/rhc/command_runner.rb +186 -0
- data/lib/rhc/commands/account.rb +25 -0
- data/lib/rhc/commands/alias.rb +124 -0
- data/lib/rhc/commands/app.rb +701 -0
- data/lib/rhc/commands/apps.rb +20 -0
- data/lib/rhc/commands/authorization.rb +96 -0
- data/lib/rhc/commands/base.rb +174 -0
- data/lib/rhc/commands/cartridge.rb +326 -0
- data/lib/rhc/commands/deployment.rb +82 -0
- data/lib/rhc/commands/domain.rb +167 -0
- data/lib/rhc/commands/env.rb +142 -0
- data/lib/rhc/commands/git_clone.rb +29 -0
- data/lib/rhc/commands/logout.rb +51 -0
- data/lib/rhc/commands/member.rb +148 -0
- data/lib/rhc/commands/port_forward.rb +197 -0
- data/lib/rhc/commands/server.rb +40 -0
- data/lib/rhc/commands/setup.rb +60 -0
- data/lib/rhc/commands/snapshot.rb +137 -0
- data/lib/rhc/commands/ssh.rb +51 -0
- data/lib/rhc/commands/sshkey.rb +97 -0
- data/lib/rhc/commands/tail.rb +47 -0
- data/lib/rhc/commands/threaddump.rb +14 -0
- data/lib/rhc/commands.rb +396 -0
- data/lib/rhc/config.rb +320 -0
- data/lib/rhc/context_helper.rb +121 -0
- data/lib/rhc/core_ext.rb +202 -0
- data/lib/rhc/coverage_helper.rb +33 -0
- data/lib/rhc/deployment_helpers.rb +88 -0
- data/lib/rhc/exceptions.rb +232 -0
- data/lib/rhc/git_helpers.rb +91 -0
- data/lib/rhc/help_formatter.rb +55 -0
- data/lib/rhc/helpers.rb +477 -0
- data/lib/rhc/highline_extensions.rb +479 -0
- data/lib/rhc/json.rb +51 -0
- data/lib/rhc/output_helpers.rb +260 -0
- data/lib/rhc/rest/activation.rb +11 -0
- data/lib/rhc/rest/alias.rb +42 -0
- data/lib/rhc/rest/api.rb +87 -0
- data/lib/rhc/rest/application.rb +332 -0
- data/lib/rhc/rest/attributes.rb +36 -0
- data/lib/rhc/rest/authorization.rb +8 -0
- data/lib/rhc/rest/base.rb +79 -0
- data/lib/rhc/rest/cartridge.rb +154 -0
- data/lib/rhc/rest/client.rb +650 -0
- data/lib/rhc/rest/deployment.rb +18 -0
- data/lib/rhc/rest/domain.rb +98 -0
- data/lib/rhc/rest/environment_variable.rb +15 -0
- data/lib/rhc/rest/gear_group.rb +16 -0
- data/lib/rhc/rest/httpclient.rb +145 -0
- data/lib/rhc/rest/key.rb +44 -0
- data/lib/rhc/rest/membership.rb +105 -0
- data/lib/rhc/rest/mock.rb +1024 -0
- data/lib/rhc/rest/user.rb +32 -0
- data/lib/rhc/rest.rb +148 -0
- data/lib/rhc/ssh_helpers.rb +378 -0
- data/lib/rhc/tar_gz.rb +51 -0
- data/lib/rhc/usage_templates/command_help.erb +51 -0
- data/lib/rhc/usage_templates/command_syntax_help.erb +11 -0
- data/lib/rhc/usage_templates/help.erb +35 -0
- data/lib/rhc/usage_templates/missing_help.erb +1 -0
- data/lib/rhc/usage_templates/options_help.erb +12 -0
- data/lib/rhc/vendor/okjson.rb +600 -0
- data/lib/rhc/vendor/parseconfig.rb +178 -0
- data/lib/rhc/vendor/sshkey.rb +253 -0
- data/lib/rhc/vendor/zliby.rb +628 -0
- data/lib/rhc/version.rb +5 -0
- data/lib/rhc/wizard.rb +633 -0
- data/lib/rhc.rb +34 -0
- data/spec/coverage_helper.rb +89 -0
- data/spec/direct_execution_helper.rb +338 -0
- data/spec/keys/example.pem +23 -0
- data/spec/keys/example_private.pem +27 -0
- data/spec/keys/server.pem +19 -0
- data/spec/rest_spec_helper.rb +31 -0
- data/spec/rhc/assets/cert.crt +22 -0
- data/spec/rhc/assets/cert_key_rsa +27 -0
- data/spec/rhc/assets/empty.txt +0 -0
- data/spec/rhc/assets/env_vars.txt +7 -0
- data/spec/rhc/assets/env_vars_2.txt +1 -0
- data/spec/rhc/assets/foo.txt +1 -0
- data/spec/rhc/assets/targz_corrupted.tar.gz +1 -0
- data/spec/rhc/assets/targz_sample.tar.gz +0 -0
- data/spec/rhc/auth_spec.rb +442 -0
- data/spec/rhc/cli_spec.rb +188 -0
- data/spec/rhc/command_spec.rb +435 -0
- data/spec/rhc/commands/account_spec.rb +42 -0
- data/spec/rhc/commands/alias_spec.rb +333 -0
- data/spec/rhc/commands/app_spec.rb +754 -0
- data/spec/rhc/commands/apps_spec.rb +39 -0
- data/spec/rhc/commands/authorization_spec.rb +145 -0
- data/spec/rhc/commands/cartridge_spec.rb +641 -0
- data/spec/rhc/commands/deployment_spec.rb +286 -0
- data/spec/rhc/commands/domain_spec.rb +383 -0
- data/spec/rhc/commands/env_spec.rb +493 -0
- data/spec/rhc/commands/git_clone_spec.rb +80 -0
- data/spec/rhc/commands/logout_spec.rb +86 -0
- data/spec/rhc/commands/member_spec.rb +228 -0
- data/spec/rhc/commands/port_forward_spec.rb +217 -0
- data/spec/rhc/commands/server_spec.rb +69 -0
- data/spec/rhc/commands/setup_spec.rb +118 -0
- data/spec/rhc/commands/snapshot_spec.rb +179 -0
- data/spec/rhc/commands/ssh_spec.rb +163 -0
- data/spec/rhc/commands/sshkey_spec.rb +188 -0
- data/spec/rhc/commands/tail_spec.rb +81 -0
- data/spec/rhc/commands/threaddump_spec.rb +84 -0
- data/spec/rhc/config_spec.rb +407 -0
- data/spec/rhc/helpers_spec.rb +524 -0
- data/spec/rhc/highline_extensions_spec.rb +314 -0
- data/spec/rhc/json_spec.rb +30 -0
- data/spec/rhc/rest_application_spec.rb +248 -0
- data/spec/rhc/rest_client_spec.rb +752 -0
- data/spec/rhc/rest_spec.rb +740 -0
- data/spec/rhc/targz_spec.rb +55 -0
- data/spec/rhc/wizard_spec.rb +756 -0
- data/spec/spec_helper.rb +575 -0
- data/spec/wizard_spec_helper.rb +330 -0
- metadata +435 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
require 'rhc/commands/base'
|
|
2
|
+
require 'rhc/deployment_helpers'
|
|
3
|
+
|
|
4
|
+
module RHC::Commands
|
|
5
|
+
class Deployment < Base
|
|
6
|
+
include RHC::DeploymentHelpers
|
|
7
|
+
|
|
8
|
+
summary "Commands for deploying and managing deployments of an application"
|
|
9
|
+
description <<-DESC
|
|
10
|
+
By default ProtonBox applications prepare, distribute, and activate deployments
|
|
11
|
+
on every git push. Alternatively, a user may choose to disable automatic
|
|
12
|
+
deployments and use this 'pbox deployment' set of commands to fully control the
|
|
13
|
+
deployment lifecycle. Use these commands to deploy manually from a git reference
|
|
14
|
+
or from a binary file, list and display deployments and also activate existing
|
|
15
|
+
deployments. Check also 'pbox configure-app' to configure your application to
|
|
16
|
+
deploy manually.
|
|
17
|
+
|
|
18
|
+
DESC
|
|
19
|
+
syntax "<action>"
|
|
20
|
+
default_action :help
|
|
21
|
+
|
|
22
|
+
summary "List the existing deployments of an application"
|
|
23
|
+
description <<-DESC
|
|
24
|
+
List all existing deployments of a given application. Check the 'pbox configure-app'
|
|
25
|
+
command to configure how many deployments are preserved in history.
|
|
26
|
+
|
|
27
|
+
DESC
|
|
28
|
+
syntax "<application>"
|
|
29
|
+
takes_application :argument => true
|
|
30
|
+
alias_action :"deployments", :root_command => true
|
|
31
|
+
def list(app)
|
|
32
|
+
rest_app = find_app
|
|
33
|
+
deployment_activations = rest_app.deployment_activations
|
|
34
|
+
|
|
35
|
+
raise RHC::DeploymentNotFoundException, "No deployments found for application #{app}." if !deployment_activations.present?
|
|
36
|
+
|
|
37
|
+
pager
|
|
38
|
+
|
|
39
|
+
display_deployment_list(deployment_activations)
|
|
40
|
+
0
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
summary "Show details of the given deployment"
|
|
44
|
+
syntax "<deployment_id> --app NAME [--namespace NAME]"
|
|
45
|
+
description <<-DESC
|
|
46
|
+
Display details of the given deployment id.
|
|
47
|
+
|
|
48
|
+
DESC
|
|
49
|
+
takes_application
|
|
50
|
+
argument :id, "The deployment ID to show", ["--id ID"], :optional => false
|
|
51
|
+
def show(id)
|
|
52
|
+
rest_app = find_app
|
|
53
|
+
item = rest_app.deployment_activations.reverse_each.detect{|item| item[:deployment].id == id}
|
|
54
|
+
|
|
55
|
+
raise RHC::DeploymentNotFoundException, "Deployment ID '#{id}' not found for application #{rest_app.name}." if !item.present?
|
|
56
|
+
|
|
57
|
+
display_deployment(item)
|
|
58
|
+
paragraph { say "Use 'pbox show-app #{rest_app.name} --configuration' to check your deployment configurations." }
|
|
59
|
+
0
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
summary "Activate an existing deployment"
|
|
63
|
+
description <<-DESC
|
|
64
|
+
Switch between existing deployments. This command allows you to rollback from one
|
|
65
|
+
deployment to a previous one or activate subsequent deployments. Check the 'pbox
|
|
66
|
+
configure-app' command to configure how many deployments are preserved in history.
|
|
67
|
+
|
|
68
|
+
DESC
|
|
69
|
+
syntax "<deployment_id> --app NAME [--namespace NAME]"
|
|
70
|
+
takes_application
|
|
71
|
+
argument :id, "The deployment ID to activate on the application", ["--id ID"], :optional => false
|
|
72
|
+
def activate(id)
|
|
73
|
+
rest_app = find_app
|
|
74
|
+
|
|
75
|
+
raise RHC::DeploymentsNotSupportedException.new if !rest_app.supports? "DEPLOY"
|
|
76
|
+
|
|
77
|
+
activate_deployment(rest_app, id)
|
|
78
|
+
0
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
require 'rhc/commands/base'
|
|
2
|
+
|
|
3
|
+
module RHC::Commands
|
|
4
|
+
class Domain < Base
|
|
5
|
+
summary "Add or rename the container for your apps"
|
|
6
|
+
syntax "<action>"
|
|
7
|
+
description <<-DESC
|
|
8
|
+
All ProtonBox applications must belong to a domain. The name of the domain
|
|
9
|
+
will be used as part of the public URL for an application.
|
|
10
|
+
|
|
11
|
+
For example, when creating a domain with the name "test", any applications
|
|
12
|
+
created in that domain will have the public URL:
|
|
13
|
+
|
|
14
|
+
http://<appname>-test.protonbox.me
|
|
15
|
+
|
|
16
|
+
Each account may have access to one or more domains shared by others. Depending
|
|
17
|
+
on your plan or configuration, you may be able to create more than one domain.
|
|
18
|
+
|
|
19
|
+
To create your first domain, run 'pbox setup' or 'pbox create-domain'.
|
|
20
|
+
DESC
|
|
21
|
+
default_action :help
|
|
22
|
+
|
|
23
|
+
summary "Create a new container for applications."
|
|
24
|
+
syntax "<namespace>"
|
|
25
|
+
description <<-DESC
|
|
26
|
+
A domain is a container for your applications. Each account may have one
|
|
27
|
+
or more domains (depending on plan), and you may collaborate on applications
|
|
28
|
+
by adding members to your domain.
|
|
29
|
+
|
|
30
|
+
The name of the domain is called its "namespace", and becomes part of the
|
|
31
|
+
application public URLs. For example, when creating a domain with the name "test",
|
|
32
|
+
all applications in that domain will have the public URL:
|
|
33
|
+
|
|
34
|
+
http://<appname>-test.protonbox.me
|
|
35
|
+
|
|
36
|
+
The domain owner may limit the gear sizes available to applications by using the
|
|
37
|
+
'--allowed-gear-sizes' option. If '--no-allowed-gear-sizes' is set, no applications
|
|
38
|
+
can be created in the domain. Older servers may not support this option.
|
|
39
|
+
DESC
|
|
40
|
+
option ['--[no-]allowed-gear-sizes [SIZES]'], 'A comma-delimited list of the gear sizes that will be allowed in this domain.', :optional => true
|
|
41
|
+
argument :namespace, "New domain name (letters and numbers, max 16 chars)", ["-n", "--namespace NAME"]
|
|
42
|
+
def create(namespace)
|
|
43
|
+
say "Creating domain '#{namespace}' ... "
|
|
44
|
+
rest_client.add_domain(namespace, :allowed_gear_sizes => check_allowed_gear_sizes)
|
|
45
|
+
success "done"
|
|
46
|
+
|
|
47
|
+
info "You may now create an application using the 'pbox create-app' command"
|
|
48
|
+
|
|
49
|
+
0
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
summary "Rename a domain (will change application urls)"
|
|
53
|
+
syntax "<old name> <new name>"
|
|
54
|
+
argument :old_namespace, "Existing domain name", []
|
|
55
|
+
argument :new_namespace, "New domain name (letters and numbers, max 16 chars)", ["-n", "--namespace NAME"]
|
|
56
|
+
alias_action :update, :deprecated => true
|
|
57
|
+
def rename(old_namespace, new_namespace)
|
|
58
|
+
domain = rest_client.find_domain(old_namespace)
|
|
59
|
+
|
|
60
|
+
say "Renaming domain '#{domain.name}' to '#{new_namespace}' ... "
|
|
61
|
+
domain.rename(new_namespace)
|
|
62
|
+
success "done"
|
|
63
|
+
|
|
64
|
+
info "Applications in this domain will use the new name in their URL."
|
|
65
|
+
|
|
66
|
+
0
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
summary "Change one or more configuration settings on the domain"
|
|
70
|
+
syntax "<namespace>"
|
|
71
|
+
option ['--[no-]allowed-gear-sizes [SIZES]'], 'A comma-delimited list of the gear sizes that will be allowed in this domain.', :optional => true
|
|
72
|
+
takes_domain :argument => true
|
|
73
|
+
def configure(_)
|
|
74
|
+
domain = find_domain
|
|
75
|
+
payload = {}
|
|
76
|
+
payload[:allowed_gear_sizes] = check_allowed_gear_sizes unless options.allowed_gear_sizes.nil?
|
|
77
|
+
|
|
78
|
+
if payload.present?
|
|
79
|
+
say "Updating domain configuration ... "
|
|
80
|
+
domain.configure(payload)
|
|
81
|
+
success "done"
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
paragraph do
|
|
85
|
+
say format_table("Domain #{domain.name} configuration", get_properties(domain, :allowed_gear_sizes), :delete => true)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
0
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
summary "Display a domain and its applications"
|
|
92
|
+
takes_domain :argument => true
|
|
93
|
+
def show(_)
|
|
94
|
+
domain = find_domain
|
|
95
|
+
|
|
96
|
+
warn "In order to deploy applications, you must create a domain with 'pbox setup' or 'pbox create-domain'." and return 1 unless domain
|
|
97
|
+
|
|
98
|
+
applications = domain.applications(:include => :cartridges)
|
|
99
|
+
display_domain(domain, applications)
|
|
100
|
+
|
|
101
|
+
if applications.present?
|
|
102
|
+
success "You have #{pluralize(applications.length, 'application')} in your domain."
|
|
103
|
+
else
|
|
104
|
+
success "The domain #{domain.name} exists but has no applications. You can use 'pbox create-app' to create a new application."
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
0
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
summary "Display all domains you have access to"
|
|
111
|
+
option ['--mine'], "Display only domains you own"
|
|
112
|
+
option ['--ids'], "Display the unique id of the domain (not supported by all servers)"
|
|
113
|
+
alias_action :domains, :root_command => true
|
|
114
|
+
def list
|
|
115
|
+
domains = rest_client.send(options.mine ? :owned_domains : :domains)
|
|
116
|
+
|
|
117
|
+
warn "In order to deploy applications, you must create a domain with 'pbox setup' or 'pbox create-domain'." and return 1 unless domains.present?
|
|
118
|
+
|
|
119
|
+
domains.each do |d|
|
|
120
|
+
display_domain(d, nil, options.ids)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
success "You have access to #{pluralize(domains.length, 'domain')}."
|
|
124
|
+
|
|
125
|
+
0
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
summary "Delete a domain"
|
|
129
|
+
syntax "<namespace>"
|
|
130
|
+
takes_domain :argument => true
|
|
131
|
+
def delete(_)
|
|
132
|
+
domain = find_domain
|
|
133
|
+
|
|
134
|
+
say "Deleting domain '#{domain.name}' ... "
|
|
135
|
+
domain.destroy
|
|
136
|
+
success "deleted"
|
|
137
|
+
|
|
138
|
+
0
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
summary "Leave a domain (remove your membership)"
|
|
142
|
+
syntax "<namespace>"
|
|
143
|
+
argument :namespace, "Name of the domain", ["-n", "--namespace NAME"]
|
|
144
|
+
def leave(namespace)
|
|
145
|
+
domain = rest_client.find_domain(namespace)
|
|
146
|
+
|
|
147
|
+
say "Leaving domain ... "
|
|
148
|
+
domain.leave
|
|
149
|
+
success "done"
|
|
150
|
+
|
|
151
|
+
0
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
protected
|
|
155
|
+
def check_allowed_gear_sizes
|
|
156
|
+
sizes = options.allowed_gear_sizes
|
|
157
|
+
raise OptionParser::InvalidOption, "The server does not support --allowed-gear-sizes" unless sizes.nil? || rest_client.api.has_param?(:add_domain, 'allowed_gear_sizes')
|
|
158
|
+
if sizes.is_a? String
|
|
159
|
+
sizes.split(',').map(&:strip).map(&:presence)
|
|
160
|
+
elsif sizes == false
|
|
161
|
+
[]
|
|
162
|
+
elsif sizes
|
|
163
|
+
raise OptionParser::InvalidOption, "Provide a comma delimited list of valid gear sizes to --allowed-gear-sizes"
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
require 'rhc/commands/base'
|
|
2
|
+
|
|
3
|
+
module RHC::Commands
|
|
4
|
+
class Env < Base
|
|
5
|
+
summary "Manages user-defined environment variables set on a given application"
|
|
6
|
+
syntax "<action>"
|
|
7
|
+
description <<-DESC
|
|
8
|
+
Manages the user-defined environment variables set on a given
|
|
9
|
+
application. To see a list of all environment variables use the command
|
|
10
|
+
'pbox list-env <application>'. Note that some predefined
|
|
11
|
+
cartridge-level environment variables can also be overriden,
|
|
12
|
+
but most variables provided by gears are read-only.
|
|
13
|
+
|
|
14
|
+
Type 'pbox set-env --help' for more details.
|
|
15
|
+
|
|
16
|
+
DESC
|
|
17
|
+
default_action :help
|
|
18
|
+
alias_action :"app env", :root_command => true
|
|
19
|
+
|
|
20
|
+
summary "Set one or more environment variable(s) to your application"
|
|
21
|
+
description <<-DESC
|
|
22
|
+
Set one or more environment variable(s) to your application.
|
|
23
|
+
Operands of the form 'VARIABLE=VALUE' set the environment
|
|
24
|
+
variable VARIABLE to value VALUE. Example:
|
|
25
|
+
|
|
26
|
+
pbox set-env VARIABLE1=VALUE1 VARIABLE2=VALUE2 -a myapp
|
|
27
|
+
|
|
28
|
+
Environment variables can also be set from a file containing one
|
|
29
|
+
or more VARIABLE=VALUE pairs (one per line). Example:
|
|
30
|
+
|
|
31
|
+
pbox set-env /path/to/file -a myapp
|
|
32
|
+
|
|
33
|
+
VALUE may be empty, in that case 'VARIABLE='. Setting a
|
|
34
|
+
variable to an empty value is different from unsetting it.
|
|
35
|
+
|
|
36
|
+
Some default cartridge-level variables can be overriden, but
|
|
37
|
+
variables provided by gears are read-only.
|
|
38
|
+
|
|
39
|
+
DESC
|
|
40
|
+
syntax "<VARIABLE=VALUE> [... <VARIABLE=VALUE>] [--namespace NAME] [--app NAME]"
|
|
41
|
+
argument :env, "Environment variable name and value pair separated by an equal (=) sign, e.g. VARIABLE=VALUE", ["-e", "--env VARIABLE=VALUE"], :optional => false, :type => :list
|
|
42
|
+
takes_application
|
|
43
|
+
option ["--confirm"], "Pass to confirm setting the environment variable(s)"
|
|
44
|
+
alias_action :add
|
|
45
|
+
def set(env)
|
|
46
|
+
rest_app = find_app
|
|
47
|
+
|
|
48
|
+
with_file = env.index {|item| File.file? item}
|
|
49
|
+
|
|
50
|
+
env_vars = []
|
|
51
|
+
env.each {|item| env_vars.concat(collect_env_vars(item))}
|
|
52
|
+
raise RHC::EnvironmentVariableNotProvidedException.new(
|
|
53
|
+
(with_file ?
|
|
54
|
+
"Environment variable(s) not found in the provided file(s).\n" :
|
|
55
|
+
"Environment variable(s) not provided.\n") <<
|
|
56
|
+
"Please provide at least one environment variable using the syntax VARIABLE=VALUE. VARIABLE can only contain letters, digits and underscore ('_') and can't begin with a digit.") if env_vars.empty?
|
|
57
|
+
|
|
58
|
+
if with_file
|
|
59
|
+
env_vars.each {|item| default_display_env_var(item.name, item.value)}
|
|
60
|
+
confirm_action "Do you want to set these environment variables on '#{rest_app.name}?"
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
say 'Setting environment variable(s) ... '
|
|
64
|
+
rest_app.set_environment_variables(env_vars)
|
|
65
|
+
success 'done'
|
|
66
|
+
|
|
67
|
+
0
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
summary "Remove one or more environment variable(s) currently set to your application"
|
|
71
|
+
description <<-DESC
|
|
72
|
+
Remove one or more environment variable(s) currently set to your
|
|
73
|
+
application. Setting a variable to an empty value is
|
|
74
|
+
different from unsetting it. When unsetting a default cartridge-
|
|
75
|
+
level variable previously overriden, the variable will be set
|
|
76
|
+
back to its default value.
|
|
77
|
+
|
|
78
|
+
DESC
|
|
79
|
+
syntax "<VARIABLE> [... <VARIABLE>] [--namespace NAME] [--app NAME]"
|
|
80
|
+
argument :env, "Name of the environment variable(s), e.g. VARIABLE", ["-e", "--env VARIABLE"], :optional => false, :type => :list
|
|
81
|
+
takes_application
|
|
82
|
+
option ["--confirm"], "Pass to confirm removing the environment variable"
|
|
83
|
+
alias_action :remove
|
|
84
|
+
def unset(env)
|
|
85
|
+
rest_app = find_app
|
|
86
|
+
|
|
87
|
+
warn 'Removing environment variables is a destructive operation that may result in loss of data.'
|
|
88
|
+
|
|
89
|
+
env.each do |e|
|
|
90
|
+
default_display_env_var(e)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
confirm_action "Are you sure you wish to remove the environment variable(s) above from application '#{rest_app.name}'?"
|
|
94
|
+
say 'Removing environment variable(s) ... '
|
|
95
|
+
rest_app.unset_environment_variables(env)
|
|
96
|
+
success 'removed'
|
|
97
|
+
|
|
98
|
+
0
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
summary "List all environment variables set on the application"
|
|
102
|
+
description <<-DESC
|
|
103
|
+
List all user-defined environment variables set on the application.
|
|
104
|
+
Gear-level variables overriden by the 'pbox set-env' command
|
|
105
|
+
will also be listed.
|
|
106
|
+
|
|
107
|
+
DESC
|
|
108
|
+
syntax "<app> [--namespace NAME]"
|
|
109
|
+
takes_application :argument => true
|
|
110
|
+
option ["--table"], "Format the output list as a table"
|
|
111
|
+
option ["--quotes"], "Format the output list with double quotes for env var values"
|
|
112
|
+
def list(app)
|
|
113
|
+
rest_app = find_app
|
|
114
|
+
rest_env_vars = rest_app.environment_variables
|
|
115
|
+
|
|
116
|
+
pager
|
|
117
|
+
|
|
118
|
+
display_env_var_list(rest_env_vars, { :table => options.table, :quotes => options.quotes })
|
|
119
|
+
|
|
120
|
+
0
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
summary "Show the value of one or more environment variable(s) currently set to your application"
|
|
124
|
+
syntax "<VARIABLE> [... <VARIABLE>] [--namespace NAME] [--app NAME]"
|
|
125
|
+
argument :env, "Name of the environment variable(s), e.g. VARIABLE", ["-e", "--env VARIABLE"], :optional => false, :type => :list
|
|
126
|
+
takes_application
|
|
127
|
+
option ["--table"], "Format the output list as a table"
|
|
128
|
+
option ["--quotes"], "Format the output list with double quotes for env var values"
|
|
129
|
+
def show(env)
|
|
130
|
+
rest_app = find_app
|
|
131
|
+
rest_env_vars = rest_app.find_environment_variables(env)
|
|
132
|
+
|
|
133
|
+
pager
|
|
134
|
+
|
|
135
|
+
display_env_var_list(rest_env_vars, { :table => options.table, :quotes => options.quotes })
|
|
136
|
+
|
|
137
|
+
0
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require 'rhc/commands/base'
|
|
2
|
+
require 'rhc/git_helpers'
|
|
3
|
+
|
|
4
|
+
module RHC::Commands
|
|
5
|
+
class GitClone < Base
|
|
6
|
+
summary "Clone and configure an application's repository locally"
|
|
7
|
+
description "This is a convenience wrapper for 'git clone' with the added",
|
|
8
|
+
"benefit of adding configuration data such as the application's",
|
|
9
|
+
"UUID to the local repository. It also automatically",
|
|
10
|
+
"figures out the Git url from the application name so you don't",
|
|
11
|
+
"have to look it up."
|
|
12
|
+
syntax "<app> [--namespace NAME]"
|
|
13
|
+
takes_application :argument => true
|
|
14
|
+
option ["-r", "--repo dir"], "Path to the Git repository (defaults to ./$app_name)"
|
|
15
|
+
alias_action 'app git-clone', :deprecated => true, :root_command => true
|
|
16
|
+
# TODO: Implement default values for arguments once ffranz has added context arguments
|
|
17
|
+
# argument :directory, "The name of a new directory to clone into", [], :default => nil
|
|
18
|
+
def run(app_name)
|
|
19
|
+
rest_app = find_app
|
|
20
|
+
dir = git_clone_application(rest_app)
|
|
21
|
+
success "Your application Git repository has been cloned to '#{system_path(dir)}'"
|
|
22
|
+
|
|
23
|
+
0
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
include RHC::GitHelpers
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
module RHC::Commands
|
|
2
|
+
class Logout < Base
|
|
3
|
+
suppress_wizard
|
|
4
|
+
|
|
5
|
+
summary "End the current session"
|
|
6
|
+
description <<-DESC
|
|
7
|
+
Logout ends your current session on the server and then removes
|
|
8
|
+
all of the local session files. If you are using multiple
|
|
9
|
+
servers and configurations this will remove all of your local
|
|
10
|
+
session files.
|
|
11
|
+
|
|
12
|
+
The --all option will terminate all authorizations on your
|
|
13
|
+
account. Any previously generated authorizations will be
|
|
14
|
+
deleted and external tools that integrate with your account
|
|
15
|
+
will no longer be able to log in.
|
|
16
|
+
DESC
|
|
17
|
+
option '--all', "Remove all authorizations on your account."
|
|
18
|
+
alias_action 'account logout', :root_command => true
|
|
19
|
+
def run
|
|
20
|
+
if options.all
|
|
21
|
+
rest_client.user # force authentication
|
|
22
|
+
say "Deleting all authorizations associated with your account ... "
|
|
23
|
+
begin
|
|
24
|
+
rest_client.delete_authorizations
|
|
25
|
+
success "done"
|
|
26
|
+
rescue RHC::Rest::AuthorizationsNotSupported
|
|
27
|
+
info "not supported"
|
|
28
|
+
end
|
|
29
|
+
elsif token_for_user
|
|
30
|
+
options.noprompt = true
|
|
31
|
+
say "Ending session on server ... "
|
|
32
|
+
begin
|
|
33
|
+
rest_client.delete_authorization(token_for_user)
|
|
34
|
+
success "deleted"
|
|
35
|
+
rescue RHC::Rest::AuthorizationsNotSupported
|
|
36
|
+
info "not supported"
|
|
37
|
+
rescue RHC::Rest::TokenExpiredOrInvalid
|
|
38
|
+
info "already closed"
|
|
39
|
+
rescue => e
|
|
40
|
+
debug_error(e)
|
|
41
|
+
warn e.message
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
0
|
|
46
|
+
ensure
|
|
47
|
+
token_store.clear
|
|
48
|
+
success "All local sessions removed."
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
require 'rhc/commands/base'
|
|
2
|
+
|
|
3
|
+
module RHC::Commands
|
|
4
|
+
class Member < Base
|
|
5
|
+
summary "Manage membership on domains"
|
|
6
|
+
syntax "<action>"
|
|
7
|
+
description <<-DESC
|
|
8
|
+
Teams of developers can collaborate on applications by adding people to
|
|
9
|
+
domains as members: each member has a role (admin, editor, or viewer),
|
|
10
|
+
and those roles determine what the user can do with the domain and the
|
|
11
|
+
applications contained within.
|
|
12
|
+
|
|
13
|
+
Roles:
|
|
14
|
+
|
|
15
|
+
view - able to see information about the domain and its apps, but not make any changes
|
|
16
|
+
edit - create, update, and delete applications, and has Git and SSH access
|
|
17
|
+
admin - can update membership of a domain
|
|
18
|
+
|
|
19
|
+
The default role granted to members when added is 'edit' - use the '--role'
|
|
20
|
+
argument to use another. When adding and removing members, you can use their
|
|
21
|
+
'login' value (typically their email or a short unique name for them) or their
|
|
22
|
+
'id'. Both login and ID are visible via the 'pbox account' command.
|
|
23
|
+
|
|
24
|
+
To see existing members of a domain or application, use:
|
|
25
|
+
|
|
26
|
+
pbox members -n <domain_name> [-a <app_name>]
|
|
27
|
+
|
|
28
|
+
To change the role for a user, simply call the add-member command with the new role. You
|
|
29
|
+
cannot change the role of the owner.
|
|
30
|
+
DESC
|
|
31
|
+
syntax "<action>"
|
|
32
|
+
default_action :help
|
|
33
|
+
|
|
34
|
+
summary "List members of a domain or application"
|
|
35
|
+
syntax "<domain_or_app_name> [-n DOMAIN_NAME] [-a APP_NAME]"
|
|
36
|
+
description <<-DESC
|
|
37
|
+
Show the existing members of a domain or application - you can pass the name
|
|
38
|
+
of your domain with '-n', the name of your application with '-a', or combine
|
|
39
|
+
them in the first argument to the command like:
|
|
40
|
+
|
|
41
|
+
pbox members <domain_name>/[<app_name>]
|
|
42
|
+
|
|
43
|
+
The owner is always listed first. To see the unique ID of members, pass
|
|
44
|
+
'--ids'.
|
|
45
|
+
DESC
|
|
46
|
+
option ['--ids'], "Display the IDs of each member", :optional => true
|
|
47
|
+
takes_application_or_domain :argument => true
|
|
48
|
+
alias_action :members, :root_command => true
|
|
49
|
+
def list(path)
|
|
50
|
+
target = find_app_or_domain(path)
|
|
51
|
+
members = target.members.sort_by{ |m| [m.owner? ? 0 : 1, m.role_weight, m.name] }
|
|
52
|
+
show_name = members.any?{ |m| m.name && m.name != m.login }
|
|
53
|
+
members.map! do |m|
|
|
54
|
+
[
|
|
55
|
+
((m.name || "") if show_name),
|
|
56
|
+
m.login || "",
|
|
57
|
+
m.owner? ? "#{m.role} (owner)" : m.role,
|
|
58
|
+
(m.id if options.ids)
|
|
59
|
+
].compact
|
|
60
|
+
end
|
|
61
|
+
say table(members, :header => [('Name' if show_name), 'Login', 'Role', ("ID" if options.ids)].compact)
|
|
62
|
+
|
|
63
|
+
0
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
summary "Add or update a member on a domain"
|
|
67
|
+
syntax "<login> [<login>...] [-n DOMAIN_NAME] [--role view|edit|admin] [--ids]"
|
|
68
|
+
description <<-DESC
|
|
69
|
+
Adds or updates members on a domain by passing one or more login
|
|
70
|
+
or ids for other people on ProtonBox. The login and ID values for each
|
|
71
|
+
account are displayed in 'pbox account'. To change the role for a user, simply
|
|
72
|
+
call the add-member command with the new role. You cannot change the role of
|
|
73
|
+
the owner.
|
|
74
|
+
|
|
75
|
+
Roles
|
|
76
|
+
view - able to see information about the domain and its apps,
|
|
77
|
+
but not make any changes
|
|
78
|
+
edit - create, update, and delete applications, and has Git
|
|
79
|
+
and SSH access
|
|
80
|
+
admin - can update membership of a domain
|
|
81
|
+
|
|
82
|
+
The default role granted to members when added is 'edit' - use the '--role'
|
|
83
|
+
argument for 'view' or 'admin'.
|
|
84
|
+
|
|
85
|
+
Examples
|
|
86
|
+
pbox add-member sally joe -n mydomain
|
|
87
|
+
Gives the accounts with logins 'sally' and 'joe' edit access on mydomain
|
|
88
|
+
|
|
89
|
+
pbox add-member bob@example.com --role admin -n mydomain
|
|
90
|
+
Gives the account with login 'bob@example.com' admin access on mydomain
|
|
91
|
+
|
|
92
|
+
DESC
|
|
93
|
+
takes_domain
|
|
94
|
+
option ['--ids'], "Treat the arguments as a list of IDs", :optional => true
|
|
95
|
+
option ['-r', '--role ROLE'], "The role to give to each member - view, edit, or admin (default 'edit')", :type => Role, :optional => true
|
|
96
|
+
argument :members, "A list of members logins to add. Pass --ids to treat this as a list of IDs.", [], :type => :list
|
|
97
|
+
def add(members)
|
|
98
|
+
target = find_domain
|
|
99
|
+
role = options.role || 'edit'
|
|
100
|
+
raise ArgumentError, 'You must pass one or more logins or ids to this command' unless members.present?
|
|
101
|
+
say "Adding #{pluralize(members.length, role_name(role))} to #{target.class.model_name.downcase} ... "
|
|
102
|
+
target.update_members(changes_for(members, role))
|
|
103
|
+
success "done"
|
|
104
|
+
|
|
105
|
+
0
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
summary "Remove a member from a domain"
|
|
109
|
+
syntax "<login> [<login>...] [-n DOMAIN_NAME] [--ids]"
|
|
110
|
+
description <<-DESC
|
|
111
|
+
Remove members on a domain by passing one or more login or ids for each
|
|
112
|
+
member you wish to remove. View the list of existing members with
|
|
113
|
+
'pbox members <domain_name>'.
|
|
114
|
+
|
|
115
|
+
Pass '--all' to remove all but the owner from the domain.
|
|
116
|
+
DESC
|
|
117
|
+
takes_domain
|
|
118
|
+
option ['--ids'], "Treat the arguments as a list of IDs"
|
|
119
|
+
option ['--all'], "Remove all members from this domain."
|
|
120
|
+
argument :members, "Member logins to remove from the domain. Pass --ids to treat this as a list of IDs.", [], :type => :list
|
|
121
|
+
def remove(members)
|
|
122
|
+
target = find_domain
|
|
123
|
+
|
|
124
|
+
if options.all
|
|
125
|
+
say "Removing all members from #{target.class.model_name.downcase} ... "
|
|
126
|
+
target.delete_members
|
|
127
|
+
success "done"
|
|
128
|
+
|
|
129
|
+
else
|
|
130
|
+
raise ArgumentError, 'You must pass one or more logins or ids to this command' unless members.present?
|
|
131
|
+
say "Removing #{pluralize(members.length, 'member')} from #{target.class.model_name.downcase} ... "
|
|
132
|
+
target.update_members(changes_for(members, 'none'))
|
|
133
|
+
success "done"
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
0
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
protected
|
|
140
|
+
def changes_for(members, role)
|
|
141
|
+
members.map do |m|
|
|
142
|
+
h = {:role => role}
|
|
143
|
+
h[options.ids ? :id : :login] = m
|
|
144
|
+
h
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|