dtk-node-agent 0.5.10
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.
- checksums.yaml +15 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +18 -0
- data/README.md +42 -0
- data/bin/dtk-node-agent +16 -0
- data/dtk-node-agent.gemspec +38 -0
- data/lib/config/install.config +12 -0
- data/lib/dtk-node-agent/installer.rb +142 -0
- data/lib/dtk-node-agent/version.rb +3 -0
- data/mcollective_additions/plugins/README.md +1 -0
- data/mcollective_additions/plugins/v1.2/agent/discovery.rb +39 -0
- data/mcollective_additions/plugins/v1.2/agent/get_log_fragment.ddl +15 -0
- data/mcollective_additions/plugins/v1.2/agent/get_log_fragment.rb +79 -0
- data/mcollective_additions/plugins/v1.2/agent/git_access.ddl +9 -0
- data/mcollective_additions/plugins/v1.2/agent/git_access.rb +79 -0
- data/mcollective_additions/plugins/v1.2/agent/netstat.ddl +9 -0
- data/mcollective_additions/plugins/v1.2/agent/netstat.rb +34 -0
- data/mcollective_additions/plugins/v1.2/agent/puppet_apply.ddl +9 -0
- data/mcollective_additions/plugins/v1.2/agent/puppet_apply.rb +630 -0
- data/mcollective_additions/plugins/v1.2/agent/rpcutil.ddl +204 -0
- data/mcollective_additions/plugins/v1.2/agent/rpcutil.rb +101 -0
- data/mcollective_additions/plugins/v1.2/facts/pbuilder_facts.rb +35 -0
- data/mcollective_additions/plugins/v2.2/agent/dev_manager.ddl +9 -0
- data/mcollective_additions/plugins/v2.2/agent/dev_manager.rb +69 -0
- data/mcollective_additions/plugins/v2.2/agent/discovery.rb +39 -0
- data/mcollective_additions/plugins/v2.2/agent/dtk_node_agent_git_client.rb +94 -0
- data/mcollective_additions/plugins/v2.2/agent/execute_tests.ddl +9 -0
- data/mcollective_additions/plugins/v2.2/agent/execute_tests.rb +64 -0
- data/mcollective_additions/plugins/v2.2/agent/get_log_fragment.ddl +15 -0
- data/mcollective_additions/plugins/v2.2/agent/get_log_fragment.rb +79 -0
- data/mcollective_additions/plugins/v2.2/agent/git_access.ddl +9 -0
- data/mcollective_additions/plugins/v2.2/agent/git_access.rb +72 -0
- data/mcollective_additions/plugins/v2.2/agent/netstat.ddl +9 -0
- data/mcollective_additions/plugins/v2.2/agent/netstat.rb +34 -0
- data/mcollective_additions/plugins/v2.2/agent/ps.ddl +9 -0
- data/mcollective_additions/plugins/v2.2/agent/ps.rb +37 -0
- data/mcollective_additions/plugins/v2.2/agent/puppet_apply.ddl +9 -0
- data/mcollective_additions/plugins/v2.2/agent/puppet_apply.rb +633 -0
- data/mcollective_additions/plugins/v2.2/agent/puppet_cancel.ddl +10 -0
- data/mcollective_additions/plugins/v2.2/agent/puppet_cancel.rb +78 -0
- data/mcollective_additions/plugins/v2.2/agent/rpcutil.ddl +204 -0
- data/mcollective_additions/plugins/v2.2/agent/rpcutil.rb +101 -0
- data/mcollective_additions/plugins/v2.2/agent/sync_agent_code.ddl +10 -0
- data/mcollective_additions/plugins/v2.2/agent/sync_agent_code.rb +85 -0
- data/mcollective_additions/plugins/v2.2/agent/tail.ddl +11 -0
- data/mcollective_additions/plugins/v2.2/agent/tail.rb +67 -0
- data/mcollective_additions/plugins/v2.2/connector/r8stomp.rb +238 -0
- data/mcollective_additions/plugins/v2.2/connector/stomp.rb +349 -0
- data/mcollective_additions/plugins/v2.2/connector/stomp_em.rb +191 -0
- data/mcollective_additions/plugins/v2.2/facts/pbuilder_facts.rb +35 -0
- data/mcollective_additions/plugins/v2.2/security/sshkey.ddl +9 -0
- data/mcollective_additions/plugins/v2.2/security/sshkey.rb +362 -0
- data/mcollective_additions/server.cfg +22 -0
- data/puppet_additions/modules/r8/lib/puppet/type/r8_export_file.rb +53 -0
- data/puppet_additions/modules/r8/manifests/export_variable.rb +10 -0
- data/puppet_additions/puppet_lib_base/puppet/indirector/catalog/r8_storeconfig_backend.rb +48 -0
- data/puppet_additions/puppet_lib_base/puppet/indirector/r8_storeconfig_backend.rb +4 -0
- data/puppet_additions/puppet_lib_base/puppet/indirector/resource/r8_storeconfig_backend.rb +72 -0
- data/src/etc/init.d/ec2-run-user-data +95 -0
- data/src/etc/logrotate.d/mcollective +10 -0
- data/src/etc/logrotate.d/puppet +7 -0
- metadata +189 -0
@@ -0,0 +1,204 @@
|
|
1
|
+
metadata :name => "rpcutil",
|
2
|
+
:description => "General helpful actions that expose stats and internals to SimpleRPC clients",
|
3
|
+
:author => "R.I.Pienaar <rip@devco.net>",
|
4
|
+
:license => "Apache License, Version 2.0",
|
5
|
+
:version => "1.0",
|
6
|
+
:url => "http://marionette-collective.org/",
|
7
|
+
:timeout => 10
|
8
|
+
|
9
|
+
action "collective_info", :description => "Info about the main and sub collectives" do
|
10
|
+
display :always
|
11
|
+
|
12
|
+
output :main_collective,
|
13
|
+
:description => "The main Collective",
|
14
|
+
:display_as => "Main Collective"
|
15
|
+
|
16
|
+
output :collectives,
|
17
|
+
:description => "All Collectives",
|
18
|
+
:display_as => "All Collectives"
|
19
|
+
|
20
|
+
summarize do
|
21
|
+
aggregate summary(:collectives)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
action "inventory", :description => "System Inventory" do
|
26
|
+
display :always
|
27
|
+
|
28
|
+
output :agents,
|
29
|
+
:description => "List of agent names",
|
30
|
+
:display_as => "Agents"
|
31
|
+
|
32
|
+
output :facts,
|
33
|
+
:description => "List of facts and values",
|
34
|
+
:display_as => "Facts"
|
35
|
+
|
36
|
+
output :classes,
|
37
|
+
:description => "List of classes on the system",
|
38
|
+
:display_as => "Classes"
|
39
|
+
|
40
|
+
output :version,
|
41
|
+
:description => "MCollective Version",
|
42
|
+
:display_as => "Version"
|
43
|
+
|
44
|
+
output :main_collective,
|
45
|
+
:description => "The main Collective",
|
46
|
+
:display_as => "Main Collective"
|
47
|
+
|
48
|
+
output :collectives,
|
49
|
+
:description => "All Collectives",
|
50
|
+
:display_as => "All Collectives"
|
51
|
+
|
52
|
+
output :data_plugins,
|
53
|
+
:description => "List of data plugin names",
|
54
|
+
:display_as => "Data Plugins"
|
55
|
+
end
|
56
|
+
|
57
|
+
action "get_fact", :description => "Retrieve a single fact from the fact store" do
|
58
|
+
display :always
|
59
|
+
|
60
|
+
input :fact,
|
61
|
+
:prompt => "The name of the fact",
|
62
|
+
:description => "The fact to retrieve",
|
63
|
+
:type => :string,
|
64
|
+
:validation => '^[\w\-\.]+$',
|
65
|
+
:optional => false,
|
66
|
+
:maxlength => 40
|
67
|
+
|
68
|
+
output :fact,
|
69
|
+
:description => "The name of the fact being returned",
|
70
|
+
:display_as => "Fact"
|
71
|
+
|
72
|
+
output :value,
|
73
|
+
:description => "The value of the fact",
|
74
|
+
:display_as => "Value"
|
75
|
+
|
76
|
+
summarize do
|
77
|
+
aggregate summary(:value)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
action "daemon_stats", :description => "Get statistics from the running daemon" do
|
82
|
+
display :always
|
83
|
+
|
84
|
+
output :threads,
|
85
|
+
:description => "List of threads active in the daemon",
|
86
|
+
:display_as => "Threads"
|
87
|
+
|
88
|
+
output :agents,
|
89
|
+
:description => "List of agents loaded",
|
90
|
+
:display_as => "Agents"
|
91
|
+
|
92
|
+
output :pid,
|
93
|
+
:description => "Process ID of the daemon",
|
94
|
+
:display_as => "PID"
|
95
|
+
|
96
|
+
output :times,
|
97
|
+
:description => "Processor time consumed by the daemon",
|
98
|
+
:display_as => "Times"
|
99
|
+
|
100
|
+
output :validated,
|
101
|
+
:description => "Messages that passed security validation",
|
102
|
+
:display_as => "Security Validated"
|
103
|
+
|
104
|
+
output :unvalidated,
|
105
|
+
:description => "Messages that failed security validation",
|
106
|
+
:display_as => "Failed Security"
|
107
|
+
|
108
|
+
output :passed,
|
109
|
+
:description => "Passed filter checks",
|
110
|
+
:display_as => "Passed Filter"
|
111
|
+
|
112
|
+
output :filtered,
|
113
|
+
:description => "Didn't pass filter checks",
|
114
|
+
:display_as => "Failed Filter"
|
115
|
+
|
116
|
+
output :starttime,
|
117
|
+
:description => "Time the server started",
|
118
|
+
:display_as => "Start Time"
|
119
|
+
|
120
|
+
output :total,
|
121
|
+
:description => "Total messages received",
|
122
|
+
:display_as => "Total Messages"
|
123
|
+
|
124
|
+
output :replies,
|
125
|
+
:description => "Replies sent back to clients",
|
126
|
+
:display_as => "Replies"
|
127
|
+
|
128
|
+
output :configfile,
|
129
|
+
:description => "Config file used to start the daemon",
|
130
|
+
:display_as => "Config File"
|
131
|
+
|
132
|
+
output :version,
|
133
|
+
:description => "MCollective Version",
|
134
|
+
:display_as => "Version"
|
135
|
+
|
136
|
+
output :ttlexpired,
|
137
|
+
:description => "Messages that did pass TTL checks",
|
138
|
+
:display_as => "TTL Expired"
|
139
|
+
|
140
|
+
summarize do
|
141
|
+
aggregate summary(:version)
|
142
|
+
aggregate summary(:agents)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
action "agent_inventory", :description => "Inventory of all agents on the server" do
|
147
|
+
display :always
|
148
|
+
|
149
|
+
output :agents,
|
150
|
+
:description => "List of agents on the server",
|
151
|
+
:display_as => "Agents"
|
152
|
+
end
|
153
|
+
|
154
|
+
action "get_config_item", :description => "Get the active value of a specific config property" do
|
155
|
+
display :always
|
156
|
+
|
157
|
+
input :item,
|
158
|
+
:prompt => "Configuration Item",
|
159
|
+
:description => "The item to retrieve from the server",
|
160
|
+
:type => :string,
|
161
|
+
:validation => '^.+$',
|
162
|
+
:optional => false,
|
163
|
+
:maxlength => 50
|
164
|
+
|
165
|
+
output :item,
|
166
|
+
:description => "The config property being retrieved",
|
167
|
+
:display_as => "Property"
|
168
|
+
|
169
|
+
output :value,
|
170
|
+
:description => "The value that is in use",
|
171
|
+
:display_as => "Value"
|
172
|
+
|
173
|
+
summarize do
|
174
|
+
aggregate summary(:value)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
action "get_data", :description => "Get data from a data plugin" do
|
179
|
+
display :always
|
180
|
+
|
181
|
+
input :source,
|
182
|
+
:prompt => "Data Source",
|
183
|
+
:description => "The data plugin to retrieve information from",
|
184
|
+
:type => :string,
|
185
|
+
:validation => '^\w+$',
|
186
|
+
:optional => false,
|
187
|
+
:maxlength => 50
|
188
|
+
|
189
|
+
input :query,
|
190
|
+
:prompt => "Query",
|
191
|
+
:description => "The query argument to supply to the data plugin",
|
192
|
+
:type => :string,
|
193
|
+
:validation => '^.+$',
|
194
|
+
:optional => true,
|
195
|
+
:maxlength => 50
|
196
|
+
end
|
197
|
+
|
198
|
+
action "ping", :description => "Responds to requests for PING with PONG" do
|
199
|
+
display :always
|
200
|
+
|
201
|
+
output :pong,
|
202
|
+
:description => "The local timestamp",
|
203
|
+
:display_as => "Timestamp"
|
204
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
module MCollective
|
2
|
+
module Agent
|
3
|
+
class Rpcutil<RPC::Agent
|
4
|
+
# Basic system inventory, same as the basic discovery agent
|
5
|
+
action "inventory" do
|
6
|
+
reply[:agents] = Agents.agentlist
|
7
|
+
reply[:facts] = PluginManager["facts_plugin"].get_facts
|
8
|
+
reply[:version] = MCollective.version
|
9
|
+
reply[:classes] = []
|
10
|
+
reply[:main_collective] = config.main_collective
|
11
|
+
reply[:collectives] = config.collectives
|
12
|
+
reply[:data_plugins] = PluginManager.grep(/_data$/)
|
13
|
+
|
14
|
+
cfile = Config.instance.classesfile
|
15
|
+
if File.exist?(cfile)
|
16
|
+
reply[:classes] = File.readlines(cfile).map {|i| i.chomp}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Retrieve a single fact from the node
|
21
|
+
action "get_fact" do
|
22
|
+
validate :fact, String
|
23
|
+
|
24
|
+
reply[:fact] = request[:fact]
|
25
|
+
reply[:value] = Facts[request[:fact]]
|
26
|
+
end
|
27
|
+
|
28
|
+
# Get the global stats for this mcollectied
|
29
|
+
action "daemon_stats" do
|
30
|
+
stats = PluginManager["global_stats"].to_hash
|
31
|
+
|
32
|
+
reply[:threads] = stats[:threads]
|
33
|
+
reply[:agents] = stats[:agents]
|
34
|
+
reply[:pid] = stats[:pid]
|
35
|
+
reply[:times] = stats[:times]
|
36
|
+
reply[:configfile] = Config.instance.configfile
|
37
|
+
reply[:version] = MCollective.version
|
38
|
+
|
39
|
+
reply.data.merge!(stats[:stats])
|
40
|
+
end
|
41
|
+
|
42
|
+
# Builds an inventory of all agents on teh machine
|
43
|
+
# including license, version and timeout information
|
44
|
+
action "agent_inventory" do
|
45
|
+
reply[:agents] = []
|
46
|
+
|
47
|
+
Agents.agentlist.sort.each do |target_agent|
|
48
|
+
agent = PluginManager["#{target_agent}_agent"]
|
49
|
+
actions = agent.methods.grep(/_agent/)
|
50
|
+
|
51
|
+
agent_data = {:agent => target_agent,
|
52
|
+
:license => "unknown",
|
53
|
+
:timeout => agent.timeout,
|
54
|
+
:description => "unknown",
|
55
|
+
:name => target_agent,
|
56
|
+
:url => "unknown",
|
57
|
+
:version => "unknown",
|
58
|
+
:author => "unknown"}
|
59
|
+
|
60
|
+
agent_data.merge!(agent.meta)
|
61
|
+
|
62
|
+
reply[:agents] << agent_data
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Retrieves a single config property that is in effect
|
67
|
+
action "get_config_item" do
|
68
|
+
validate :item, String
|
69
|
+
|
70
|
+
reply.fail! "Unknown config property #{request[:item]}" unless config.respond_to?(request[:item])
|
71
|
+
|
72
|
+
reply[:item] = request[:item]
|
73
|
+
reply[:value] = config.send(request[:item])
|
74
|
+
end
|
75
|
+
|
76
|
+
# Responds to PING requests with the local timestamp
|
77
|
+
action "ping" do
|
78
|
+
reply[:pong] = Time.now.to_i
|
79
|
+
end
|
80
|
+
|
81
|
+
# Returns all configured collectives
|
82
|
+
action "collective_info" do
|
83
|
+
config = Config.instance
|
84
|
+
reply[:main_collective] = config.main_collective
|
85
|
+
reply[:collectives] = config.collectives
|
86
|
+
end
|
87
|
+
|
88
|
+
action "get_data" do
|
89
|
+
validate :source, String
|
90
|
+
|
91
|
+
query = Data.ddl_transform_input(Data.ddl(request[:source]), request[:query].to_s)
|
92
|
+
|
93
|
+
data = Data[ request[:source] ].lookup(query)
|
94
|
+
|
95
|
+
data.keys.each do |key|
|
96
|
+
reply[key] = data[key]
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
require 'timeout'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
module MCollective
|
6
|
+
module Facts
|
7
|
+
# A factsource for pbuilder
|
8
|
+
class Pbuilder_facts < Base
|
9
|
+
|
10
|
+
def load_facts_from_source
|
11
|
+
ret = {"pbuilderid" => get_pbuilderid()}
|
12
|
+
yaml_file = '/etc/mcollective/facts.yaml'
|
13
|
+
if File.exists?(yaml_file)
|
14
|
+
yaml_facts = YAML.load_file(yaml_file)
|
15
|
+
ret.merge!(yaml_facts)
|
16
|
+
end
|
17
|
+
ret
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_pbuilderid()
|
21
|
+
ret = nil
|
22
|
+
begin
|
23
|
+
addr = "169.254.169.254"
|
24
|
+
wait_sec = 2
|
25
|
+
Timeout::timeout(wait_sec) {open("http://#{addr}:80/")}
|
26
|
+
ret = OpenURI.open_uri("http://#{addr}/2008-02-01/meta-data/instance-id").read
|
27
|
+
rescue Timeout::Error
|
28
|
+
rescue
|
29
|
+
#TODO: unexpected; write to log what error is
|
30
|
+
end
|
31
|
+
ret
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
metadata :name => "development manager",
|
2
|
+
:description => "Manager which allows manipulation of nodes",
|
3
|
+
:author => "Reactor8",
|
4
|
+
:license => "",
|
5
|
+
:version => "",
|
6
|
+
:url => "",
|
7
|
+
:timeout => 2
|
8
|
+
action "inject_agent", :description => "Injects agent content and restarts mcollective" do
|
9
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'base64'
|
2
|
+
|
3
|
+
module MCollective
|
4
|
+
module Agent
|
5
|
+
class Dev_manager < RPC::Agent
|
6
|
+
|
7
|
+
AGENT_MCOLLECTIVE_LOCATION = "#{::MCollective::Config.instance.libdir}/mcollective/agent/"
|
8
|
+
@log = Log.instance
|
9
|
+
|
10
|
+
action "inject_agent" do
|
11
|
+
begin
|
12
|
+
|
13
|
+
ret ||= Response.new()
|
14
|
+
|
15
|
+
request[:agent_files].each do |k,v|
|
16
|
+
if v == :deleted
|
17
|
+
File.delete("#{AGENT_MCOLLECTIVE_LOCATION}#{k}")
|
18
|
+
next
|
19
|
+
end
|
20
|
+
content = Base64.decode64(v)
|
21
|
+
File.open("#{AGENT_MCOLLECTIVE_LOCATION}#{k}",'w') do |file|
|
22
|
+
file << content
|
23
|
+
end
|
24
|
+
end
|
25
|
+
ret.set_status_succeeded!()
|
26
|
+
|
27
|
+
t1 = Thread.new do
|
28
|
+
system("sudo /etc/init.d/mcollective restart")
|
29
|
+
end
|
30
|
+
|
31
|
+
return ret
|
32
|
+
|
33
|
+
rescue Exception => e
|
34
|
+
@log.error e
|
35
|
+
ret.set_status_failed!()
|
36
|
+
error_info = { :error => { :message => "Error syncing agents: #{e}" } }
|
37
|
+
ret.merge!(error_info)
|
38
|
+
end
|
39
|
+
return ret
|
40
|
+
end
|
41
|
+
end
|
42
|
+
#TODO: this should be common accross Agents
|
43
|
+
class Response < Hash
|
44
|
+
def initialize(hash={})
|
45
|
+
super()
|
46
|
+
self.merge!(hash)
|
47
|
+
self[:status] = :unknown unless hash.has_key?(:status)
|
48
|
+
end
|
49
|
+
|
50
|
+
def to_hash()
|
51
|
+
Hash.new.merge(self)
|
52
|
+
end
|
53
|
+
|
54
|
+
def failed?()
|
55
|
+
self[:status] == :failed
|
56
|
+
end
|
57
|
+
|
58
|
+
def set_status_failed!()
|
59
|
+
self[:status] = :failed
|
60
|
+
end
|
61
|
+
def set_status_succeeded!()
|
62
|
+
self[:status] = :succeeded
|
63
|
+
end
|
64
|
+
def set_dynamic_attributes!(dynamic_attributes)
|
65
|
+
self[:dynamic_attributes] = dynamic_attributes
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module MCollective
|
2
|
+
module Agent
|
3
|
+
# Discovery agent for The Marionette Collective
|
4
|
+
#
|
5
|
+
# Released under the Apache License, Version 2
|
6
|
+
class Discovery
|
7
|
+
attr_reader :timeout, :meta
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
config = Config.instance.pluginconf
|
11
|
+
|
12
|
+
@timeout = 5
|
13
|
+
@timeout = config["discovery.timeout"].to_i if config.include?("discovery.timeout")
|
14
|
+
|
15
|
+
@meta = {:license => "Apache License, Version 2",
|
16
|
+
:author => "R.I.Pienaar <rip@devco.net>",
|
17
|
+
:timeout => @timeout,
|
18
|
+
:name => "Discovery Agent",
|
19
|
+
:version => MCollective.version,
|
20
|
+
:url => "http://www.marionette-collective.org",
|
21
|
+
:description => "MCollective Discovery Agent"}
|
22
|
+
end
|
23
|
+
|
24
|
+
def handlemsg(msg, stomp)
|
25
|
+
reply = "unknown request"
|
26
|
+
|
27
|
+
case msg[:body]
|
28
|
+
when "ping"
|
29
|
+
reply = "pong"
|
30
|
+
|
31
|
+
else
|
32
|
+
reply = "Unknown Request: #{msg[:body]}"
|
33
|
+
end
|
34
|
+
|
35
|
+
reply
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|