right_agent 2.0.7-x86-mingw32
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/LICENSE +20 -0
- data/README.rdoc +82 -0
- data/Rakefile +113 -0
- data/lib/right_agent.rb +59 -0
- data/lib/right_agent/actor.rb +182 -0
- data/lib/right_agent/actor_registry.rb +76 -0
- data/lib/right_agent/actors/agent_manager.rb +232 -0
- data/lib/right_agent/agent.rb +1149 -0
- data/lib/right_agent/agent_config.rb +480 -0
- data/lib/right_agent/agent_identity.rb +210 -0
- data/lib/right_agent/agent_tag_manager.rb +237 -0
- data/lib/right_agent/audit_formatter.rb +107 -0
- data/lib/right_agent/clients.rb +31 -0
- data/lib/right_agent/clients/api_client.rb +383 -0
- data/lib/right_agent/clients/auth_client.rb +247 -0
- data/lib/right_agent/clients/balanced_http_client.rb +369 -0
- data/lib/right_agent/clients/base_retry_client.rb +495 -0
- data/lib/right_agent/clients/right_http_client.rb +279 -0
- data/lib/right_agent/clients/router_client.rb +493 -0
- data/lib/right_agent/command.rb +30 -0
- data/lib/right_agent/command/agent_manager_commands.rb +150 -0
- data/lib/right_agent/command/command_client.rb +136 -0
- data/lib/right_agent/command/command_constants.rb +33 -0
- data/lib/right_agent/command/command_io.rb +126 -0
- data/lib/right_agent/command/command_parser.rb +87 -0
- data/lib/right_agent/command/command_runner.rb +118 -0
- data/lib/right_agent/command/command_serializer.rb +63 -0
- data/lib/right_agent/connectivity_checker.rb +179 -0
- data/lib/right_agent/console.rb +65 -0
- data/lib/right_agent/core_payload_types.rb +44 -0
- data/lib/right_agent/core_payload_types/cookbook.rb +61 -0
- data/lib/right_agent/core_payload_types/cookbook_position.rb +46 -0
- data/lib/right_agent/core_payload_types/cookbook_repository.rb +116 -0
- data/lib/right_agent/core_payload_types/cookbook_sequence.rb +70 -0
- data/lib/right_agent/core_payload_types/dev_repositories.rb +100 -0
- data/lib/right_agent/core_payload_types/dev_repository.rb +76 -0
- data/lib/right_agent/core_payload_types/event_categories.rb +38 -0
- data/lib/right_agent/core_payload_types/executable_bundle.rb +130 -0
- data/lib/right_agent/core_payload_types/login_policy.rb +72 -0
- data/lib/right_agent/core_payload_types/login_user.rb +79 -0
- data/lib/right_agent/core_payload_types/planned_volume.rb +94 -0
- data/lib/right_agent/core_payload_types/recipe_instantiation.rb +73 -0
- data/lib/right_agent/core_payload_types/repositories_bundle.rb +50 -0
- data/lib/right_agent/core_payload_types/right_script_attachment.rb +95 -0
- data/lib/right_agent/core_payload_types/right_script_instantiation.rb +94 -0
- data/lib/right_agent/core_payload_types/runlist_policy.rb +44 -0
- data/lib/right_agent/core_payload_types/secure_document.rb +66 -0
- data/lib/right_agent/core_payload_types/secure_document_location.rb +63 -0
- data/lib/right_agent/core_payload_types/software_repository_instantiation.rb +61 -0
- data/lib/right_agent/daemonize.rb +35 -0
- data/lib/right_agent/dispatched_cache.rb +109 -0
- data/lib/right_agent/dispatcher.rb +272 -0
- data/lib/right_agent/enrollment_result.rb +221 -0
- data/lib/right_agent/exceptions.rb +87 -0
- data/lib/right_agent/history.rb +145 -0
- data/lib/right_agent/log.rb +460 -0
- data/lib/right_agent/minimal.rb +46 -0
- data/lib/right_agent/monkey_patches.rb +30 -0
- data/lib/right_agent/monkey_patches/ruby_patch.rb +55 -0
- data/lib/right_agent/monkey_patches/ruby_patch/array_patch.rb +29 -0
- data/lib/right_agent/monkey_patches/ruby_patch/darwin_patch.rb +24 -0
- data/lib/right_agent/monkey_patches/ruby_patch/linux_patch.rb +24 -0
- data/lib/right_agent/monkey_patches/ruby_patch/linux_patch/file_patch.rb +30 -0
- data/lib/right_agent/monkey_patches/ruby_patch/object_patch.rb +49 -0
- data/lib/right_agent/monkey_patches/ruby_patch/windows_patch.rb +32 -0
- data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/file_patch.rb +60 -0
- data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/process_patch.rb +63 -0
- data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/stdio_patch.rb +27 -0
- data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/time_patch.rb +55 -0
- data/lib/right_agent/monkey_patches/ruby_patch/windows_patch/win32ole_patch.rb +34 -0
- data/lib/right_agent/multiplexer.rb +102 -0
- data/lib/right_agent/offline_handler.rb +270 -0
- data/lib/right_agent/operation_result.rb +300 -0
- data/lib/right_agent/packets.rb +673 -0
- data/lib/right_agent/payload_formatter.rb +104 -0
- data/lib/right_agent/pending_requests.rb +128 -0
- data/lib/right_agent/pid_file.rb +159 -0
- data/lib/right_agent/platform.rb +770 -0
- data/lib/right_agent/platform/unix/darwin/platform.rb +102 -0
- data/lib/right_agent/platform/unix/linux/platform.rb +305 -0
- data/lib/right_agent/platform/unix/platform.rb +226 -0
- data/lib/right_agent/platform/windows/mingw/platform.rb +447 -0
- data/lib/right_agent/platform/windows/mswin/platform.rb +236 -0
- data/lib/right_agent/platform/windows/platform.rb +1808 -0
- data/lib/right_agent/protocol_version_mixin.rb +69 -0
- data/lib/right_agent/retryable_request.rb +195 -0
- data/lib/right_agent/scripts/agent_controller.rb +543 -0
- data/lib/right_agent/scripts/agent_deployer.rb +400 -0
- data/lib/right_agent/scripts/common_parser.rb +160 -0
- data/lib/right_agent/scripts/log_level_manager.rb +192 -0
- data/lib/right_agent/scripts/stats_manager.rb +268 -0
- data/lib/right_agent/scripts/usage.rb +58 -0
- data/lib/right_agent/secure_identity.rb +92 -0
- data/lib/right_agent/security.rb +32 -0
- data/lib/right_agent/security/cached_certificate_store_proxy.rb +77 -0
- data/lib/right_agent/security/certificate.rb +102 -0
- data/lib/right_agent/security/certificate_cache.rb +89 -0
- data/lib/right_agent/security/distinguished_name.rb +56 -0
- data/lib/right_agent/security/encrypted_document.rb +83 -0
- data/lib/right_agent/security/rsa_key_pair.rb +76 -0
- data/lib/right_agent/security/signature.rb +86 -0
- data/lib/right_agent/security/static_certificate_store.rb +85 -0
- data/lib/right_agent/sender.rb +792 -0
- data/lib/right_agent/serialize.rb +29 -0
- data/lib/right_agent/serialize/message_pack.rb +107 -0
- data/lib/right_agent/serialize/secure_serializer.rb +151 -0
- data/lib/right_agent/serialize/secure_serializer_initializer.rb +47 -0
- data/lib/right_agent/serialize/serializable.rb +151 -0
- data/lib/right_agent/serialize/serializer.rb +159 -0
- data/lib/right_agent/subprocess.rb +38 -0
- data/lib/right_agent/tracer.rb +124 -0
- data/right_agent.gemspec +101 -0
- data/spec/actor_registry_spec.rb +80 -0
- data/spec/actor_spec.rb +162 -0
- data/spec/agent_config_spec.rb +235 -0
- data/spec/agent_identity_spec.rb +78 -0
- data/spec/agent_spec.rb +734 -0
- data/spec/agent_tag_manager_spec.rb +319 -0
- data/spec/clients/api_client_spec.rb +423 -0
- data/spec/clients/auth_client_spec.rb +272 -0
- data/spec/clients/balanced_http_client_spec.rb +576 -0
- data/spec/clients/base_retry_client_spec.rb +635 -0
- data/spec/clients/router_client_spec.rb +594 -0
- data/spec/clients/spec_helper.rb +111 -0
- data/spec/command/agent_manager_commands_spec.rb +51 -0
- data/spec/command/command_io_spec.rb +93 -0
- data/spec/command/command_parser_spec.rb +79 -0
- data/spec/command/command_runner_spec.rb +107 -0
- data/spec/command/command_serializer_spec.rb +51 -0
- data/spec/connectivity_checker_spec.rb +83 -0
- data/spec/core_payload_types/dev_repositories_spec.rb +64 -0
- data/spec/core_payload_types/dev_repository_spec.rb +33 -0
- data/spec/core_payload_types/executable_bundle_spec.rb +67 -0
- data/spec/core_payload_types/login_user_spec.rb +102 -0
- data/spec/core_payload_types/recipe_instantiation_spec.rb +81 -0
- data/spec/core_payload_types/right_script_attachment_spec.rb +65 -0
- data/spec/core_payload_types/right_script_instantiation_spec.rb +79 -0
- data/spec/core_payload_types/spec_helper.rb +23 -0
- data/spec/dispatched_cache_spec.rb +136 -0
- data/spec/dispatcher_spec.rb +324 -0
- data/spec/enrollment_result_spec.rb +53 -0
- data/spec/history_spec.rb +246 -0
- data/spec/log_spec.rb +192 -0
- data/spec/monkey_patches/eventmachine_spec.rb +62 -0
- data/spec/multiplexer_spec.rb +48 -0
- data/spec/offline_handler_spec.rb +340 -0
- data/spec/operation_result_spec.rb +208 -0
- data/spec/packets_spec.rb +461 -0
- data/spec/pending_requests_spec.rb +136 -0
- data/spec/platform/spec_helper.rb +216 -0
- data/spec/platform/unix/darwin/platform_spec.rb +181 -0
- data/spec/platform/unix/linux/platform_spec.rb +540 -0
- data/spec/platform/unix/spec_helper.rb +149 -0
- data/spec/platform/windows/mingw/platform_spec.rb +222 -0
- data/spec/platform/windows/mswin/platform_spec.rb +259 -0
- data/spec/platform/windows/spec_helper.rb +720 -0
- data/spec/retryable_request_spec.rb +306 -0
- data/spec/secure_identity_spec.rb +50 -0
- data/spec/security/cached_certificate_store_proxy_spec.rb +62 -0
- data/spec/security/certificate_cache_spec.rb +71 -0
- data/spec/security/certificate_spec.rb +49 -0
- data/spec/security/distinguished_name_spec.rb +46 -0
- data/spec/security/encrypted_document_spec.rb +55 -0
- data/spec/security/rsa_key_pair_spec.rb +55 -0
- data/spec/security/signature_spec.rb +66 -0
- data/spec/security/static_certificate_store_spec.rb +58 -0
- data/spec/sender_spec.rb +1045 -0
- data/spec/serialize/message_pack_spec.rb +131 -0
- data/spec/serialize/secure_serializer_spec.rb +132 -0
- data/spec/serialize/serializable_spec.rb +90 -0
- data/spec/serialize/serializer_spec.rb +197 -0
- data/spec/spec.opts +2 -0
- data/spec/spec.win32.opts +1 -0
- data/spec/spec_helper.rb +130 -0
- data/spec/tracer_spec.rb +114 -0
- metadata +447 -0
@@ -0,0 +1,192 @@
|
|
1
|
+
# === Synopsis:
|
2
|
+
# RightAgent Log Level Manager (rlog) - (c) 2009-2011 RightScale Inc
|
3
|
+
#
|
4
|
+
# rlog is a command line tool for retrieving and setting the log level
|
5
|
+
# for a RightAgent
|
6
|
+
#
|
7
|
+
# === Examples:
|
8
|
+
# Retrieve log level for all configured agents:
|
9
|
+
# rlog
|
10
|
+
#
|
11
|
+
# Retrieve log level for a specific agent:
|
12
|
+
# rlog AGENT
|
13
|
+
#
|
14
|
+
# Set log level to debug for all configured agents:
|
15
|
+
# rlog [AGENT] --log-level debug
|
16
|
+
# rlog [AGENT] -l debug
|
17
|
+
#
|
18
|
+
# Set log level to debug for a specific agent:
|
19
|
+
# rlog AGENT -l debug
|
20
|
+
#
|
21
|
+
# === Usage
|
22
|
+
# rs_set_log_level [AGENT] [--log-level, -l debug|info|warn|error|fatal]
|
23
|
+
#
|
24
|
+
# options:
|
25
|
+
# --log-level, -l LVL Set log level of agent
|
26
|
+
# --cfg-dir, -c DIR Set directory containing configuration for all agents
|
27
|
+
# --verbose, -v Display debug information
|
28
|
+
# --help: Display help
|
29
|
+
#
|
30
|
+
# No options prints the current agent log level
|
31
|
+
#
|
32
|
+
|
33
|
+
require 'rubygems'
|
34
|
+
require 'optparse'
|
35
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'usage'))
|
36
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'right_agent'))
|
37
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'actors', 'agent_manager'))
|
38
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'common_parser'))
|
39
|
+
|
40
|
+
module RightScale
|
41
|
+
|
42
|
+
class LogLevelManager
|
43
|
+
|
44
|
+
# Convenience wrapper for creating and running log level manager
|
45
|
+
#
|
46
|
+
# === Return
|
47
|
+
# true:: Always return true
|
48
|
+
def self.run
|
49
|
+
m = LogLevelManager.new
|
50
|
+
m.manage(m.parse_args)
|
51
|
+
end
|
52
|
+
|
53
|
+
# Handle log level request
|
54
|
+
#
|
55
|
+
# === Parameters
|
56
|
+
# options(Hash):: Command line options
|
57
|
+
#
|
58
|
+
# === Return
|
59
|
+
# true:: Always return true
|
60
|
+
def manage(options)
|
61
|
+
# Initialize configuration directory setting
|
62
|
+
AgentConfig.cfg_dir = options[:cfg_dir]
|
63
|
+
|
64
|
+
# Determine command
|
65
|
+
level = options[:level]
|
66
|
+
command = { :name => (level ? 'set_log_level' : 'get_log_level') }
|
67
|
+
command[:level] = level.to_sym if level
|
68
|
+
|
69
|
+
# Determine candidate agents
|
70
|
+
agent_names = if options[:agent_name]
|
71
|
+
[options[:agent_name]]
|
72
|
+
else
|
73
|
+
AgentConfig.cfg_agents
|
74
|
+
end
|
75
|
+
fail("No agents configured") if agent_names.empty?
|
76
|
+
|
77
|
+
# Perform command for each agent
|
78
|
+
count = 0
|
79
|
+
agent_names.each do |agent_name|
|
80
|
+
count += 1 if request_log_level(agent_name, command, options)
|
81
|
+
end
|
82
|
+
puts("No agents running") if count == 0
|
83
|
+
true
|
84
|
+
end
|
85
|
+
|
86
|
+
# Create options hash from command line arguments
|
87
|
+
#
|
88
|
+
# === Return
|
89
|
+
# options(Hash):: Hash of options as defined by the command line
|
90
|
+
def parse_args
|
91
|
+
options = { :verbose => false }
|
92
|
+
options[:agent_name] = ARGV[0] unless ARGV[0] =~ /^-/
|
93
|
+
|
94
|
+
opts = OptionParser.new do |opts|
|
95
|
+
|
96
|
+
opts.on('-l', '--log-level LEVEL') do |l|
|
97
|
+
fail("Invalid log level '#{l}'") unless AgentManager::LEVELS.include?(l.downcase.to_sym)
|
98
|
+
options[:level] = l.downcase
|
99
|
+
end
|
100
|
+
|
101
|
+
opts.on("-c", "--cfg-dir DIR") do |d|
|
102
|
+
options[:cfg_dir] = d
|
103
|
+
end
|
104
|
+
|
105
|
+
opts.on('-v', '--verbose') do
|
106
|
+
options[:verbose] = true
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
opts.on_tail('--help') do
|
112
|
+
puts Usage.scan(__FILE__)
|
113
|
+
exit
|
114
|
+
end
|
115
|
+
|
116
|
+
begin
|
117
|
+
opts.parse!(ARGV)
|
118
|
+
rescue Exception => e
|
119
|
+
exit 0 if e.is_a?(SystemExit)
|
120
|
+
fail(e.message + "\nUse 'rlog --help' for additional information")
|
121
|
+
end
|
122
|
+
options
|
123
|
+
end
|
124
|
+
|
125
|
+
protected
|
126
|
+
|
127
|
+
# Send log level request to agent
|
128
|
+
#
|
129
|
+
# === Parameters
|
130
|
+
# agent_name(String):: Agent name
|
131
|
+
# command(String):: Command request
|
132
|
+
# options(Hash):: Command line options
|
133
|
+
#
|
134
|
+
# === Return
|
135
|
+
# (Boolean):: true if agent running, otherwise false
|
136
|
+
def request_log_level(agent_name, command, options)
|
137
|
+
res = false
|
138
|
+
config_options = AgentConfig.agent_options(agent_name)
|
139
|
+
unless config_options.empty? || (listen_port = config_options[:listen_port]).nil?
|
140
|
+
fail("Could not retrieve #{agent_name} agent listen port") unless listen_port
|
141
|
+
client = CommandClient.new(listen_port, config_options[:cookie])
|
142
|
+
begin
|
143
|
+
client.send_command(command, options[:verbose], timeout = 5) do |level|
|
144
|
+
puts "Agent #{agent_name} log level: #{level.to_s.upcase}"
|
145
|
+
end
|
146
|
+
res = true
|
147
|
+
rescue Exception => e
|
148
|
+
puts "Command #{command.inspect} to #{agent_name} agent failed (#{e})"
|
149
|
+
end
|
150
|
+
end
|
151
|
+
res
|
152
|
+
end
|
153
|
+
|
154
|
+
# Print error on console and exit abnormally
|
155
|
+
#
|
156
|
+
# === Parameter
|
157
|
+
# message(String):: Error message, default to nil (no message printed)
|
158
|
+
# print_usage(Boolean):: Whether script usage should be printed, default to false
|
159
|
+
#
|
160
|
+
# === Return
|
161
|
+
# R.I.P. does not return
|
162
|
+
def fail(message = nil, print_usage = false)
|
163
|
+
puts "** #{message}" if message
|
164
|
+
puts Usage.scan(__FILE__) if print_usage
|
165
|
+
exit(1)
|
166
|
+
end
|
167
|
+
|
168
|
+
end
|
169
|
+
|
170
|
+
end
|
171
|
+
|
172
|
+
#
|
173
|
+
# Copyright (c) 2009-2011 RightScale Inc
|
174
|
+
#
|
175
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
176
|
+
# a copy of this software and associated documentation files (the
|
177
|
+
# "Software"), to deal in the Software without restriction, including
|
178
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
179
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
180
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
181
|
+
# the following conditions:
|
182
|
+
#
|
183
|
+
# The above copyright notice and this permission notice shall be
|
184
|
+
# included in all copies or substantial portions of the Software.
|
185
|
+
#
|
186
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
187
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
188
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
189
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
190
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
191
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
192
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
@@ -0,0 +1,268 @@
|
|
1
|
+
# === Synopsis:
|
2
|
+
# RightAgent Statistics Manager (rstat) - (c) 2010-2011 RightScale Inc
|
3
|
+
#
|
4
|
+
# rstat is a command line tool for displaying operation statistics for RightAgents
|
5
|
+
#
|
6
|
+
# === Examples:
|
7
|
+
# Retrieve statistics for all locally running agents:
|
8
|
+
# rstat
|
9
|
+
#
|
10
|
+
# Retrieve statistics for an agent named AGENT:
|
11
|
+
# rstat AGENT
|
12
|
+
#
|
13
|
+
# Retrieve statistics for an agent in JSON format:
|
14
|
+
# rstat AGENT --json
|
15
|
+
# rstat AGENT --j
|
16
|
+
#
|
17
|
+
# Log details of statistics retrieval
|
18
|
+
# rstat AGENT -v
|
19
|
+
#
|
20
|
+
# === Usage:
|
21
|
+
# rstat [AGENT] [options]
|
22
|
+
#
|
23
|
+
# Options:
|
24
|
+
# --reset, -r As part of gathering the stats from an agent also reset the stats
|
25
|
+
# --timeout, -T SEC Override default timeout in seconds to wait for a response from an agent
|
26
|
+
# --json, -j Display the stats data in JSON format
|
27
|
+
# --verbose, -v Log debug information
|
28
|
+
# --cfg-dir, -c DIR Set directory containing configuration for all agents
|
29
|
+
# --help Display help
|
30
|
+
|
31
|
+
require 'rubygems'
|
32
|
+
require 'optparse'
|
33
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'usage'))
|
34
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'right_agent'))
|
35
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'common_parser'))
|
36
|
+
|
37
|
+
module RightScale
|
38
|
+
|
39
|
+
class StatsManager
|
40
|
+
|
41
|
+
# Default time to wait for a response from an agent
|
42
|
+
DEFAULT_TIMEOUT = 5
|
43
|
+
|
44
|
+
# Create and run manager
|
45
|
+
#
|
46
|
+
# === Return
|
47
|
+
# true:: Always return true
|
48
|
+
def self.run
|
49
|
+
m = StatsManager.new
|
50
|
+
m.manage(m.parse_args)
|
51
|
+
end
|
52
|
+
|
53
|
+
# Initialize manager
|
54
|
+
def initialize
|
55
|
+
@command_serializer = Serializer.new
|
56
|
+
end
|
57
|
+
|
58
|
+
# Handle stats request
|
59
|
+
#
|
60
|
+
# === Parameters
|
61
|
+
# options(Hash):: Command line options
|
62
|
+
#
|
63
|
+
# === Return
|
64
|
+
# true:: Always return true
|
65
|
+
def manage(options)
|
66
|
+
init_log if options[:verbose]
|
67
|
+
AgentConfig.cfg_dir = options[:cfg_dir]
|
68
|
+
options[:timeout] ||= DEFAULT_TIMEOUT
|
69
|
+
request_stats(options)
|
70
|
+
rescue Exception => e
|
71
|
+
fail("#{e}\n#{e.backtrace.join("\n")}") unless e.is_a?(SystemExit)
|
72
|
+
end
|
73
|
+
|
74
|
+
# Create options hash from command line arguments
|
75
|
+
#
|
76
|
+
# === Return
|
77
|
+
# options(Hash):: Parsed options
|
78
|
+
def parse_args
|
79
|
+
options = {:reset => false}
|
80
|
+
options[:agent_name] = ARGV[0] unless ARGV[0] =~ /^-/
|
81
|
+
|
82
|
+
opts = OptionParser.new do |opts|
|
83
|
+
parse_other_args(opts, options)
|
84
|
+
|
85
|
+
opts.on('-r', '--reset') do
|
86
|
+
options[:reset] = true
|
87
|
+
end
|
88
|
+
|
89
|
+
opts.on('-T', '--timeout SEC') do |sec|
|
90
|
+
options[:timeout] = sec
|
91
|
+
end
|
92
|
+
|
93
|
+
opts.on('-j', '--json') do
|
94
|
+
options[:json] = true
|
95
|
+
end
|
96
|
+
|
97
|
+
opts.on('-v', '--verbose') do
|
98
|
+
options[:verbose] = true
|
99
|
+
end
|
100
|
+
|
101
|
+
opts.on("-c", "--cfg-dir DIR") do |d|
|
102
|
+
options[:cfg_dir] = d
|
103
|
+
end
|
104
|
+
|
105
|
+
opts.on_tail('--help') do
|
106
|
+
puts Usage.scan(__FILE__)
|
107
|
+
exit
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
begin
|
113
|
+
opts.parse(ARGV)
|
114
|
+
rescue Exception => e
|
115
|
+
exit 0 if e.is_a?(SystemExit)
|
116
|
+
fail(e.message + "\nUse 'rstat --help' for additional information")
|
117
|
+
end
|
118
|
+
|
119
|
+
options
|
120
|
+
end
|
121
|
+
|
122
|
+
# Request and display statistics for agents
|
123
|
+
#
|
124
|
+
# === Parameters
|
125
|
+
# options(Hash):: Command line options
|
126
|
+
#
|
127
|
+
# === Return
|
128
|
+
# true:: Always return true
|
129
|
+
def request_stats(options)
|
130
|
+
# Determine candidate agents
|
131
|
+
agent_names = if options[:agent_name]
|
132
|
+
[options[:agent_name]]
|
133
|
+
else
|
134
|
+
AgentConfig.cfg_agents
|
135
|
+
end
|
136
|
+
fail("No agents configured") if agent_names.empty?
|
137
|
+
|
138
|
+
# Request stats from agents
|
139
|
+
count = 0
|
140
|
+
agent_names.each do |agent_name|
|
141
|
+
begin
|
142
|
+
count += 1 if request_agent_stats(agent_name, options)
|
143
|
+
rescue Exception => e
|
144
|
+
$stderr.puts "Command to #{agent_name} agent failed (#{e})" unless e.is_a?(SystemExit)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
$stderr.puts("No agents running") if count == 0
|
148
|
+
end
|
149
|
+
|
150
|
+
# Request and display statistics for agent
|
151
|
+
#
|
152
|
+
# === Parameters
|
153
|
+
# agent_name(String):: Agent name
|
154
|
+
# options(Hash):: Command line options
|
155
|
+
#
|
156
|
+
# === Return
|
157
|
+
# (Boolean):: true if agent running, otherwise false
|
158
|
+
def request_agent_stats(agent_name, options)
|
159
|
+
res = false
|
160
|
+
config_options = AgentConfig.agent_options(agent_name)
|
161
|
+
unless config_options.empty? || (listen_port = config_options[:listen_port]).nil?
|
162
|
+
client = CommandClient.new(listen_port, config_options[:cookie])
|
163
|
+
command = {:name => :stats, :reset => options[:reset]}
|
164
|
+
begin
|
165
|
+
client.send_command(command, verbose = false, options[:timeout]) { |r| display(agent_name, r, options) }
|
166
|
+
res = true
|
167
|
+
rescue Exception => e
|
168
|
+
msg = "Could not retrieve #{agent_name} agent stats: #{e}"
|
169
|
+
msg += "\n" + e.backtrace.join("\n") unless e.message =~ /Timed out/
|
170
|
+
fail(msg)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
res
|
174
|
+
end
|
175
|
+
|
176
|
+
protected
|
177
|
+
|
178
|
+
# Initialize logging
|
179
|
+
#
|
180
|
+
# === Return
|
181
|
+
# true:: Always return true
|
182
|
+
def init_log
|
183
|
+
Log.program_name = "stats_manager"
|
184
|
+
Log.log_to_file_only(true)
|
185
|
+
Log.init("stats_manager", Platform.filesystem.temp_dir, :print => true)
|
186
|
+
RightSupport::Log::Mixin.default_logger = Log
|
187
|
+
true
|
188
|
+
end
|
189
|
+
|
190
|
+
# Parse other arguments unique to given stats manager
|
191
|
+
#
|
192
|
+
# === Parameters
|
193
|
+
# opts(OptionParser):: Options parser with options to be parsed
|
194
|
+
# options(Hash):: Storage for options that are parsed
|
195
|
+
#
|
196
|
+
# === Return
|
197
|
+
# true:: Always return true
|
198
|
+
def parse_other_args(opts, options)
|
199
|
+
true
|
200
|
+
end
|
201
|
+
|
202
|
+
# Display stats returned from an agent in human readable or JSON format
|
203
|
+
#
|
204
|
+
# === Parameters
|
205
|
+
# agent_name(String):: Agent name
|
206
|
+
# result(String):: Result packet in JSON format containing stats or error
|
207
|
+
# options(Hash):: Command line options:
|
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
|
213
|
+
#
|
214
|
+
# === Return
|
215
|
+
# true:: Always return true
|
216
|
+
def display(agent_name, result, options)
|
217
|
+
result = RightScale::OperationResult.from_results(@command_serializer.load(result))
|
218
|
+
if options[:json]
|
219
|
+
$stdout.puts result.content.to_json
|
220
|
+
else
|
221
|
+
if result.respond_to?(:success?) && result.success?
|
222
|
+
stats = RightSupport::Stats.stats_str(result.content, options)
|
223
|
+
$stdout.puts "\n#{stats}\n"
|
224
|
+
else
|
225
|
+
$stderr.puts "\nCould not retrieve #{agent_name} agent stats: #{result.inspect}"
|
226
|
+
end
|
227
|
+
end
|
228
|
+
true
|
229
|
+
end
|
230
|
+
|
231
|
+
# Print failure message and exit abnormally
|
232
|
+
#
|
233
|
+
# === Parameters
|
234
|
+
# message(String):: Failure message
|
235
|
+
# print_usage(Boolean):: Whether to display usage information
|
236
|
+
#
|
237
|
+
# === Return
|
238
|
+
# exits the program
|
239
|
+
def fail(message, print_usage = false)
|
240
|
+
$stderr.puts "** #{message}"
|
241
|
+
puts Usage.scan(__FILE__) if print_usage
|
242
|
+
exit(1)
|
243
|
+
end
|
244
|
+
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
#
|
249
|
+
# Copyright (c) 2009-2011 RightScale Inc
|
250
|
+
#
|
251
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
252
|
+
# a copy of this software and associated documentation files (the
|
253
|
+
# "Software"), to deal in the Software without restriction, including
|
254
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
255
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
256
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
257
|
+
# the following conditions:
|
258
|
+
#
|
259
|
+
# The above copyright notice and this permission notice shall be
|
260
|
+
# included in all copies or substantial portions of the Software.
|
261
|
+
#
|
262
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
263
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
264
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
265
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
266
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
267
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
268
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|