rhc 0.83.9 → 0.84.13
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.
- data/Rakefile +4 -1
- data/bin/rhc-chk +20 -10
- data/bin/rhc-create-domain +7 -3
- data/bin/rhc-ctl-app +0 -4
- data/bin/rhc-ctl-domain +210 -0
- data/bin/rhc-domain-info +164 -0
- data/bin/rhc-port-forward +146 -0
- data/bin/rhc-user-info +8 -118
- data/lib/rhc-common.rb +40 -2
- metadata +15 -9
data/Rakefile
CHANGED
|
@@ -24,7 +24,7 @@ spec = Gem::Specification.new do |s|
|
|
|
24
24
|
s.description = %q{The client tools for the OpenShift Express platform that allow for application management.}
|
|
25
25
|
s.files = FileList['lib/**/*.rb', 'bin/*', 'conf/*'].to_a
|
|
26
26
|
s.files += %w(LICENSE README Rakefile)
|
|
27
|
-
s.executables = ['rhc-chk', 'rhc-create-app', 'rhc-create-domain', 'rhc-ctl-app', 'rhc-snapshot', 'rhc-user-info', 'rhc-tail-files']
|
|
27
|
+
s.executables = ['rhc-chk', 'rhc-create-app', 'rhc-create-domain', 'rhc-ctl-domain', 'rhc-ctl-app', 'rhc-snapshot', 'rhc-domain-info', 'rhc-user-info', 'rhc-tail-files', 'rhc-port-forward']
|
|
28
28
|
begin
|
|
29
29
|
# Use Ruby version to target F13, RHEL5, Windows and OSX (assume no Xcode)
|
|
30
30
|
if ENV['JSON_PURE'] or (RUBY_VERSION == "1.8.6" or RUBY_PLATFORM =~ /mswin/ or RUBY_PLATFORM =~ /darwin/)
|
|
@@ -34,6 +34,9 @@ spec = Gem::Specification.new do |s|
|
|
|
34
34
|
end
|
|
35
35
|
end
|
|
36
36
|
s.add_dependency('parseconfig')
|
|
37
|
+
if RUBY_VERSION.to_f == 1.9
|
|
38
|
+
s.add_dependency('test-unit')
|
|
39
|
+
end
|
|
37
40
|
end
|
|
38
41
|
|
|
39
42
|
# Define a :package task that bundles the gem
|
data/bin/rhc-chk
CHANGED
|
@@ -28,9 +28,15 @@ require 'rbconfig'
|
|
|
28
28
|
require 'yaml'
|
|
29
29
|
require 'tempfile'
|
|
30
30
|
|
|
31
|
+
if RUBY_VERSION.to_f == 1.9
|
|
32
|
+
require 'rubygems'
|
|
33
|
+
gem 'test-unit'
|
|
34
|
+
end
|
|
35
|
+
|
|
31
36
|
require 'test/unit'
|
|
32
37
|
require 'test/unit/ui/console/testrunner'
|
|
33
38
|
|
|
39
|
+
|
|
34
40
|
#
|
|
35
41
|
# print help
|
|
36
42
|
#
|
|
@@ -283,11 +289,18 @@ class Test3_SSH < Test::Unit::TestCase
|
|
|
283
289
|
@@local_derived_ssh_pubkey = key_dump.to_s.strip.split(' ')[1]
|
|
284
290
|
|
|
285
291
|
assert_not_nil @@local_derived_ssh_pubkey, error_for(:no_derive)
|
|
286
|
-
|
|
287
292
|
assert_not_nil $user_info, error_for(:no_account)
|
|
288
|
-
remote_ssh_pubkey = $user_info["user_info"]["ssh_key"]
|
|
289
293
|
|
|
290
|
-
|
|
294
|
+
$remote_ssh_pubkeys = []
|
|
295
|
+
additional_ssh_keys = RHC::get_ssh_keys($libra_server, $rhlogin, $password, $http)
|
|
296
|
+
if additional_ssh_keys && additional_ssh_keys.kind_of?(Hash)
|
|
297
|
+
additional_ssh_keys.each do |name, sshkey|
|
|
298
|
+
$remote_ssh_pubkeys.push(sshkey['key'])
|
|
299
|
+
end
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
$remote_ssh_pubkeys.push($user_info["user_info"]["ssh_key"])
|
|
303
|
+
assert $remote_ssh_pubkeys.include?(@@local_derived_ssh_pubkey), error_for(:no_match_pub, @libra_kfile)
|
|
291
304
|
end
|
|
292
305
|
|
|
293
306
|
def test_02_ssh_public_key
|
|
@@ -299,11 +312,8 @@ class Test3_SSH < Test::Unit::TestCase
|
|
|
299
312
|
|
|
300
313
|
assert_not_nil @@local_ssh_pubkey, error_for(:no_pubkey, 'the remote key')
|
|
301
314
|
|
|
302
|
-
assert_not_nil $user_info, error_for(:no_account)
|
|
303
|
-
remote_ssh_pubkey = $user_info["user_info"]["ssh_key"]
|
|
304
|
-
|
|
305
315
|
# Test public key and remote key
|
|
306
|
-
|
|
316
|
+
assert $remote_ssh_pubkeys.include?(@@local_ssh_pubkey), error_for(:no_match_pub, @libra_kfile)
|
|
307
317
|
ensure
|
|
308
318
|
fp.close if fp
|
|
309
319
|
end
|
|
@@ -313,11 +323,11 @@ class Test3_SSH < Test::Unit::TestCase
|
|
|
313
323
|
end
|
|
314
324
|
|
|
315
325
|
def test_06_ssh_agent
|
|
316
|
-
loaded_keys = `ssh-add -L`.to_a
|
|
326
|
+
loaded_keys = `ssh-add -L`.lines.to_a
|
|
317
327
|
# Make sure we can load keys from ssh-agent
|
|
318
328
|
assert !loaded_keys.empty?, error_for(:no_keys_loaded)
|
|
319
329
|
loaded_keys.map!{|key| key.split(' ')[1]}
|
|
320
|
-
|
|
330
|
+
|
|
321
331
|
assert_not_nil @@local_ssh_pubkey, error_for(:no_pubkey, 'the keys in ssh-agent')
|
|
322
332
|
assert loaded_keys.include?(@@local_ssh_pubkey),error_for(:pubkey_not_loaded)
|
|
323
333
|
end
|
|
@@ -455,4 +465,4 @@ $messages = YAML.load <<-EOF
|
|
|
455
465
|
:no_keys_loaded: Either ssh-agent is not running or you do not have any keys loaded
|
|
456
466
|
:pubkey_not_loaded: Your public key is not loaded into a running ssh-agent
|
|
457
467
|
:cant_ssh: "Cannot SSH into your app: %s"
|
|
458
|
-
EOF
|
|
468
|
+
EOF
|
data/bin/rhc-create-domain
CHANGED
|
@@ -216,11 +216,15 @@ else
|
|
|
216
216
|
system("ssh-keygen -t rsa -f '#{ssh_key_file_path}'")
|
|
217
217
|
end
|
|
218
218
|
|
|
219
|
-
|
|
219
|
+
ssh_keyfile_contents = File.open(ssh_pub_key_file_path).gets.chomp.split(' ')
|
|
220
|
+
ssh_key = ssh_keyfile_contents[1]
|
|
221
|
+
ssh_key_type = ssh_keyfile_contents[0]
|
|
220
222
|
|
|
221
223
|
data = {'namespace' => opt['namespace'],
|
|
222
224
|
'rhlogin' => opt['rhlogin'],
|
|
223
|
-
'ssh' => ssh_key
|
|
225
|
+
'ssh' => ssh_key,
|
|
226
|
+
'key_type' => ssh_key_type}
|
|
227
|
+
|
|
224
228
|
if (opt['alter'])
|
|
225
229
|
data[:alter] = true
|
|
226
230
|
not_found_message = "A user with rhlogin '#{opt['rhlogin']}' does not have a registered domain. Be sure to run rhc-create-domain without -a|--alter first."
|
|
@@ -295,4 +299,4 @@ EOF
|
|
|
295
299
|
else
|
|
296
300
|
RHC::print_response_err(response)
|
|
297
301
|
end
|
|
298
|
-
exit 1
|
|
302
|
+
exit 1
|
data/bin/rhc-ctl-app
CHANGED
|
@@ -144,10 +144,6 @@ if opt['command'] and (opt['alias'] and !(opt['command'] =~ /-alias$/)) || ((opt
|
|
|
144
144
|
p_usage
|
|
145
145
|
end
|
|
146
146
|
|
|
147
|
-
if opt["command"] == "threaddump"
|
|
148
|
-
print "NOTE: The threaddump command is only applicable to applications of type jbossas-7.0. The thread dump file will be available via 'rhc-tail-files -f app-name/jbossas-7.0/stdout.log'"
|
|
149
|
-
end
|
|
150
|
-
|
|
151
147
|
password = opt['password']
|
|
152
148
|
if !password
|
|
153
149
|
password = RHC::get_password
|
data/bin/rhc-ctl-domain
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# Copyright 2011 Red Hat, Inc.
|
|
3
|
+
#
|
|
4
|
+
# Permission is hereby granted, free of charge, to any person
|
|
5
|
+
# obtaining a copy of this software and associated documentation files
|
|
6
|
+
# (the "Software"), to deal in the Software without restriction,
|
|
7
|
+
# including without limitation the rights to use, copy, modify, merge,
|
|
8
|
+
# publish, distribute, sublicense, and/or sell copies of the Software,
|
|
9
|
+
# and to permit persons to whom the Software is furnished to do so,
|
|
10
|
+
# subject to the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be
|
|
13
|
+
# included in all copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
19
|
+
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
20
|
+
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
21
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
# SOFTWARE.
|
|
23
|
+
|
|
24
|
+
require 'rhc-common'
|
|
25
|
+
|
|
26
|
+
#
|
|
27
|
+
# print help
|
|
28
|
+
#
|
|
29
|
+
def p_usage
|
|
30
|
+
|
|
31
|
+
puts <<USAGE
|
|
32
|
+
|
|
33
|
+
Usage: #{$0}
|
|
34
|
+
Manage multiple keys for the registered rhcloud user.
|
|
35
|
+
|
|
36
|
+
rhc-ctl-domain -l <rhlogin> [-p <passwd>] (-a <key-name> [-k <ssh-pubkey>] | -r <key-name> | -u <key-name> [-k <ssh-pubkey>])
|
|
37
|
+
|
|
38
|
+
-l|--rhlogin rhlogin Red Hat login (RHN or OpenShift login with OpenShift Express access) (required)
|
|
39
|
+
-p|--password password RHLogin password (optional, will prompt)
|
|
40
|
+
-n|--namespace namespace Namespace for your application(s) (alphanumeric - max #{RHC::DEFAULT_MAX_LENGTH} chars) (required for destroying domain)
|
|
41
|
+
-a|--add-ssh-key key-name Add SSH key to the user account (key-name is the user-specified identifier for the key)
|
|
42
|
+
-r|--remove-ssh-key key-name Remove SSH key from the user account
|
|
43
|
+
-u|--update-ssh-key key-name Update SSH key for the user account
|
|
44
|
+
--destroy Destroys the domain and any added ssh keys
|
|
45
|
+
-k|--ssh key-filepath SSH public key filepath
|
|
46
|
+
--config path Path of alternate config file
|
|
47
|
+
-d|--debug Print Debug info
|
|
48
|
+
-h|--help Show Usage info
|
|
49
|
+
|
|
50
|
+
USAGE
|
|
51
|
+
exit 255
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
begin
|
|
55
|
+
opts = GetoptLong.new(
|
|
56
|
+
["--debug", "-d", GetoptLong::NO_ARGUMENT],
|
|
57
|
+
["--help", "-h", GetoptLong::NO_ARGUMENT],
|
|
58
|
+
["--rhlogin", "-l", GetoptLong::REQUIRED_ARGUMENT],
|
|
59
|
+
["--password", "-p", GetoptLong::REQUIRED_ARGUMENT],
|
|
60
|
+
["--namespace", "-n", GetoptLong::REQUIRED_ARGUMENT],
|
|
61
|
+
["--add-ssh-key", "-a", GetoptLong::REQUIRED_ARGUMENT],
|
|
62
|
+
["--remove-ssh-key", "-r", GetoptLong::REQUIRED_ARGUMENT],
|
|
63
|
+
["--update-ssh-key", "-u", GetoptLong::REQUIRED_ARGUMENT],
|
|
64
|
+
["--destroy", GetoptLong::NO_ARGUMENT],
|
|
65
|
+
["--ssh", "-k", GetoptLong::REQUIRED_ARGUMENT],
|
|
66
|
+
["--config", GetoptLong::REQUIRED_ARGUMENT]
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
command_list = ['add-ssh-key', 'remove-ssh-key', 'update-ssh-key', 'destroy']
|
|
70
|
+
command_count = 0
|
|
71
|
+
opt = {}
|
|
72
|
+
opts.each do |o, a|
|
|
73
|
+
opt[o[2..-1]] = a.to_s
|
|
74
|
+
|
|
75
|
+
# check to see if there are multiple commands
|
|
76
|
+
if command_list.include?(o[2..-1])
|
|
77
|
+
command_count += 1
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
rescue Exception => e
|
|
81
|
+
#puts e.message
|
|
82
|
+
p_usage
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# If provided a config path, check it
|
|
86
|
+
check_cpath(opt)
|
|
87
|
+
|
|
88
|
+
# Pull in configs from files
|
|
89
|
+
libra_server = get_var('libra_server')
|
|
90
|
+
debug = get_var('debug') == 'false' ? nil : get_var('debug')
|
|
91
|
+
opt['rhlogin'] = get_var('default_rhlogin') unless opt['rhlogin']
|
|
92
|
+
|
|
93
|
+
if opt['help']
|
|
94
|
+
p_usage
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
if opt['debug']
|
|
98
|
+
debug = true
|
|
99
|
+
end
|
|
100
|
+
RHC::debug(debug)
|
|
101
|
+
|
|
102
|
+
# Validate for no command or multiple commands being specified
|
|
103
|
+
if command_count == 0
|
|
104
|
+
puts "Missing command! You must specify the operation to perform."
|
|
105
|
+
p_usage
|
|
106
|
+
elsif command_count > 1
|
|
107
|
+
puts "Multiple commands specified! You can only perform one operation at a time."
|
|
108
|
+
p_usage
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
if opt['destroy'] && !RHC::check_namespace(opt['namespace'])
|
|
112
|
+
puts "Missing or invalid namespace! You must specify the namespace in order to destroy it."
|
|
113
|
+
p_usage
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
# This is taken care of by the command_count validation performed earlier
|
|
118
|
+
#if !opt['rhlogin'] || !(opt['add-key'] || opt['remove-key'] || opt['update-key'] || opt['list-keys']) || \
|
|
119
|
+
# (opt['add-key'] && (opt['remove-key'] || opt['update-key'] || opt['list-keys'])) || \
|
|
120
|
+
# (opt['remove-key'] && (opt['add-key'] || opt['update-key'] || opt['list-keys'])) || \
|
|
121
|
+
# (opt['update-key'] && (opt['add-key'] || opt['remove-key'] || opt['list-keys'])) || \
|
|
122
|
+
# (opt['list-keys'] && (opt['add-key'] || opt['remove-key'] || opt['update-key']))
|
|
123
|
+
# p_usage
|
|
124
|
+
#end
|
|
125
|
+
|
|
126
|
+
if !RHC::check_rhlogin(opt['rhlogin']) || \
|
|
127
|
+
(opt['add-ssh-key'] && !RHC::check_key(opt['add-ssh-key'])) || \
|
|
128
|
+
(opt['remove-ssh-key'] && !RHC::check_key(opt['remove-ssh-key'])) || \
|
|
129
|
+
(opt['update-ssh-key'] && !RHC::check_key(opt['update-ssh-key']))
|
|
130
|
+
p_usage
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
password = opt['password']
|
|
134
|
+
if !password
|
|
135
|
+
password = RHC::get_password
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
#
|
|
139
|
+
# Read user public ssh key
|
|
140
|
+
if opt['add-ssh-key'] || opt['update-ssh-key']
|
|
141
|
+
if opt['ssh']
|
|
142
|
+
if File.readable?(opt['ssh'])
|
|
143
|
+
begin
|
|
144
|
+
ssh_keyfile_contents = File.open(opt['ssh']).gets.chomp.split(' ')
|
|
145
|
+
ssh_key = ssh_keyfile_contents[1]
|
|
146
|
+
ssh_key_type = ssh_keyfile_contents[0]
|
|
147
|
+
rescue Exception => e
|
|
148
|
+
puts "Invalid public keyfile format! Please specify a valid user public keyfile."
|
|
149
|
+
exit 1
|
|
150
|
+
end
|
|
151
|
+
else
|
|
152
|
+
puts "Unable to read user public keyfile #{opt['ssh']}"
|
|
153
|
+
exit 1
|
|
154
|
+
end
|
|
155
|
+
else # create key
|
|
156
|
+
key_name = opt['add-ssh-key'] ? opt['add-ssh-key'] : opt['update-ssh-key']
|
|
157
|
+
puts "Generating ssh key pair for user '#{key_name}' in the dir '#{Dir.pwd}/'"
|
|
158
|
+
# Use system for interaction
|
|
159
|
+
system("ssh-keygen -t rsa -f '#{key_name}'")
|
|
160
|
+
ssh_pub_key_file = Dir.pwd + '/' + key_name + '.pub'
|
|
161
|
+
ssh_keyfile_contents = File.open(ssh_pub_key_file).gets.chomp.split(' ')
|
|
162
|
+
ssh_key = ssh_keyfile_contents[1]
|
|
163
|
+
ssh_key_type = ssh_keyfile_contents[0]
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
data = {}
|
|
168
|
+
data[:rhlogin] = opt['rhlogin']
|
|
169
|
+
if opt['add-ssh-key']
|
|
170
|
+
url = URI.parse("https://#{libra_server}/broker/ssh_keys")
|
|
171
|
+
data[:key_name] = opt['add-ssh-key']
|
|
172
|
+
data[:ssh] = ssh_key
|
|
173
|
+
data[:action] = 'add-key'
|
|
174
|
+
data[:key_type] = ssh_key_type
|
|
175
|
+
elsif opt['remove-ssh-key']
|
|
176
|
+
url = URI.parse("https://#{libra_server}/broker/ssh_keys")
|
|
177
|
+
data[:key_name] = opt['remove-ssh-key']
|
|
178
|
+
data[:action] = 'remove-key'
|
|
179
|
+
elsif opt['update-ssh-key']
|
|
180
|
+
url = URI.parse("https://#{libra_server}/broker/ssh_keys")
|
|
181
|
+
data[:key_name] = opt['update-ssh-key']
|
|
182
|
+
data[:ssh] = ssh_key
|
|
183
|
+
data[:action] = 'update-key'
|
|
184
|
+
data[:key_type] = ssh_key_type
|
|
185
|
+
elsif opt['destroy']
|
|
186
|
+
url = URI.parse("https://#{libra_server}/broker/domain")
|
|
187
|
+
data[:delete] = true
|
|
188
|
+
data[:namespace] = opt['namespace']
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
RHC::print_post_data(data)
|
|
192
|
+
json_data = RHC::generate_json(data)
|
|
193
|
+
|
|
194
|
+
response = RHC::http_post(@http, url, json_data, password)
|
|
195
|
+
|
|
196
|
+
if response.code == '200'
|
|
197
|
+
begin
|
|
198
|
+
json_resp = JSON.parse(response.body)
|
|
199
|
+
RHC::update_server_api_v(json_resp)
|
|
200
|
+
RHC::print_response_success(json_resp)
|
|
201
|
+
puts "Success"
|
|
202
|
+
exit 0
|
|
203
|
+
rescue JSON::ParserError
|
|
204
|
+
RHC::print_response_err(response)
|
|
205
|
+
end
|
|
206
|
+
else
|
|
207
|
+
RHC::print_response_err(response)
|
|
208
|
+
end
|
|
209
|
+
puts "Failure"
|
|
210
|
+
exit 1
|
data/bin/rhc-domain-info
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# Copyright 2011 Red Hat, Inc.
|
|
3
|
+
#
|
|
4
|
+
# Permission is hereby granted, free of charge, to any person
|
|
5
|
+
# obtaining a copy of this software and associated documentation files
|
|
6
|
+
# (the "Software"), to deal in the Software without restriction,
|
|
7
|
+
# including without limitation the rights to use, copy, modify, merge,
|
|
8
|
+
# publish, distribute, sublicense, and/or sell copies of the Software,
|
|
9
|
+
# and to permit persons to whom the Software is furnished to do so,
|
|
10
|
+
# subject to the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be
|
|
13
|
+
# included in all copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
19
|
+
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
20
|
+
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
21
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
# SOFTWARE.
|
|
23
|
+
|
|
24
|
+
require 'rhc-common'
|
|
25
|
+
|
|
26
|
+
#
|
|
27
|
+
# print help
|
|
28
|
+
#
|
|
29
|
+
def p_usage
|
|
30
|
+
rhlogin = get_var('default_rhlogin') ? "Default: #{get_var('default_rhlogin')}" : "required"
|
|
31
|
+
puts <<USAGE
|
|
32
|
+
|
|
33
|
+
Usage: #{$0}
|
|
34
|
+
Display information about a user
|
|
35
|
+
|
|
36
|
+
-l|--rhlogin rhlogin Red Hat login (RHN or OpenShift login with OpenShift Express access) (#{rhlogin})
|
|
37
|
+
-p|--password password RHLogin password (optional, will prompt)
|
|
38
|
+
-a|--apps List applications for rhlogin
|
|
39
|
+
-i|--info Show user info
|
|
40
|
+
-d|--debug Print Debug info
|
|
41
|
+
-h|--help Show Usage info
|
|
42
|
+
--config path Path of alternate config file
|
|
43
|
+
--timeout # Timeout, in seconds, for connection
|
|
44
|
+
|
|
45
|
+
USAGE
|
|
46
|
+
exit 255
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
begin
|
|
50
|
+
opts = GetoptLong.new(
|
|
51
|
+
["--debug", "-d", GetoptLong::NO_ARGUMENT],
|
|
52
|
+
["--help", "-h", GetoptLong::NO_ARGUMENT],
|
|
53
|
+
["--apps", "-a", GetoptLong::NO_ARGUMENT],
|
|
54
|
+
["--info", "-i", GetoptLong::NO_ARGUMENT],
|
|
55
|
+
["--rhlogin", "-l", GetoptLong::REQUIRED_ARGUMENT],
|
|
56
|
+
["--config", GetoptLong::REQUIRED_ARGUMENT],
|
|
57
|
+
["--password", "-p", GetoptLong::REQUIRED_ARGUMENT],
|
|
58
|
+
["--timeout", GetoptLong::REQUIRED_ARGUMENT]
|
|
59
|
+
)
|
|
60
|
+
opt = {}
|
|
61
|
+
opts.each do |o, a|
|
|
62
|
+
opt[o[2..-1]] = a.to_s
|
|
63
|
+
end
|
|
64
|
+
rescue Exception => e
|
|
65
|
+
#puts e.message
|
|
66
|
+
p_usage
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# If provided a config path, check it
|
|
70
|
+
check_cpath(opt)
|
|
71
|
+
|
|
72
|
+
# Pull in configs from files
|
|
73
|
+
libra_server = get_var('libra_server')
|
|
74
|
+
debug = get_var('debug') == 'false' ? nil : get_var('debug')
|
|
75
|
+
|
|
76
|
+
if opt["help"]
|
|
77
|
+
p_usage
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
if opt["debug"]
|
|
81
|
+
debug = true
|
|
82
|
+
end
|
|
83
|
+
RHC::debug(debug)
|
|
84
|
+
|
|
85
|
+
RHC::timeout(opt["timeout"] ? opt["timeout"] : get_var('timeout'))
|
|
86
|
+
|
|
87
|
+
opt["rhlogin"] = get_var('default_rhlogin') unless opt["rhlogin"]
|
|
88
|
+
|
|
89
|
+
if !RHC::check_rhlogin(opt['rhlogin'])
|
|
90
|
+
p_usage
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
password = opt['password']
|
|
94
|
+
if !password
|
|
95
|
+
password = RHC::get_password
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
opt['apps'] = true if not opt['info'] and not opt['apps']
|
|
99
|
+
user_info = RHC::get_user_info(libra_server, opt['rhlogin'], password, @http, true)
|
|
100
|
+
|
|
101
|
+
if opt['info']
|
|
102
|
+
ssh_keys = RHC::get_ssh_keys(libra_server, opt['rhlogin'], password, @http)
|
|
103
|
+
|
|
104
|
+
puts "User Info"
|
|
105
|
+
puts "========="
|
|
106
|
+
puts "Namespace: #{user_info['user_info']['namespace']}"
|
|
107
|
+
#puts " UUID: #{user_info['user_info']['uuid']}"
|
|
108
|
+
puts " RHLogin: #{user_info['user_info']['rhlogin']}"
|
|
109
|
+
puts "Primary SSH key: #{user_info['user_info']['ssh_key']}"
|
|
110
|
+
puts "Primary SSH key type: #{user_info['user_info']['ssh_type']}" unless user_info['user_info']['ssh_type'].to_s.strip.length == 0
|
|
111
|
+
|
|
112
|
+
if ssh_keys && ssh_keys.kind_of?(Hash)
|
|
113
|
+
puts ""
|
|
114
|
+
puts "Additional SSH keys"
|
|
115
|
+
puts "==================="
|
|
116
|
+
ssh_keys.each do |name, keyval|
|
|
117
|
+
puts "Name: #{name}"
|
|
118
|
+
puts " Key: #{keyval['key']}"
|
|
119
|
+
puts "Type: #{keyval['type']}"
|
|
120
|
+
puts ""
|
|
121
|
+
end
|
|
122
|
+
puts "Use rhc-ctl-domain for managing additional ssh keys"
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
if opt['apps']
|
|
128
|
+
puts "\n\n" if opt['info']
|
|
129
|
+
|
|
130
|
+
puts "Application Info"
|
|
131
|
+
puts "================"
|
|
132
|
+
unless user_info['app_info'].empty?
|
|
133
|
+
user_info['app_info'].each do |key, val|
|
|
134
|
+
puts key
|
|
135
|
+
puts " Framework: #{val['framework']}"
|
|
136
|
+
puts " Creation: #{val['creation_time']}"
|
|
137
|
+
puts " UUID: #{val['uuid']}"
|
|
138
|
+
puts " Git URL: ssh://#{val['uuid']}@#{key}-#{user_info['user_info']['namespace']}.#{user_info['user_info']['rhc_domain']}/~/git/#{key}.git/"
|
|
139
|
+
puts " Public URL: http://#{key}-#{user_info['user_info']['namespace']}.#{user_info['user_info']['rhc_domain']}/"
|
|
140
|
+
if val['aliases'] && !val['aliases'].empty?
|
|
141
|
+
puts " Aliases: #{val['aliases'].join(', ')}"
|
|
142
|
+
end
|
|
143
|
+
puts ""
|
|
144
|
+
puts " Embedded: "
|
|
145
|
+
if val['embedded'] && !val['embedded'].empty?
|
|
146
|
+
val['embedded'].each do |embed_key, embed_val|
|
|
147
|
+
if embed_val.has_key?('info') && !embed_val['info'].empty?
|
|
148
|
+
puts " #{embed_key} - #{embed_val['info']}"
|
|
149
|
+
else
|
|
150
|
+
puts " #{embed_key}"
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
else
|
|
154
|
+
puts " None"
|
|
155
|
+
end
|
|
156
|
+
puts ""
|
|
157
|
+
end
|
|
158
|
+
else
|
|
159
|
+
puts "No applications found. You can use rhc-create-app to create new applications."
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
exit 0
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# Copyright 2011 Red Hat, Inc.
|
|
3
|
+
#
|
|
4
|
+
# Permission is hereby granted, free of charge, to any person
|
|
5
|
+
# obtaining a copy of this software and associated documentation files
|
|
6
|
+
# (the "Software"), to deal in the Software without restriction,
|
|
7
|
+
# including without limitation the rights to use, copy, modify, merge,
|
|
8
|
+
# publish, distribute, sublicense, and/or sell copies of the Software,
|
|
9
|
+
# and to permit persons to whom the Software is furnished to do so,
|
|
10
|
+
# subject to the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be
|
|
13
|
+
# included in all copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
19
|
+
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
20
|
+
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
21
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
# SOFTWARE.
|
|
23
|
+
|
|
24
|
+
require 'rhc-common'
|
|
25
|
+
|
|
26
|
+
#
|
|
27
|
+
# print help
|
|
28
|
+
#
|
|
29
|
+
def p_usage
|
|
30
|
+
rhlogin = get_var('default_rhlogin') ? "Default: #{get_var('default_rhlogin')}" : "required"
|
|
31
|
+
puts <<USAGE
|
|
32
|
+
|
|
33
|
+
Usage: #{$0}
|
|
34
|
+
Forward remote ports to the workstation
|
|
35
|
+
|
|
36
|
+
-l|--rhlogin rhlogin Red Hat login (RHN or OpenShift login with OpenShift Express access) (#{rhlogin})
|
|
37
|
+
-a|--app Target application (required)
|
|
38
|
+
-p|--password password RHLogin password (optional, will prompt)
|
|
39
|
+
-d|--debug Print Debug info
|
|
40
|
+
-h|--help Show Usage info
|
|
41
|
+
--config path Path of alternate config file
|
|
42
|
+
--timeout # Timeout, in seconds, for connection
|
|
43
|
+
|
|
44
|
+
USAGE
|
|
45
|
+
exit 255
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
begin
|
|
49
|
+
opts = GetoptLong.new(
|
|
50
|
+
["--debug", "-d", GetoptLong::NO_ARGUMENT],
|
|
51
|
+
["--help", "-h", GetoptLong::NO_ARGUMENT],
|
|
52
|
+
["--app", "-a", GetoptLong::REQUIRED_ARGUMENT],
|
|
53
|
+
["--rhlogin", "-l", GetoptLong::REQUIRED_ARGUMENT],
|
|
54
|
+
["--config", GetoptLong::REQUIRED_ARGUMENT],
|
|
55
|
+
["--password", "-p", GetoptLong::REQUIRED_ARGUMENT],
|
|
56
|
+
["--timeout", GetoptLong::REQUIRED_ARGUMENT]
|
|
57
|
+
)
|
|
58
|
+
opt = {}
|
|
59
|
+
opts.each do |o, a|
|
|
60
|
+
opt[o[2..-1]] = a.to_s
|
|
61
|
+
end
|
|
62
|
+
rescue Exception => e
|
|
63
|
+
#puts e.message
|
|
64
|
+
p_usage
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# If provided a config path, check it
|
|
68
|
+
check_cpath(opt)
|
|
69
|
+
|
|
70
|
+
# Pull in configs from files
|
|
71
|
+
libra_server = get_var('libra_server')
|
|
72
|
+
debug = get_var('debug') == 'false' ? nil : get_var('debug')
|
|
73
|
+
|
|
74
|
+
if opt['help'] || !opt['app']
|
|
75
|
+
p_usage
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
if opt['debug']
|
|
79
|
+
debug = true
|
|
80
|
+
end
|
|
81
|
+
RHC::debug(debug)
|
|
82
|
+
|
|
83
|
+
RHC::timeout(opt["timeout"] ? opt["timeout"] : get_var('timeout'))
|
|
84
|
+
|
|
85
|
+
opt['rhlogin'] = get_var('default_rhlogin') unless opt['rhlogin']
|
|
86
|
+
|
|
87
|
+
if !RHC::check_rhlogin(opt['rhlogin'])
|
|
88
|
+
p_usage
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
password = opt['password']
|
|
92
|
+
if !password
|
|
93
|
+
password = RHC::get_password
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
user_info = RHC::get_user_info(libra_server, opt['rhlogin'], password, @http, false)
|
|
97
|
+
|
|
98
|
+
app_name = opt['app']
|
|
99
|
+
|
|
100
|
+
unless user_info['app_info'][app_name]
|
|
101
|
+
puts
|
|
102
|
+
puts "Could not find app '#{app_name}'. Please run rhc-user-info to get a list"
|
|
103
|
+
puts "of your current running applications"
|
|
104
|
+
puts
|
|
105
|
+
exit 101
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
app_uuid = user_info['app_info'][app_name]['uuid']
|
|
109
|
+
namespace = user_info['user_info']['namespace']
|
|
110
|
+
rhc_domain = user_info['user_info']['rhc_domain']
|
|
111
|
+
|
|
112
|
+
puts "Checking available ports..."
|
|
113
|
+
|
|
114
|
+
hosts_and_ports, hosts_and_ports_descriptions = RHC::list_ports(rhc_domain, namespace, app_name, app_uuid, debug)
|
|
115
|
+
|
|
116
|
+
if hosts_and_ports.length == 0
|
|
117
|
+
puts
|
|
118
|
+
puts "No available ports to forward"
|
|
119
|
+
exit 102
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
puts
|
|
123
|
+
|
|
124
|
+
hosts_and_ports_descriptions.each { |description| puts "Binding #{description}..." }
|
|
125
|
+
|
|
126
|
+
ssh_cmd = "ssh -N "
|
|
127
|
+
hosts_and_ports.each { |port| ssh_cmd << "-L #{port}:#{port} " }
|
|
128
|
+
ssh_cmd << "#{app_uuid}@#{app_name}-#{namespace}.#{rhc_domain}"
|
|
129
|
+
|
|
130
|
+
puts ssh_cmd if debug
|
|
131
|
+
puts
|
|
132
|
+
puts "Use ctl + c to stop"
|
|
133
|
+
|
|
134
|
+
begin
|
|
135
|
+
exec ssh_cmd
|
|
136
|
+
rescue SystemCallError
|
|
137
|
+
puts
|
|
138
|
+
puts "Error trying to forward ports. You can try to forward manually by running:"
|
|
139
|
+
puts
|
|
140
|
+
puts ssh_cmd
|
|
141
|
+
puts
|
|
142
|
+
exit 1
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# never
|
|
146
|
+
exit 1
|
data/bin/rhc-user-info
CHANGED
|
@@ -21,127 +21,17 @@
|
|
|
21
21
|
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
22
|
# SOFTWARE.
|
|
23
23
|
|
|
24
|
-
require 'rhc-common'
|
|
25
24
|
|
|
26
|
-
#
|
|
27
|
-
# print help
|
|
28
|
-
#
|
|
29
|
-
def p_usage
|
|
30
|
-
rhlogin = get_var('default_rhlogin') ? "Default: #{get_var('default_rhlogin')}" : "required"
|
|
31
|
-
puts <<USAGE
|
|
32
|
-
|
|
33
|
-
Usage: #{$0}
|
|
34
|
-
Display information about a user
|
|
35
|
-
|
|
36
|
-
-l|--rhlogin rhlogin Red Hat login (RHN or OpenShift login with OpenShift Express access) (#{rhlogin})
|
|
37
|
-
-p|--password password RHLogin password (optional, will prompt)
|
|
38
|
-
-a|--apps List applications for rhlogin
|
|
39
|
-
-i|--info Show user info
|
|
40
|
-
-d|--debug Print Debug info
|
|
41
|
-
-h|--help Show Usage info
|
|
42
|
-
--config path Path of alternate config file
|
|
43
|
-
--timeout # Timeout, in seconds, for connection
|
|
44
|
-
|
|
45
|
-
USAGE
|
|
46
|
-
exit 255
|
|
47
|
-
end
|
|
48
25
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
["--help", "-h", GetoptLong::NO_ARGUMENT],
|
|
53
|
-
["--apps", "-a", GetoptLong::NO_ARGUMENT],
|
|
54
|
-
["--info", "-i", GetoptLong::NO_ARGUMENT],
|
|
55
|
-
["--rhlogin", "-l", GetoptLong::REQUIRED_ARGUMENT],
|
|
56
|
-
["--config", GetoptLong::REQUIRED_ARGUMENT],
|
|
57
|
-
["--password", "-p", GetoptLong::REQUIRED_ARGUMENT],
|
|
58
|
-
["--timeout", GetoptLong::REQUIRED_ARGUMENT]
|
|
59
|
-
)
|
|
60
|
-
opt = {}
|
|
61
|
-
opts.each do |o, a|
|
|
62
|
-
opt[o[2..-1]] = a.to_s
|
|
63
|
-
end
|
|
64
|
-
rescue Exception => e
|
|
65
|
-
#puts e.message
|
|
66
|
-
p_usage
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
# If provided a config path, check it
|
|
70
|
-
check_cpath(opt)
|
|
71
|
-
|
|
72
|
-
# Pull in configs from files
|
|
73
|
-
libra_server = get_var('libra_server')
|
|
74
|
-
debug = get_var('debug') == 'false' ? nil : get_var('debug')
|
|
26
|
+
# print deprecation warning
|
|
27
|
+
puts "Warning: This command is deprecated. Please use rhc-domain-info instead."
|
|
28
|
+
puts""
|
|
75
29
|
|
|
76
|
-
|
|
77
|
-
|
|
30
|
+
args = ""
|
|
31
|
+
ARGV.each do|a|
|
|
32
|
+
args += " #{a}"
|
|
78
33
|
end
|
|
79
34
|
|
|
80
|
-
|
|
81
|
-
debug = true
|
|
82
|
-
end
|
|
83
|
-
RHC::debug(debug)
|
|
84
|
-
|
|
85
|
-
RHC::timeout(opt["timeout"] ? opt["timeout"] : get_var('timeout'))
|
|
86
|
-
|
|
87
|
-
opt["rhlogin"] = get_var('default_rhlogin') unless opt["rhlogin"]
|
|
88
|
-
|
|
89
|
-
if !RHC::check_rhlogin(opt['rhlogin'])
|
|
90
|
-
p_usage
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
password = opt['password']
|
|
94
|
-
if !password
|
|
95
|
-
password = RHC::get_password
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
opt['apps'] = true if not opt['info'] and not opt['apps']
|
|
99
|
-
user_info = RHC::get_user_info(libra_server, opt['rhlogin'], password, @http, true)
|
|
100
|
-
|
|
101
|
-
if opt['info']
|
|
102
|
-
puts "User Info"
|
|
103
|
-
puts "========="
|
|
104
|
-
puts "Namespace: #{user_info['user_info']['namespace']}"
|
|
105
|
-
#puts " UUID: #{user_info['user_info']['uuid']}"
|
|
106
|
-
puts " RHLogin: #{user_info['user_info']['rhlogin']}"
|
|
107
|
-
puts " ssh_key: #{user_info['user_info']['ssh_key']}"
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
if opt['apps']
|
|
111
|
-
puts "\n\n" if opt['info']
|
|
112
|
-
|
|
113
|
-
puts "Application Info"
|
|
114
|
-
puts "================"
|
|
115
|
-
unless user_info['app_info'].empty?
|
|
116
|
-
user_info['app_info'].each do |key, val|
|
|
117
|
-
puts key
|
|
118
|
-
puts " Framework: #{val['framework']}"
|
|
119
|
-
puts " Creation: #{val['creation_time']}"
|
|
120
|
-
puts " UUID: #{val['uuid']}"
|
|
121
|
-
puts " Git URL: ssh://#{val['uuid']}@#{key}-#{user_info['user_info']['namespace']}.#{user_info['user_info']['rhc_domain']}/~/git/#{key}.git/"
|
|
122
|
-
puts " Public URL: http://#{key}-#{user_info['user_info']['namespace']}.#{user_info['user_info']['rhc_domain']}/"
|
|
123
|
-
if val['aliases'] && !val['aliases'].empty?
|
|
124
|
-
puts " Aliases: #{val['aliases'].join(', ')}"
|
|
125
|
-
end
|
|
126
|
-
puts ""
|
|
127
|
-
puts " Embedded: "
|
|
128
|
-
if val['embedded'] && !val['embedded'].empty?
|
|
129
|
-
val['embedded'].each do |embed_key, embed_val|
|
|
130
|
-
if embed_val.has_key?('info') && !embed_val['info'].empty?
|
|
131
|
-
puts " #{embed_key} - #{embed_val['info']}"
|
|
132
|
-
else
|
|
133
|
-
puts " #{embed_key}"
|
|
134
|
-
end
|
|
135
|
-
end
|
|
136
|
-
else
|
|
137
|
-
puts " None"
|
|
138
|
-
end
|
|
139
|
-
puts ""
|
|
140
|
-
end
|
|
141
|
-
else
|
|
142
|
-
puts "No applications found. You can use rhc-create-app to create new applications."
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
end
|
|
35
|
+
system("rhc-domain-info #{args} 2>&1")
|
|
146
36
|
|
|
147
|
-
exit 0
|
|
37
|
+
exit 0
|
data/lib/rhc-common.rb
CHANGED
|
@@ -39,7 +39,7 @@ module RHC
|
|
|
39
39
|
APP_NAME_MAX_LENGTH = 32
|
|
40
40
|
MAX_RETRIES = 7
|
|
41
41
|
DEFAULT_DELAY = 2
|
|
42
|
-
API = "1.1.
|
|
42
|
+
API = "1.1.2"
|
|
43
43
|
PATTERN_VERSION=/\A\d+\.\d+\.\d+\z/
|
|
44
44
|
@mytimeout = 10
|
|
45
45
|
@mydebug = false
|
|
@@ -165,6 +165,10 @@ module RHC
|
|
|
165
165
|
check_field(namespace, 'namespace', DEFAULT_MAX_LENGTH)
|
|
166
166
|
end
|
|
167
167
|
|
|
168
|
+
def self.check_key(keyname)
|
|
169
|
+
check_field(keyname, 'keyname', DEFAULT_MAX_LENGTH)
|
|
170
|
+
end
|
|
171
|
+
|
|
168
172
|
def self.check_field(field, type, max=0)
|
|
169
173
|
if field
|
|
170
174
|
if field =~ /[^0-9a-zA-Z]/
|
|
@@ -243,6 +247,40 @@ module RHC
|
|
|
243
247
|
user_info
|
|
244
248
|
end
|
|
245
249
|
|
|
250
|
+
def self.get_ssh_keys(libra_server, rhlogin, password, net_http)
|
|
251
|
+
data = {'rhlogin' => rhlogin, 'action' => 'list-keys'}
|
|
252
|
+
if @mydebug
|
|
253
|
+
data[:debug] = true
|
|
254
|
+
end
|
|
255
|
+
print_post_data(data)
|
|
256
|
+
json_data = generate_json(data)
|
|
257
|
+
|
|
258
|
+
url = URI.parse("https://#{libra_server}/broker/ssh_keys")
|
|
259
|
+
response = http_post(net_http, url, json_data, password)
|
|
260
|
+
|
|
261
|
+
unless response.code == '200'
|
|
262
|
+
if response.code == '401'
|
|
263
|
+
puts "Invalid user credentials"
|
|
264
|
+
exit 97
|
|
265
|
+
else
|
|
266
|
+
print_response_err(response)
|
|
267
|
+
end
|
|
268
|
+
exit 1
|
|
269
|
+
end
|
|
270
|
+
begin
|
|
271
|
+
json_resp = JSON.parse(response.body)
|
|
272
|
+
rescue JSON::ParserError
|
|
273
|
+
exit 1
|
|
274
|
+
end
|
|
275
|
+
update_server_api_v(json_resp)
|
|
276
|
+
begin
|
|
277
|
+
ssh_keys = (JSON.parse(json_resp['data'].to_s))['keys']
|
|
278
|
+
rescue JSON::ParserError
|
|
279
|
+
exit 1
|
|
280
|
+
end
|
|
281
|
+
ssh_keys
|
|
282
|
+
end
|
|
283
|
+
|
|
246
284
|
def self.get_password
|
|
247
285
|
password = nil
|
|
248
286
|
begin
|
|
@@ -851,4 +889,4 @@ def get_kpfile(kfile, check_exists=true)
|
|
|
851
889
|
kfile_not_found
|
|
852
890
|
end
|
|
853
891
|
return kpfile
|
|
854
|
-
end
|
|
892
|
+
end
|
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rhc
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
hash:
|
|
4
|
+
hash: 341
|
|
5
5
|
prerelease:
|
|
6
6
|
segments:
|
|
7
7
|
- 0
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
version: 0.
|
|
8
|
+
- 84
|
|
9
|
+
- 13
|
|
10
|
+
version: 0.84.13
|
|
11
11
|
platform: ruby
|
|
12
12
|
authors:
|
|
13
13
|
- Red Hat
|
|
@@ -15,7 +15,7 @@ autorequire:
|
|
|
15
15
|
bindir: bin
|
|
16
16
|
cert_chain: []
|
|
17
17
|
|
|
18
|
-
date:
|
|
18
|
+
date: 2012-01-13 00:00:00 Z
|
|
19
19
|
dependencies:
|
|
20
20
|
- !ruby/object:Gem::Dependency
|
|
21
21
|
name: json_pure
|
|
@@ -51,10 +51,13 @@ executables:
|
|
|
51
51
|
- rhc-chk
|
|
52
52
|
- rhc-create-app
|
|
53
53
|
- rhc-create-domain
|
|
54
|
+
- rhc-ctl-domain
|
|
54
55
|
- rhc-ctl-app
|
|
55
56
|
- rhc-snapshot
|
|
57
|
+
- rhc-domain-info
|
|
56
58
|
- rhc-user-info
|
|
57
59
|
- rhc-tail-files
|
|
60
|
+
- rhc-port-forward
|
|
58
61
|
extensions: []
|
|
59
62
|
|
|
60
63
|
extra_rdoc_files: []
|
|
@@ -62,12 +65,15 @@ extra_rdoc_files: []
|
|
|
62
65
|
files:
|
|
63
66
|
- lib/rhc-common.rb
|
|
64
67
|
- bin/rhc-ctl-app
|
|
65
|
-
- bin/rhc-tail-files
|
|
66
|
-
- bin/rhc-user-info
|
|
67
|
-
- bin/rhc-snapshot
|
|
68
|
-
- bin/rhc-chk
|
|
69
68
|
- bin/rhc-create-app
|
|
69
|
+
- bin/rhc-chk
|
|
70
70
|
- bin/rhc-create-domain
|
|
71
|
+
- bin/rhc-domain-info
|
|
72
|
+
- bin/rhc-user-info
|
|
73
|
+
- bin/rhc-port-forward
|
|
74
|
+
- bin/rhc-snapshot
|
|
75
|
+
- bin/rhc-tail-files
|
|
76
|
+
- bin/rhc-ctl-domain
|
|
71
77
|
- conf/express.conf
|
|
72
78
|
- LICENSE
|
|
73
79
|
- README
|