right_agent 0.6.6 → 0.9.3
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/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
|