right_link 5.9.1 → 5.9.2
Sign up to get free protection for your applications and to get access to all the features.
- data/RELEASES.rdoc +40 -5
- data/actors/instance_setup.rb +1 -1
- data/bin/cook_runner +1 -0
- data/lib/instance/cook/audit_logger.rb +1 -3
- data/lib/instance/cook/cook.rb +12 -0
- data/lib/instance/cook/cook_state.rb +6 -13
- data/lib/instance/cook/executable_sequence.rb +8 -0
- data/lib/instance/cook/repose_downloader.rb +5 -5
- data/lib/right_link/version.rb +4 -0
- data/scripts/agent_checker.rb +13 -19
- data/scripts/agent_controller.rb +4 -9
- data/scripts/agent_deployer.rb +1 -1
- data/scripts/bundle_runner.rb +10 -49
- data/scripts/cloud_controller.rb +8 -5
- data/scripts/command_helper.rb +101 -0
- data/scripts/log_level_manager.rb +37 -25
- data/scripts/ohai_runner.rb +1 -1
- data/scripts/reenroller.rb +9 -13
- data/scripts/server_importer.rb +9 -43
- data/scripts/shutdown_client.rb +9 -49
- data/scripts/system_configurator.rb +4 -10
- data/scripts/tagger.rb +96 -168
- data/scripts/thunker.rb +12 -33
- metadata +6 -4
data/scripts/tagger.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# === Synopsis:
|
2
|
-
# RightScale Tagger (rs_tag) - (c) 2009-
|
2
|
+
# RightScale Tagger (rs_tag) - (c) 2009-2013 RightScale Inc
|
3
3
|
#
|
4
4
|
# Tagger allows listing, adding and removing tags on the current instance and
|
5
5
|
# querying for all instances with a given set of tags
|
@@ -43,10 +43,12 @@ require 'trollop'
|
|
43
43
|
require 'right_agent'
|
44
44
|
require 'right_agent/scripts/usage'
|
45
45
|
require 'right_agent/scripts/common_parser'
|
46
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'command_helper'))
|
46
47
|
|
47
48
|
module RightScale
|
48
49
|
|
49
50
|
class Tagger
|
51
|
+
include CommandHelper
|
50
52
|
|
51
53
|
TAG_REQUEST_TIMEOUT = 2 * 60 # synchronous tag requests need a long timeout
|
52
54
|
|
@@ -59,101 +61,103 @@ module RightScale
|
|
59
61
|
end
|
60
62
|
end
|
61
63
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
if options[:verbose]
|
71
|
-
log = Logger.new(STDERR)
|
64
|
+
def get_tags(res, options)
|
65
|
+
raise TagError.new("List current server tags failed: #{res.inspect}", 45) unless res.kind_of?(Array)
|
66
|
+
if res.empty?
|
67
|
+
if options[:die]
|
68
|
+
raise TagError.new('No server tags found', 44)
|
69
|
+
else
|
70
|
+
write_output(format_output([], options[:format]))
|
71
|
+
end
|
72
72
|
else
|
73
|
-
|
73
|
+
write_output(format_output(res, options[:format]))
|
74
74
|
end
|
75
|
-
|
75
|
+
end
|
76
76
|
|
77
|
-
|
78
|
-
|
79
|
-
|
77
|
+
def query_tags(res, options)
|
78
|
+
r = serialize_operation_result(res)
|
79
|
+
raise TagError.new("Query tags failed: #{r.inspect}", 46) unless r.kind_of?(OperationResult)
|
80
|
+
if r.success?
|
81
|
+
if r.content.empty?
|
82
|
+
if options[:die]
|
83
|
+
raise TagError.new("No servers with tags #{options[:tags].inspect}", 44)
|
84
|
+
else
|
85
|
+
write_output(format_output({}, options[:format]))
|
86
|
+
end
|
87
|
+
else
|
88
|
+
write_output(format_output(r.content, options[:format]))
|
89
|
+
end
|
90
|
+
else
|
91
|
+
raise TagError.new("Query tags failed: #{r.content}", 53)
|
80
92
|
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def add_tag(res, options)
|
96
|
+
r = serialize_operation_result(res)
|
97
|
+
raise TagError.new("Add tag failed: #{r.inspect}", 47) unless r.kind_of?(OperationResult)
|
98
|
+
if r.success?
|
99
|
+
write_error("Successfully added tag #{options[:tag]}")
|
100
|
+
else
|
101
|
+
raise TagError.new("Add tag failed: #{r.content}", 54)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def remove_tag(res, options)
|
106
|
+
r = serialize_operation_result(res)
|
107
|
+
raise TagError.new("Remove tag failed: #{r.inspect}", 48) unless r.kind_of?(OperationResult)
|
108
|
+
if r.success?
|
109
|
+
write_error("Successfully removed tag #{options[:tag]}")
|
110
|
+
else
|
111
|
+
raise TagError.new("Remove tag failed: #{r.content}", 55)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def build_cmd(options)
|
81
116
|
cmd = { :name => options[:action] }
|
82
117
|
cmd[:tag] = options[:tag] if options[:tag]
|
83
118
|
cmd[:tags] = options[:tags] if options[:tags]
|
84
119
|
cmd[:query] = options[:query] if options[:query]
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
if options[:die]
|
94
|
-
raise TagError.new('No server tags found', 44)
|
95
|
-
else
|
96
|
-
write_output(format_output([], options[:format]))
|
97
|
-
@disposition = 0
|
98
|
-
end
|
99
|
-
else
|
100
|
-
write_output(format_output(res, options[:format]))
|
101
|
-
@disposition = 0
|
102
|
-
end
|
103
|
-
when :query_tags
|
104
|
-
r = serialize_operation_result(res)
|
105
|
-
raise TagError.new("Query tags failed: #{r.inspect}", 46) unless r.kind_of?(OperationResult)
|
106
|
-
if r.success?
|
107
|
-
if r.content.empty?
|
108
|
-
if options[:die]
|
109
|
-
raise TagError.new("No servers with tags #{options[:tags].inspect}", 44)
|
110
|
-
else
|
111
|
-
write_output(format_output({}, options[:format]))
|
112
|
-
@disposition = 0
|
113
|
-
end
|
114
|
-
else
|
115
|
-
write_output(format_output(r.content, options[:format]))
|
116
|
-
@disposition = 0
|
117
|
-
end
|
118
|
-
else
|
119
|
-
raise TagError.new("Query tags failed: #{r.content}", 53)
|
120
|
-
end
|
121
|
-
when :add_tag
|
122
|
-
r = serialize_operation_result(res)
|
123
|
-
raise TagError.new("Add tag failed: #{r.inspect}", 47) unless r.kind_of?(OperationResult)
|
124
|
-
if r.success?
|
125
|
-
write_error("Successfully added tag #{options[:tag]}")
|
126
|
-
@disposition = 0
|
127
|
-
else
|
128
|
-
raise TagError.new("Add tag failed: #{r.content}", 54)
|
129
|
-
end
|
130
|
-
when :remove_tag
|
131
|
-
r = serialize_operation_result(res)
|
132
|
-
raise TagError.new("Remove tag failed: #{r.inspect}", 48) unless r.kind_of?(OperationResult)
|
133
|
-
if r.success?
|
134
|
-
write_error("Successfully removed tag #{options[:tag]}")
|
135
|
-
@disposition = 0
|
136
|
-
else
|
137
|
-
raise TagError.new("Remove tag failed: #{r.content}", 55)
|
138
|
-
end
|
139
|
-
else
|
140
|
-
write_error(res)
|
141
|
-
@disposition = 0
|
142
|
-
end
|
143
|
-
rescue Exception => e
|
144
|
-
@disposition = e
|
145
|
-
end
|
146
|
-
end
|
147
|
-
rescue Exception => e
|
148
|
-
@disposition = e
|
120
|
+
cmd
|
121
|
+
end
|
122
|
+
|
123
|
+
def set_logger(options)
|
124
|
+
if options[:verbose]
|
125
|
+
log = Logger.new(STDERR)
|
126
|
+
else
|
127
|
+
log = Logger.new(StringIO.new)
|
149
128
|
end
|
129
|
+
RightScale::Log.force_logger(log)
|
130
|
+
end
|
150
131
|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
132
|
+
def missing_argument
|
133
|
+
write_error("Missing argument, rs_tag --help for additional information")
|
134
|
+
fail(1)
|
135
|
+
end
|
136
|
+
|
137
|
+
# Manage instance tags
|
138
|
+
#
|
139
|
+
# === Parameters
|
140
|
+
# options(Hash):: Hash of options as defined in +parse_args+
|
141
|
+
#
|
142
|
+
# === Return
|
143
|
+
# true:: Always return true
|
144
|
+
def run(options)
|
145
|
+
check_privileges
|
146
|
+
set_logger(options)
|
147
|
+
missing_argument unless options.include?(:action)
|
148
|
+
send_command(build_cmd(options), options[:verbose], options[:timeout]) do |res|
|
149
|
+
case options[:action]
|
150
|
+
when :get_tags
|
151
|
+
get_tags(res, options)
|
152
|
+
when :query_tags
|
153
|
+
query_tags(res, options)
|
154
|
+
when :add_tag
|
155
|
+
add_tag(res, options)
|
156
|
+
when :remove_tag
|
157
|
+
remove_tag(res, options)
|
155
158
|
else
|
156
|
-
|
159
|
+
write_error(res)
|
160
|
+
end
|
157
161
|
end
|
158
162
|
rescue SystemExit => e
|
159
163
|
raise e
|
@@ -174,11 +178,11 @@ module RightScale
|
|
174
178
|
opt :verbose
|
175
179
|
opt :die, "", :short => "-e"
|
176
180
|
opt :format, "", :type => :string, :default => "json"
|
177
|
-
opt :timeout, "", :type => :int
|
181
|
+
opt :timeout, "", :type => :int, :default => TAG_REQUEST_TIMEOUT
|
178
182
|
version ""
|
179
183
|
end
|
180
184
|
|
181
|
-
|
185
|
+
parse do
|
182
186
|
options = parser.parse
|
183
187
|
options[:action] = :get_tags if options.delete(:list)
|
184
188
|
if options[:add]
|
@@ -204,17 +208,6 @@ module RightScale
|
|
204
208
|
raise Trollop::CommandlineError, "Unknown output format #{options[:format]}"
|
205
209
|
end
|
206
210
|
options
|
207
|
-
rescue Trollop::VersionNeeded
|
208
|
-
write_output(version)
|
209
|
-
succeed
|
210
|
-
rescue Trollop::HelpNeeded
|
211
|
-
write_output(Usage.scan(__FILE__))
|
212
|
-
succeed
|
213
|
-
rescue Trollop::CommandlineError => e
|
214
|
-
write_error(e.message + "\nUse rs_tag --help for additional information")
|
215
|
-
fail(1)
|
216
|
-
rescue SystemExit => e
|
217
|
-
raise e
|
218
211
|
end
|
219
212
|
end
|
220
213
|
|
@@ -235,31 +228,6 @@ protected
|
|
235
228
|
STDERR.puts(message)
|
236
229
|
end
|
237
230
|
|
238
|
-
# Creates a command client and sends the given payload.
|
239
|
-
#
|
240
|
-
# === Parameters
|
241
|
-
# @param [Hash] cmd as a payload hash
|
242
|
-
# @param [TrueClass, FalseClass] verbose flag
|
243
|
-
# @param [TrueClass, FalseClass] timeout or nil
|
244
|
-
#
|
245
|
-
# === Block
|
246
|
-
# @yield [response] callback for response
|
247
|
-
# @yieldparam response [Object] response of any type
|
248
|
-
def send_command(cmd, verbose, timeout, &callback)
|
249
|
-
config_options = ::RightScale::AgentConfig.agent_options('instance')
|
250
|
-
listen_port = config_options[:listen_port]
|
251
|
-
raise ::ArgumentError.new('Could not retrieve agent listen port') unless listen_port
|
252
|
-
client = ::RightScale::CommandClient.new(listen_port, config_options[:cookie])
|
253
|
-
timeout ||= TAG_REQUEST_TIMEOUT
|
254
|
-
client.send_command(cmd, verbose, timeout, &callback)
|
255
|
-
true
|
256
|
-
end
|
257
|
-
|
258
|
-
def serialize_operation_result(res)
|
259
|
-
command_serializer = ::RightScale::Serializer.new
|
260
|
-
::RightScale::OperationResult.from_results(command_serializer.load(res))
|
261
|
-
end
|
262
|
-
|
263
231
|
# Splits the TAG_LIST parameter on space unless an equals is present in
|
264
232
|
# order to support both the "x:y a:b" and the "x:y=a b c" (tag value
|
265
233
|
# contains space(s)) cases. the "x:y=a b c:d=x y" case is ambiguous and will
|
@@ -302,56 +270,16 @@ protected
|
|
302
270
|
end
|
303
271
|
end
|
304
272
|
|
305
|
-
# Exit with success.
|
306
|
-
#
|
307
|
-
# === Return
|
308
|
-
# R.I.P. does not return
|
309
|
-
def succeed
|
310
|
-
exit(0)
|
311
|
-
end
|
312
|
-
|
313
|
-
# Print error on console and exit abnormally
|
314
|
-
#
|
315
|
-
# === Parameter
|
316
|
-
# reason(Exception|String|Integer):: Exception, error message or numeric failure code
|
317
|
-
#
|
318
|
-
# === Options
|
319
|
-
# :print_usage(Boolean):: Whether script usage should be printed, default to false
|
320
|
-
#
|
321
|
-
# === Return
|
322
|
-
# R.I.P. does not return
|
323
|
-
def fail(reason=nil, options={})
|
324
|
-
case reason
|
325
|
-
when TagError
|
326
|
-
write_error(reason.message)
|
327
|
-
code = reason.code
|
328
|
-
when Errno::EACCES
|
329
|
-
write_error(reason.message)
|
330
|
-
write_error("Try elevating privilege (sudo/runas) before invoking this command.")
|
331
|
-
code = 2
|
332
|
-
when Exception
|
333
|
-
write_error(reason.message)
|
334
|
-
code = 50
|
335
|
-
when String
|
336
|
-
write_error(reason)
|
337
|
-
code = 50
|
338
|
-
when Integer
|
339
|
-
code = reason
|
340
|
-
else
|
341
|
-
code = 1
|
342
|
-
end
|
343
|
-
|
344
|
-
write_output(Usage.scan(__FILE__)) if options[:print_usage]
|
345
|
-
exit(code)
|
346
|
-
end
|
347
|
-
|
348
273
|
# Version information
|
349
274
|
#
|
350
275
|
# === Return
|
351
276
|
# (String):: Version information
|
352
277
|
def version
|
353
|
-
|
354
|
-
|
278
|
+
"rs_tag #{right_link_version} - RightLink's tagger (c) 2009-2013 RightScale"
|
279
|
+
end
|
280
|
+
|
281
|
+
def usage
|
282
|
+
Usage.scan(__FILE__)
|
355
283
|
end
|
356
284
|
|
357
285
|
end # Tagger
|
data/scripts/thunker.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# === Synopsis:
|
2
|
-
# RightScale Thunker (rs_thunk) - (c)
|
2
|
+
# RightScale Thunker (rs_thunk) - (c) 2013 RightScale Inc
|
3
3
|
#
|
4
4
|
# Thunker allows you to manage custom SSH logins for non root users. It uses the rightscale
|
5
5
|
# user and group RightScale to give privileges for authorization, managing the instance
|
@@ -31,6 +31,7 @@ require 'right_agent/scripts/usage'
|
|
31
31
|
require 'right_agent/scripts/common_parser'
|
32
32
|
require 'right_agent/core_payload_types'
|
33
33
|
require 'right_support/net'
|
34
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'command_helper'))
|
34
35
|
|
35
36
|
basedir = File.expand_path('../..', __FILE__)
|
36
37
|
require File.join(basedir, 'lib', 'instance')
|
@@ -38,6 +39,8 @@ require File.join(basedir, 'lib', 'instance')
|
|
38
39
|
module RightScale
|
39
40
|
|
40
41
|
class Thunker
|
42
|
+
include CommandHelper
|
43
|
+
|
41
44
|
SCP_COMMAND = %r{^[A-Za-z0-9_/]*scp}
|
42
45
|
SFTP_COMMAND = %r{^[A-Za-z0-9_/]*sftp-server}
|
43
46
|
AUDIT_REQUEST_TIMEOUT = 15 # best-effort auditing, but try not to block user
|
@@ -51,6 +54,7 @@ module RightScale
|
|
51
54
|
# === Return
|
52
55
|
# true:: Always return true
|
53
56
|
def run(options)
|
57
|
+
check_privileges
|
54
58
|
@log_sink = StringIO.new
|
55
59
|
@log = Logger.new(@log_sink)
|
56
60
|
RightScale::Log.force_logger(@log)
|
@@ -136,19 +140,8 @@ module RightScale
|
|
136
140
|
version ""
|
137
141
|
end
|
138
142
|
|
139
|
-
|
143
|
+
parse do
|
140
144
|
parser.parse
|
141
|
-
rescue Trollop::VersionNeeded
|
142
|
-
puts version
|
143
|
-
succeed
|
144
|
-
rescue Trollop::HelpNeeded
|
145
|
-
puts Usage.scan(__FILE__)
|
146
|
-
succeed
|
147
|
-
rescue Trollop::CommandlineError => e
|
148
|
-
STDERR.puts e.message + "\nUse rs_thunk --help for additional information"
|
149
|
-
fail(1)
|
150
|
-
rescue SystemExit => e
|
151
|
-
raise e
|
152
145
|
end
|
153
146
|
end
|
154
147
|
|
@@ -171,14 +164,6 @@ module RightScale
|
|
171
164
|
return false
|
172
165
|
end
|
173
166
|
|
174
|
-
# Exit with success.
|
175
|
-
#
|
176
|
-
# === Return
|
177
|
-
# R.I.P. does not return
|
178
|
-
def succeed
|
179
|
-
exit(0)
|
180
|
-
end
|
181
|
-
|
182
167
|
# Print error on console and exit abnormally
|
183
168
|
#
|
184
169
|
# === Parameters
|
@@ -189,10 +174,6 @@ module RightScale
|
|
189
174
|
# R.I.P. does not return
|
190
175
|
def fail(reason=nil, options={})
|
191
176
|
case reason
|
192
|
-
when Errno::EACCES
|
193
|
-
STDERR.puts reason.message
|
194
|
-
STDERR.puts "Try elevating privilege (sudo/runas) before invoking this command."
|
195
|
-
code = 2
|
196
177
|
when Exception
|
197
178
|
STDOUT.puts "Unexpected #{reason.class.name}: #{reason.message}"
|
198
179
|
STDOUT.puts "We apologize for the inconvenience. You may try connecting as root"
|
@@ -229,11 +210,6 @@ module RightScale
|
|
229
210
|
# === Return
|
230
211
|
# Returns true on success, false otherwise
|
231
212
|
def create_audit_entry(email, username, access, command, client_ip=nil)
|
232
|
-
config_options = AgentConfig.agent_options('instance')
|
233
|
-
listen_port = config_options[:listen_port]
|
234
|
-
raise ArgumentError.new('Could not retrieve agent listen port') unless listen_port
|
235
|
-
client = CommandClient.new(listen_port, config_options[:cookie])
|
236
|
-
|
237
213
|
begin
|
238
214
|
hostname = `hostname`.strip
|
239
215
|
rescue Exception => e
|
@@ -269,7 +245,7 @@ module RightScale
|
|
269
245
|
:detail => detail,
|
270
246
|
:category => RightScale::EventCategories::CATEGORY_SECURITY
|
271
247
|
}
|
272
|
-
|
248
|
+
send_command(options, false, AUDIT_REQUEST_TIMEOUT)
|
273
249
|
|
274
250
|
true
|
275
251
|
rescue Exception => e
|
@@ -325,8 +301,11 @@ module RightScale
|
|
325
301
|
# === Return
|
326
302
|
# (String):: Version information
|
327
303
|
def version
|
328
|
-
|
329
|
-
|
304
|
+
"rs_thunk #{right_link_version} - RightLink's thunker (c) 2013 RightScale"
|
305
|
+
end
|
306
|
+
|
307
|
+
def usage
|
308
|
+
Usage.scan(__FILE__)
|
330
309
|
end
|
331
310
|
|
332
311
|
end # Thunker
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: right_link
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 5
|
8
8
|
- 9
|
9
|
-
-
|
10
|
-
version: 5.9.
|
9
|
+
- 2
|
10
|
+
version: 5.9.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- RightScale
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2013-
|
18
|
+
date: 2013-10-07 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -367,12 +367,14 @@ files:
|
|
367
367
|
- lib/repo_conf_generators/rightscale_conf_generators.rb
|
368
368
|
- lib/repo_conf_generators/yum_conf_generators.rb
|
369
369
|
- lib/repo_conf_generators.rb
|
370
|
+
- lib/right_link/version.rb
|
370
371
|
- lib/run_shell.rb
|
371
372
|
- scripts/agent_checker.rb
|
372
373
|
- scripts/agent_controller.rb
|
373
374
|
- scripts/agent_deployer.rb
|
374
375
|
- scripts/bundle_runner.rb
|
375
376
|
- scripts/cloud_controller.rb
|
377
|
+
- scripts/command_helper.rb
|
376
378
|
- scripts/log_level_manager.rb
|
377
379
|
- scripts/ohai_runner.rb
|
378
380
|
- scripts/reenroller.rb
|