right_agent 0.6.6 → 0.9.3
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/right_agent/agent.rb +26 -25
- data/lib/right_agent/agent_config.rb +28 -2
- data/lib/right_agent/command/command_constants.rb +2 -2
- data/lib/right_agent/core_payload_types/executable_bundle.rb +3 -21
- data/lib/right_agent/core_payload_types/login_user.rb +19 -4
- data/lib/right_agent/core_payload_types/recipe_instantiation.rb +7 -1
- data/lib/right_agent/core_payload_types/right_script_instantiation.rb +7 -1
- data/lib/right_agent/dispatcher.rb +6 -19
- data/lib/right_agent/idempotent_request.rb +72 -17
- data/lib/right_agent/monkey_patches/ruby_patch.rb +0 -1
- data/lib/right_agent/monkey_patches.rb +0 -1
- data/lib/right_agent/operation_result.rb +27 -4
- data/lib/right_agent/packets.rb +47 -23
- data/lib/right_agent/platform/darwin.rb +33 -2
- data/lib/right_agent/platform/linux.rb +98 -2
- data/lib/right_agent/platform/windows.rb +41 -6
- data/lib/right_agent/platform.rb +11 -2
- data/lib/right_agent/scripts/agent_controller.rb +2 -1
- data/lib/right_agent/scripts/agent_deployer.rb +2 -2
- data/lib/right_agent/scripts/stats_manager.rb +7 -3
- data/lib/right_agent/sender.rb +45 -28
- data/lib/right_agent.rb +2 -5
- data/right_agent.gemspec +5 -3
- data/spec/agent_config_spec.rb +1 -1
- data/spec/agent_spec.rb +26 -20
- data/spec/core_payload_types/login_user_spec.rb +7 -3
- data/spec/idempotent_request_spec.rb +218 -48
- data/spec/operation_result_spec.rb +19 -0
- data/spec/packets_spec.rb +42 -1
- data/spec/platform/darwin.rb +11 -0
- data/spec/platform/linux.rb +23 -0
- data/spec/platform/linux_volume_manager_spec.rb +43 -43
- data/spec/platform/platform_spec.rb +35 -32
- data/spec/platform/windows.rb +11 -0
- data/spec/sender_spec.rb +21 -25
- metadata +47 -40
- data/lib/right_agent/broker_client.rb +0 -686
- data/lib/right_agent/ha_broker_client.rb +0 -1327
- data/lib/right_agent/monkey_patches/amqp_patch.rb +0 -274
- data/lib/right_agent/monkey_patches/ruby_patch/string_patch.rb +0 -107
- data/lib/right_agent/stats_helper.rb +0 -745
- data/spec/broker_client_spec.rb +0 -962
- data/spec/ha_broker_client_spec.rb +0 -1695
- data/spec/monkey_patches/amqp_patch_spec.rb +0 -100
- data/spec/monkey_patches/string_patch_spec.rb +0 -99
- data/spec/stats_helper_spec.rb +0 -686
data/lib/right_agent/packets.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2009-
|
1
|
+
# Copyright (c) 2009-2012 RightScale Inc
|
2
2
|
#
|
3
3
|
# Permission is hereby granted, free of charge, to any person obtaining
|
4
4
|
# a copy of this software and associated documentation files (the
|
@@ -49,6 +49,13 @@ module RightScale
|
|
49
49
|
# Shard scope value meaning restrict sending request only to agents with no shard id
|
50
50
|
GLOBAL = 0
|
51
51
|
|
52
|
+
# Instance variables that are not serialized because they are only used locally
|
53
|
+
NOT_SERIALIZED = ["received_at"]
|
54
|
+
|
55
|
+
# (Float) Time in seconds in Unix-epoch when message was received
|
56
|
+
attr_accessor :received_at
|
57
|
+
|
58
|
+
# (Integer) Size of packet in bytes
|
52
59
|
attr_accessor :size
|
53
60
|
|
54
61
|
def initialize
|
@@ -87,7 +94,11 @@ module RightScale
|
|
87
94
|
def to_msgpack(*a)
|
88
95
|
msg = {
|
89
96
|
'msgpack_class' => self.class.name,
|
90
|
-
'data' => instance_variables.inject({})
|
97
|
+
'data' => instance_variables.inject({}) do |m, ivar|
|
98
|
+
name = ivar.to_s.sub(/@/, '')
|
99
|
+
m[name] = instance_variable_get(ivar) unless NOT_SERIALIZED.include?(name)
|
100
|
+
m
|
101
|
+
end,
|
91
102
|
'size' => nil
|
92
103
|
}.to_msgpack(*a)
|
93
104
|
@size = msg.size
|
@@ -111,7 +122,11 @@ module RightScale
|
|
111
122
|
|
112
123
|
js = {
|
113
124
|
'json_class' => class_name,
|
114
|
-
'data' => instance_variables.inject({})
|
125
|
+
'data' => instance_variables.inject({}) do |m, ivar|
|
126
|
+
name = ivar.to_s.sub(/@/, '')
|
127
|
+
m[name] = instance_variable_get(ivar) unless NOT_SERIALIZED.include?(name)
|
128
|
+
m
|
129
|
+
end
|
115
130
|
}.to_json(*a)
|
116
131
|
@size = js.size
|
117
132
|
js = js.chop + ",\"size\":#{@size}}"
|
@@ -137,7 +152,11 @@ module RightScale
|
|
137
152
|
v = __send__(version) if version
|
138
153
|
v = (v && v != DEFAULT_VERSION) ? " v#{v}" : ""
|
139
154
|
log_msg = "[#{name}#{v}]"
|
140
|
-
duration =
|
155
|
+
duration = if @duration && (filter.nil? || filter.include?(:duration))
|
156
|
+
", #{enough_precision(@duration)} sec"
|
157
|
+
elsif @received_at && (filter.nil? || filter.include?(:local_duration))
|
158
|
+
", #{enough_precision(Time.now.to_f - @received_at)} sec"
|
159
|
+
end
|
141
160
|
log_msg += " (#{@size.to_s.gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1,")} bytes#{duration})" if @size && !@size.to_s.empty?
|
142
161
|
log_msg
|
143
162
|
end
|
@@ -175,6 +194,23 @@ module RightScale
|
|
175
194
|
if id == modified_id then modified_id else "*#{modified_id}" end
|
176
195
|
end
|
177
196
|
|
197
|
+
# Generate log friendly serialized identity for one or more ids
|
198
|
+
# Limit to 1000 bytes
|
199
|
+
#
|
200
|
+
# === Parameters
|
201
|
+
# ids(Array|String):: Serialized identity or array of serialized identities
|
202
|
+
#
|
203
|
+
# === Return
|
204
|
+
# (String):: Log friendly serialized identity
|
205
|
+
def ids_to_s(ids)
|
206
|
+
if ids.is_a?(Array)
|
207
|
+
s = ids.each { |i| id_to_s(i) }.join(', ')
|
208
|
+
s.size > 1000 ? "[#{s[0, 1000]}...]" : "[#{s}]"
|
209
|
+
else
|
210
|
+
id_to_s(ids)
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
178
214
|
# Convert serialized AgentIdentity to compatible format
|
179
215
|
#
|
180
216
|
# === Parameters
|
@@ -209,17 +245,7 @@ module RightScale
|
|
209
245
|
def trace
|
210
246
|
audit_id = self.respond_to?(:payload) && payload.is_a?(Hash) && (payload['audit_id'] || payload[:audit_id])
|
211
247
|
tok = self.respond_to?(:token) && token
|
212
|
-
tr =
|
213
|
-
if audit_id || tok
|
214
|
-
tr = '<'
|
215
|
-
if audit_id
|
216
|
-
tr += audit_id.to_s
|
217
|
-
tr += ':' if tok
|
218
|
-
end
|
219
|
-
tr += tok if tok
|
220
|
-
tr += '>'
|
221
|
-
end
|
222
|
-
tr
|
248
|
+
tr = "<#{audit_id || nil}> <#{tok}>"
|
223
249
|
end
|
224
250
|
|
225
251
|
# Retrieve protocol version of original creator of packet
|
@@ -266,7 +292,7 @@ module RightScale
|
|
266
292
|
# :reply_to(String):: Identity of the node that actor replies to, usually a mapper itself
|
267
293
|
# :selector(Symbol):: Selector used to route the request: :any or :all, defaults to :any,
|
268
294
|
# :all deprecated for version 13 and above
|
269
|
-
# :target(String):: Target recipient
|
295
|
+
# :target(String|Array):: Target recipient(s)
|
270
296
|
# :persistent(Boolean):: Indicates if this request should be saved to persistent storage
|
271
297
|
# by the AMQP broker
|
272
298
|
# :expires_at(Integer|nil):: Time in seconds in Unix-epoch when this request expires and
|
@@ -339,14 +365,14 @@ module RightScale
|
|
339
365
|
log_msg = "#{super(filter, version)} #{trace} #{@type}"
|
340
366
|
log_msg += " #{payload}" if payload
|
341
367
|
log_msg += " from #{id_to_s(@from)}" if filter.nil? || filter.include?(:from)
|
342
|
-
log_msg += ", target #{
|
368
|
+
log_msg += ", target #{ids_to_s(@target)}" if @target && (filter.nil? || filter.include?(:target))
|
343
369
|
log_msg += ", scope #{@scope.inspect}" if @scope && (filter.nil? || filter.include?(:scope))
|
344
370
|
log_msg += ", fanout" if (filter.nil? || filter.include?(:fanout)) && fanout?
|
345
371
|
log_msg += ", reply_to #{id_to_s(@reply_to)}" if @reply_to && (filter.nil? || filter.include?(:reply_to))
|
346
372
|
log_msg += ", tags #{@tags.inspect}" if @tags && !@tags.empty? && (filter.nil? || filter.include?(:tags))
|
347
373
|
log_msg += ", persistent" if @persistent && (filter.nil? || filter.include?(:persistent))
|
348
374
|
log_msg += ", tries #{tries_to_s}" if @tries && !@tries.empty? && (filter.nil? || filter.include?(:tries))
|
349
|
-
log_msg += ", payload #{@payload.inspect}" if filter
|
375
|
+
log_msg += ", payload #{@payload.inspect}" if filter && filter.include?(:payload)
|
350
376
|
log_msg
|
351
377
|
end
|
352
378
|
|
@@ -395,7 +421,7 @@ module RightScale
|
|
395
421
|
# :scope(Hash):: Define behavior that should be used to resolve tag based routing
|
396
422
|
# :token(String):: Generated request id that a mapper uses to identify replies
|
397
423
|
# :selector(Symbol):: Selector used to route the request: :any or :all, defaults to :any
|
398
|
-
# :target(String):: Target recipient
|
424
|
+
# :target(String|Array):: Target recipient(s)
|
399
425
|
# :persistent(Boolean):: Indicates if this request should be saved to persistent storage
|
400
426
|
# by the AMQP broker
|
401
427
|
# :confirm(Boolean):: Whether require confirmation response from mapper containing targets
|
@@ -403,8 +429,6 @@ module RightScale
|
|
403
429
|
# :expires_at(Integer|nil):: Time in seconds in Unix-epoch when this request expires and
|
404
430
|
# is to be ignored by the receiver; value 0 means never expire; defaults to 0
|
405
431
|
# :tags(Array(Symbol)):: List of tags to be used for selecting target for this request
|
406
|
-
# :tries(Array):: List of tokens for previous attempts to send this request (only here
|
407
|
-
# for consistency with Request)
|
408
432
|
# version(Array):: Protocol version of the original creator of the packet followed by the
|
409
433
|
# protocol version of the packet contents to be used when sending
|
410
434
|
# size(Integer):: Size of request in bytes used only for marshalling
|
@@ -473,12 +497,12 @@ module RightScale
|
|
473
497
|
log_msg = "#{super(filter, version)} #{trace} #{@type}"
|
474
498
|
log_msg += " #{payload}" if payload
|
475
499
|
log_msg += " from #{id_to_s(@from)}" if filter.nil? || filter.include?(:from)
|
476
|
-
log_msg += ", target #{
|
500
|
+
log_msg += ", target #{ids_to_s(@target)}" if @target && (filter.nil? || filter.include?(:target))
|
477
501
|
log_msg += ", scope #{@scope.inspect}" if @scope && (filter.nil? || filter.include?(:scope))
|
478
502
|
log_msg += ", fanout" if (filter.nil? || filter.include?(:fanout)) && fanout?
|
479
503
|
log_msg += ", tags #{@tags.inspect}" if @tags && !@tags.empty? && (filter.nil? || filter.include?(:tags))
|
480
504
|
log_msg += ", persistent" if @persistent && (filter.nil? || filter.include?(:persistent))
|
481
|
-
log_msg += ", payload #{@payload.inspect}" if filter
|
505
|
+
log_msg += ", payload #{@payload.inspect}" if filter && filter.include?(:payload)
|
482
506
|
log_msg
|
483
507
|
end
|
484
508
|
|
@@ -63,15 +63,40 @@ module RightScale
|
|
63
63
|
return nil
|
64
64
|
end
|
65
65
|
|
66
|
-
#
|
66
|
+
# Directory containing generated agent configuration files
|
67
|
+
# @deprecated
|
67
68
|
def cfg_dir
|
68
|
-
|
69
|
+
warn "cfg_dir is deprecated; please use right_agent_cfg_dir"
|
70
|
+
right_agent_cfg_dir
|
69
71
|
end
|
70
72
|
|
73
|
+
# RightScale state directory for the current platform
|
74
|
+
# @deprecated
|
71
75
|
def right_scale_state_dir
|
76
|
+
warn "right_scale_state_dir is deprecated; please use either right_scale_static_state_dir or right_agent_dynamic_state_dir"
|
77
|
+
right_scale_static_state_dir
|
78
|
+
end
|
79
|
+
|
80
|
+
# Directory containing generated agent configuration files
|
81
|
+
def right_agent_cfg_dir
|
82
|
+
'/etc/right_agent'
|
83
|
+
end
|
84
|
+
|
85
|
+
# Static (time-invariant) state that is common to all RightScale apps/agents
|
86
|
+
def right_scale_static_state_dir
|
72
87
|
'/etc/rightscale.d'
|
73
88
|
end
|
74
89
|
|
90
|
+
# Static (time-invariant) state that is specific to RightLink
|
91
|
+
def right_link_static_state_dir
|
92
|
+
'/etc/rightscale.d/right_link'
|
93
|
+
end
|
94
|
+
|
95
|
+
# Dynamic, persistent runtime state that is specific to RightLink
|
96
|
+
def right_link_dynamic_state_dir
|
97
|
+
'/var/lib/rightscale/right_link'
|
98
|
+
end
|
99
|
+
|
75
100
|
def spool_dir
|
76
101
|
'/var/spool'
|
77
102
|
end
|
@@ -235,6 +260,12 @@ module RightScale
|
|
235
260
|
return `ps -o rss= -p #{pid}`.to_i
|
236
261
|
end
|
237
262
|
end
|
263
|
+
|
264
|
+
class Installer
|
265
|
+
def install(packages)
|
266
|
+
raise "not yet implemented"
|
267
|
+
end
|
268
|
+
end
|
238
269
|
|
239
270
|
end # Platform
|
240
271
|
|
@@ -114,15 +114,40 @@ module RightScale
|
|
114
114
|
return nil
|
115
115
|
end
|
116
116
|
|
117
|
-
#
|
117
|
+
# Directory containing generated agent configuration files
|
118
|
+
# @deprecated
|
118
119
|
def cfg_dir
|
119
|
-
|
120
|
+
warn "cfg_dir is deprecated; please use right_agent_cfg_dir"
|
121
|
+
right_agent_cfg_dir
|
120
122
|
end
|
121
123
|
|
124
|
+
# RightScale state directory for the current platform
|
125
|
+
# @deprecated
|
122
126
|
def right_scale_state_dir
|
127
|
+
warn "right_scale_state_dir is deprecated; please use either right_scale_static_state_dir or right_agent_dynamic_state_dir"
|
128
|
+
right_scale_static_state_dir
|
129
|
+
end
|
130
|
+
|
131
|
+
# Directory containing generated agent configuration files
|
132
|
+
def right_agent_cfg_dir
|
133
|
+
'/var/lib/rightscale/right_agent'
|
134
|
+
end
|
135
|
+
|
136
|
+
# Static (time-invariant) state that is common to all RightScale apps/agents
|
137
|
+
def right_scale_static_state_dir
|
123
138
|
'/etc/rightscale.d'
|
124
139
|
end
|
125
140
|
|
141
|
+
# Static (time-invariant) state that is specific to RightLink
|
142
|
+
def right_link_static_state_dir
|
143
|
+
'/etc/rightscale.d/right_link'
|
144
|
+
end
|
145
|
+
|
146
|
+
# Dynamic, persistent runtime state that is specific to RightLink
|
147
|
+
def right_link_dynamic_state_dir
|
148
|
+
'/var/lib/rightscale/right_link'
|
149
|
+
end
|
150
|
+
|
126
151
|
def spool_dir
|
127
152
|
'/var/spool'
|
128
153
|
end
|
@@ -417,6 +442,77 @@ module RightScale
|
|
417
442
|
return `ps -o rss= -p #{pid}`.to_i
|
418
443
|
end
|
419
444
|
end
|
445
|
+
|
446
|
+
class Installer
|
447
|
+
# The output generated by the Installer class
|
448
|
+
attr_accessor :output
|
449
|
+
|
450
|
+
@output = ""
|
451
|
+
|
452
|
+
class PackageNotFound < Exception; end
|
453
|
+
class PackageManagerNotFound < Exception; end
|
454
|
+
|
455
|
+
# Does this machine have aptitude
|
456
|
+
#
|
457
|
+
# === Return
|
458
|
+
# true:: If aptitude is available in the expected directory
|
459
|
+
# false:: Otherwise
|
460
|
+
def aptitude?
|
461
|
+
File.executable? '/usr/bin/apt-get'
|
462
|
+
end
|
463
|
+
|
464
|
+
# Does this machine have yum
|
465
|
+
#
|
466
|
+
# === Return
|
467
|
+
# true:: If yum is available in the expected directory
|
468
|
+
# false:: Otherwise
|
469
|
+
def yum?
|
470
|
+
File.executable? '/usr/bin/yum'
|
471
|
+
end
|
472
|
+
|
473
|
+
# Does this machine have zypper
|
474
|
+
#
|
475
|
+
# === Return
|
476
|
+
# true:: If zypper is available in the expected directory
|
477
|
+
# false:: Otherwise
|
478
|
+
def zypper?
|
479
|
+
File.executable? '/usr/bin/zypper'
|
480
|
+
end
|
481
|
+
|
482
|
+
# Install packages based on installed package manager
|
483
|
+
#
|
484
|
+
# === Parameters
|
485
|
+
# command_name(Array):: Array of packages names to be installed
|
486
|
+
#
|
487
|
+
# === Return
|
488
|
+
# true:: If installations of all packages was successfull
|
489
|
+
# false:: Otherwise
|
490
|
+
def install(packages)
|
491
|
+
return true if packages.empty?
|
492
|
+
|
493
|
+
packages = packages.uniq.join(' ')
|
494
|
+
failed_packages = []
|
495
|
+
|
496
|
+
if yum?
|
497
|
+
command = "yum install -y #{packages} 2>&1"
|
498
|
+
regex = /No package (.*) available\./
|
499
|
+
elsif aptitude?
|
500
|
+
ENV['DEBIAN_FRONTEND'] = "noninteractive"
|
501
|
+
command = "apt-get install -y #{packages} 2>&1"
|
502
|
+
regex = /E: Couldn't find package (.*)/
|
503
|
+
elsif zypper?
|
504
|
+
command = "zypper --no-gpg-checks -n #{packages} 2>&1"
|
505
|
+
regex = /Package '(.*)' not found\./
|
506
|
+
else
|
507
|
+
raise PackageManagerNotFound, "No package manager binary (apt, yum, zypper) found in /usr/bin"
|
508
|
+
end
|
509
|
+
|
510
|
+
@output = `#{command}`
|
511
|
+
@output.scan(regex) { |package| failed_packages << package.first }
|
512
|
+
raise PackageNotFound, "The following packages were not available: #{failed_packages.join(', ')}" unless failed_packages.empty?
|
513
|
+
return true
|
514
|
+
end
|
515
|
+
end
|
420
516
|
|
421
517
|
end # Platform
|
422
518
|
|
@@ -60,7 +60,6 @@ module RightScale
|
|
60
60
|
|
61
61
|
attr_reader :flavor, :release
|
62
62
|
|
63
|
-
# TODO Initialize flavor and release (need to run on windows to finalize)
|
64
63
|
def init
|
65
64
|
getversionex = Win32API.new("kernel32", "GetVersionEx", 'P', 'L')
|
66
65
|
osversioninfo = [
|
@@ -74,6 +73,8 @@ module RightScale
|
|
74
73
|
|
75
74
|
raise 'Failed to detect Windows version' if 0 == getversionex.call(osversioninfo) # zero is failure
|
76
75
|
version = osversioninfo.unpack('LLLLLZ128') # 'Z' means ASCIIZ string
|
76
|
+
@flavor = 'windows' # there can be only one
|
77
|
+
@release = "#{version[1]}.#{version[2]}.#{version[3]}"
|
77
78
|
end
|
78
79
|
|
79
80
|
class Filesystem
|
@@ -136,15 +137,39 @@ module RightScale
|
|
136
137
|
end
|
137
138
|
|
138
139
|
# Directory containing generated agent configuration files
|
140
|
+
# @deprecated
|
139
141
|
def cfg_dir
|
140
|
-
|
142
|
+
warn "cfg_dir is deprecated; please use right_agent_cfg_dir"
|
143
|
+
right_agent_cfg_dir
|
141
144
|
end
|
142
145
|
|
143
146
|
# RightScale state directory for the current platform
|
147
|
+
# @deprecated
|
144
148
|
def right_scale_state_dir
|
149
|
+
warn "right_scale_state_dir is deprecated; please use either right_scale_static_state_dir or right_agent_dynamic_state_dir"
|
150
|
+
right_scale_static_state_dir
|
151
|
+
end
|
152
|
+
|
153
|
+
# Directory containing generated agent configuration files
|
154
|
+
def right_agent_cfg_dir
|
155
|
+
return pretty_path(File.join(Dir::COMMON_APPDATA, 'RightScale', 'right_agent'))
|
156
|
+
end
|
157
|
+
|
158
|
+
# Static (time-invariant) state that is common to all RightScale apps/agents
|
159
|
+
def right_scale_static_state_dir
|
145
160
|
return pretty_path(File.join(Dir::COMMON_APPDATA, 'RightScale', 'rightscale.d'))
|
146
161
|
end
|
147
162
|
|
163
|
+
# Static (time-invariant) state that is specific to RightLink
|
164
|
+
def right_link_static_state_dir
|
165
|
+
return pretty_path(File.join(Dir::COMMON_APPDATA, 'RightScale', 'rightscale.d', 'right_link'))
|
166
|
+
end
|
167
|
+
|
168
|
+
# Dynamic, persistent runtime state that is specific to RightLink
|
169
|
+
def right_link_dynamic_state_dir
|
170
|
+
return pretty_path(File.join(Dir::COMMON_APPDATA, 'RightScale', 'right_link'))
|
171
|
+
end
|
172
|
+
|
148
173
|
# Spool directory for the current platform
|
149
174
|
def spool_dir
|
150
175
|
return pretty_path(File.join(Dir::COMMON_APPDATA, 'RightScale', 'spool'))
|
@@ -950,7 +975,9 @@ EOF
|
|
950
975
|
escaped = []
|
951
976
|
[shell_script_file_path, arguments].flatten.each do |arg|
|
952
977
|
value = arg.to_s
|
953
|
-
|
978
|
+
# note that literal ampersand must be quoted on the powershell command
|
979
|
+
# line because it otherwise means 'execute what follows'.
|
980
|
+
escaped << ((value.index(' ') || value.index('&')) ? "'#{value.gsub("'", "''")}'" : value)
|
954
981
|
end
|
955
982
|
|
956
983
|
# resolve lines before & after script.
|
@@ -1082,7 +1109,11 @@ EOF
|
|
1082
1109
|
# the UTC timestamp at which the system was booted
|
1083
1110
|
def booted_at
|
1084
1111
|
begin
|
1085
|
-
|
1112
|
+
Dir.mktmpdir do |temp_dir_path|
|
1113
|
+
Dir.chdir(temp_dir_path) do
|
1114
|
+
wmic_output = `echo | wmic OS Get LastBootUpTime`
|
1115
|
+
end
|
1116
|
+
end
|
1086
1117
|
|
1087
1118
|
match = /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})\.\d{6}([+-]\d{3})/.match(wmic_output)
|
1088
1119
|
|
@@ -1213,8 +1244,12 @@ EOF
|
|
1213
1244
|
return process_memory_counters[12..16].unpack("L")[0] / 1024 # bytes to KB
|
1214
1245
|
end
|
1215
1246
|
end
|
1216
|
-
|
1217
|
-
|
1247
|
+
|
1248
|
+
class Installer
|
1249
|
+
def install(packages)
|
1250
|
+
raise ::RightScale::Win32Error.new("Not implemented yet")
|
1251
|
+
end
|
1252
|
+
end
|
1218
1253
|
|
1219
1254
|
# internal class for querying OS version, etc.
|
1220
1255
|
class OSInformation
|
data/lib/right_agent/platform.rb
CHANGED
@@ -54,7 +54,7 @@ module RightScale
|
|
54
54
|
# - .flavor
|
55
55
|
# - .release
|
56
56
|
# - .linux?
|
57
|
-
# - .
|
57
|
+
# - .darwin?
|
58
58
|
# - .windows?
|
59
59
|
# - .ec2?
|
60
60
|
# - .rackspace?
|
@@ -241,6 +241,14 @@ module RightScale
|
|
241
241
|
def process
|
242
242
|
platform_service(:process)
|
243
243
|
end
|
244
|
+
|
245
|
+
# Installer information object
|
246
|
+
#
|
247
|
+
# === Return
|
248
|
+
# (Object):: Platform-specific installer information object
|
249
|
+
def installer
|
250
|
+
platform_service(:installer)
|
251
|
+
end
|
244
252
|
|
245
253
|
private
|
246
254
|
|
@@ -251,6 +259,7 @@ module RightScale
|
|
251
259
|
@shell = nil
|
252
260
|
@ssh = nil
|
253
261
|
@controller = nil
|
262
|
+
@installer = nil
|
254
263
|
|
255
264
|
@ec2 = nil
|
256
265
|
@rackspace = nil
|
@@ -293,7 +302,7 @@ module RightScale
|
|
293
302
|
# Retrieve platform specific service implementation
|
294
303
|
#
|
295
304
|
# === Parameters
|
296
|
-
# name(Symbol):: Service name, one of :filesystem, :shell, :ssh, :controller
|
305
|
+
# name(Symbol):: Service name, one of :filesystem, :shell, :ssh, :controller, :installer
|
297
306
|
#
|
298
307
|
# === Return
|
299
308
|
# res(Object):: Service instance
|
@@ -334,7 +334,8 @@ module RightScale
|
|
334
334
|
EM.error_handler do |e|
|
335
335
|
Log.error("EM block execution failed with exception", e, :trace)
|
336
336
|
Log.error("\n\n===== Exiting due to EM block exception =====\n\n")
|
337
|
-
EM.stop
|
337
|
+
# Cannot rely on EM.stop at this point, so exit to give chance for monit restart
|
338
|
+
exit(1)
|
338
339
|
end
|
339
340
|
|
340
341
|
EM.run do
|
@@ -289,8 +289,8 @@ module RightScale
|
|
289
289
|
cfg[:prefetch] = options[:prefetch] || 1
|
290
290
|
cfg[:heartbeat] = options[:heartbeat] if options[:heartbeat]
|
291
291
|
cfg[:time_to_live] = options[:time_to_live] || 60
|
292
|
-
cfg[:retry_timeout] = options[:retry_timeout] ||
|
293
|
-
cfg[:retry_interval] = options[:retry_interval] ||
|
292
|
+
cfg[:retry_timeout] = options[:retry_timeout] || 60
|
293
|
+
cfg[:retry_interval] = options[:retry_interval] || 5
|
294
294
|
cfg[:ping_interval] = options[:ping_interval] ||= 4 * 60 * 60
|
295
295
|
cfg[:check_interval] = options[:check_interval] if options[:check_interval]
|
296
296
|
cfg[:reconnect_interval] = options[:reconnect_interval] if options[:reconnect_interval]
|
@@ -38,8 +38,6 @@ module RightScale
|
|
38
38
|
|
39
39
|
class StatsManager
|
40
40
|
|
41
|
-
include StatsHelper
|
42
|
-
|
43
41
|
# Default time to wait for a response from an agent
|
44
42
|
DEFAULT_TIMEOUT = 5
|
45
43
|
|
@@ -185,6 +183,7 @@ module RightScale
|
|
185
183
|
Log.program_name = "stats_manager"
|
186
184
|
Log.log_to_file_only(true)
|
187
185
|
Log.init("stats_manager", Platform.filesystem.temp_dir, :print => true)
|
186
|
+
RightSupport::Log::Mixin.default_logger = Log
|
188
187
|
true
|
189
188
|
end
|
190
189
|
|
@@ -207,6 +206,10 @@ module RightScale
|
|
207
206
|
# result(String):: Result packet in JSON format containing stats or error
|
208
207
|
# options(Hash):: Command line options:
|
209
208
|
# :json(Boolean):: Whether to display in JSON format
|
209
|
+
# :name_width(Integer):: Maximum characters in displayed stat name
|
210
|
+
# :sub_name_width(Integer):: Maximum characters in displayed sub-stat name
|
211
|
+
# :sub_stat_value_width(Integer):: Maximum characters in displayed sub-stat value line
|
212
|
+
# :exception_message_width(Integer):: Maximum characters displayed for exception message
|
210
213
|
#
|
211
214
|
# === Return
|
212
215
|
# true:: Always return true
|
@@ -216,7 +219,8 @@ module RightScale
|
|
216
219
|
$stdout.puts result.content.to_json
|
217
220
|
else
|
218
221
|
if result.respond_to?(:success?) && result.success?
|
219
|
-
|
222
|
+
stats = RightSupport::Stats.stats_str(result.content, options)
|
223
|
+
$stdout.puts "\n#{stats}\n"
|
220
224
|
else
|
221
225
|
$stderr.puts "\nCould not retrieve #{agent_name} agent stats: #{result.inspect}"
|
222
226
|
end
|