kurchatov 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +111 -0
- data/Rakefile +1 -0
- data/Vagrantfile +16 -0
- data/bin/kurchatov +6 -0
- data/examples/check_file_contains.rb +14 -0
- data/examples/count_proc.rb +14 -0
- data/examples/cpu.rb +29 -0
- data/examples/disk.rb +56 -0
- data/examples/disk_stat.rb +28 -0
- data/examples/dns_check.rb +5 -0
- data/examples/exim.rb +12 -0
- data/examples/file_age.rb +11 -0
- data/examples/find_files.rb +21 -0
- data/examples/http.rb +25 -0
- data/examples/iptables.rb +27 -0
- data/examples/la.rb +10 -0
- data/examples/mdadm.rb +43 -0
- data/examples/megacli.rb +12 -0
- data/examples/memory.rb +28 -0
- data/examples/net.rb +25 -0
- data/examples/net_stat.rb +25 -0
- data/examples/nfs.rb +9 -0
- data/examples/nginx.rb +22 -0
- data/examples/nginx_500.rb +48 -0
- data/examples/ntp.rb +15 -0
- data/examples/openfiles.rb +6 -0
- data/examples/pgsql.rb +67 -0
- data/examples/ping_icmp.rb +12 -0
- data/examples/ping_tcp.rb +14 -0
- data/examples/proc_mem.rb +24 -0
- data/examples/process_usage.rb +15 -0
- data/examples/rabbitmq.rb +16 -0
- data/examples/runit.rb +47 -0
- data/examples/sidekiq.rb +21 -0
- data/examples/sidekiq_queue_state.rb +9 -0
- data/examples/status_file.rb +14 -0
- data/examples/tw_cli.rb +17 -0
- data/examples/uptime.rb +14 -0
- data/kurchatov.gemspec +28 -0
- data/lib/kurchatov/application.rb +154 -0
- data/lib/kurchatov/config.rb +14 -0
- data/lib/kurchatov/log.rb +9 -0
- data/lib/kurchatov/mashie.rb +152 -0
- data/lib/kurchatov/mixin/command.rb +31 -0
- data/lib/kurchatov/mixin/event.rb +63 -0
- data/lib/kurchatov/mixin/http.rb +21 -0
- data/lib/kurchatov/mixin/init.rb +6 -0
- data/lib/kurchatov/mixin/ohai.rb +22 -0
- data/lib/kurchatov/mixin/queue.rb +14 -0
- data/lib/kurchatov/monitor.rb +62 -0
- data/lib/kurchatov/plugin/config.rb +68 -0
- data/lib/kurchatov/plugin/dsl.rb +81 -0
- data/lib/kurchatov/plugin/riemann.rb +54 -0
- data/lib/kurchatov/plugin.rb +15 -0
- data/lib/kurchatov/queue.rb +28 -0
- data/lib/kurchatov/responders/http.rb +36 -0
- data/lib/kurchatov/responders/init.rb +3 -0
- data/lib/kurchatov/responders/riemann.rb +46 -0
- data/lib/kurchatov/responders/udp.rb +32 -0
- data/lib/kurchatov/riemann/client.rb +49 -0
- data/lib/kurchatov/riemann/event.rb +42 -0
- data/lib/kurchatov/riemann/message.rb +18 -0
- data/lib/kurchatov/version.rb +3 -0
- data/lib/kurchatov.rb +3 -0
- data/lib/ohai/plugins/darwin/hostname.rb +22 -0
- data/lib/ohai/plugins/darwin/platform.rb +38 -0
- data/lib/ohai/plugins/hostname.rb +27 -0
- data/lib/ohai/plugins/linux/hostname.rb +26 -0
- data/lib/ohai/plugins/linux/platform.rb +113 -0
- data/lib/ohai/plugins/linux/virtualization.rb +125 -0
- data/lib/ohai/plugins/os.rb +53 -0
- data/lib/ohai/plugins/platform.rb +28 -0
- data/lib/ohai/plugins/virtualization.rb +86 -0
- data/lib/ohai/plugins/windows/hostname.rb +33 -0
- data/lib/ohai/plugins/windows/platform.rb +27 -0
- data/tests/run.sh +55 -0
- metadata +209 -0
@@ -0,0 +1,46 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require "kurchatov/riemann/client"
|
4
|
+
require "kurchatov/mixin/queue"
|
5
|
+
|
6
|
+
module Kurchatov
|
7
|
+
module Responders
|
8
|
+
class Riemann < Kurchatov::Plugin
|
9
|
+
|
10
|
+
include Kurchatov::Mixin::Queue
|
11
|
+
|
12
|
+
FLUSH_INTERVAL = 0.5
|
13
|
+
|
14
|
+
def initialize(conn)
|
15
|
+
@hosts = conn
|
16
|
+
@riemanns = Array.new
|
17
|
+
end
|
18
|
+
|
19
|
+
def run
|
20
|
+
make_clients
|
21
|
+
loop { flush; sleep FLUSH_INTERVAL }
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def make_clients
|
27
|
+
@riemanns.clear
|
28
|
+
@hosts.each do |host|
|
29
|
+
riemann, port = host.split(':')
|
30
|
+
@riemanns << Kurchatov::Riemann::Client.new(:host => riemann, :port => port)
|
31
|
+
@name = @riemanns.map { |c| "riemann client [#{c.host}:#{c.port}]" }.join(' , ')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def flush
|
36
|
+
@events_to_send ||= events.all
|
37
|
+
unless @events_to_send.empty?
|
38
|
+
@riemanns.each {|riemann| riemann << @events_to_send }
|
39
|
+
Log.debug("Sended events via #{@name.inspect}: #{@events_to_send}")
|
40
|
+
end
|
41
|
+
@events_to_send = nil
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Kurchatov
|
2
|
+
module Responders
|
3
|
+
class Udp < Kurchatov::Plugin
|
4
|
+
|
5
|
+
include Kurchatov::Mixin::Event
|
6
|
+
include Kurchatov::Mixin::Queue
|
7
|
+
|
8
|
+
def initialize(conn)
|
9
|
+
@host, @port = conn.split(':')
|
10
|
+
@name = "udp responder #{@host}:#{@port}"
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
def run
|
15
|
+
Socket.udp_server_loop(@host, @port) do |data, src|
|
16
|
+
process(data, src)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def process(data,src)
|
21
|
+
begin
|
22
|
+
event << JSON.parse(data)
|
23
|
+
src.reply "sended\n\n"
|
24
|
+
rescue => e
|
25
|
+
src.reply "failed to send: #{data.inspect}\n"
|
26
|
+
Log.error("Failed parse #{data.inspect}, #{e.class}: #{e}\n #{e.backtrace.join("\n")}")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require "timeout"
|
2
|
+
require "socket"
|
3
|
+
require "beefcake"
|
4
|
+
require "kurchatov/riemann/event"
|
5
|
+
require "kurchatov/riemann/message"
|
6
|
+
|
7
|
+
module Kurchatov
|
8
|
+
module Riemann
|
9
|
+
class Client
|
10
|
+
|
11
|
+
attr_accessor :host, :port
|
12
|
+
|
13
|
+
CONNECT_TIMEOUT = 5
|
14
|
+
SEND_TIMEOUT = 5
|
15
|
+
RIEMANN_PORT = 5555
|
16
|
+
|
17
|
+
def initialize(opts = {})
|
18
|
+
@host = opts[:host]
|
19
|
+
@port = opts[:port] || RIEMANN_PORT
|
20
|
+
@mutex = Mutex.new
|
21
|
+
end
|
22
|
+
|
23
|
+
def <<(events)
|
24
|
+
events = events.map {|e| Event.new(e) }
|
25
|
+
message = Message.new(:events => events)
|
26
|
+
with_connection do |socket|
|
27
|
+
x = message.encode_with_length
|
28
|
+
Timeout::timeout(SEND_TIMEOUT) {
|
29
|
+
socket.write(x)
|
30
|
+
socket.flush
|
31
|
+
}
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def with_connection
|
36
|
+
@mutex.synchronize do
|
37
|
+
yield(@socket || connect)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def connect
|
42
|
+
Timeout::timeout(CONNECT_TIMEOUT) {
|
43
|
+
@socket ||= TCPSocket.new(@host, @port)
|
44
|
+
}
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Kurchatov
|
2
|
+
module Riemann
|
3
|
+
class Event
|
4
|
+
include Beefcake::Message
|
5
|
+
optional :time, :int64, 1
|
6
|
+
optional :state, :string, 2
|
7
|
+
optional :service, :string, 3
|
8
|
+
optional :host, :string, 4
|
9
|
+
optional :description, :string, 5
|
10
|
+
repeated :tags, :string, 7
|
11
|
+
optional :ttl, :float, 8
|
12
|
+
optional :metric_sint64, :sint64, 13
|
13
|
+
optional :metric_d, :double, 14
|
14
|
+
optional :metric_f, :float, 15
|
15
|
+
|
16
|
+
def initialize(hash = nil)
|
17
|
+
if hash
|
18
|
+
super(hash)
|
19
|
+
self.metric = hash[:metric] if hash[:metric]
|
20
|
+
else
|
21
|
+
super
|
22
|
+
end
|
23
|
+
@time ||= Time.now.to_i
|
24
|
+
end
|
25
|
+
|
26
|
+
def metric
|
27
|
+
metric_d || metric_sint64 || metric_f
|
28
|
+
end
|
29
|
+
|
30
|
+
def metric=(m)
|
31
|
+
if Integer === m and (-(2**63)...2**63) === m
|
32
|
+
self.metric_sint64 = m
|
33
|
+
self.metric_f = m.to_f
|
34
|
+
else
|
35
|
+
self.metric_d = m.to_f
|
36
|
+
self.metric_f = m.to_f
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Kurchatov
|
2
|
+
module Riemann
|
3
|
+
class Message
|
4
|
+
include Beefcake::Message
|
5
|
+
|
6
|
+
optional :ok, :bool, 2
|
7
|
+
optional :error, :string, 3
|
8
|
+
repeated :events, Event, 6
|
9
|
+
|
10
|
+
def encode_with_length
|
11
|
+
buffer = ''
|
12
|
+
encoded = encode buffer
|
13
|
+
"#{[encoded.length].pack('N')}#{encoded}"
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/kurchatov.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
3
|
+
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
provides "fqdn", "hostname"
|
20
|
+
|
21
|
+
hostname from("hostname -s")
|
22
|
+
fqdn from("hostname")
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
3
|
+
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
provides "platform", "platform_version", "platform_build", "platform_family"
|
20
|
+
|
21
|
+
popen4("/usr/bin/sw_vers") do |pid, stdin, stdout, stderr|
|
22
|
+
stdin.close
|
23
|
+
stdout.each do |line|
|
24
|
+
case line
|
25
|
+
when /^ProductName:\s+(.+)$/
|
26
|
+
macname = $1
|
27
|
+
macname.downcase!
|
28
|
+
macname.gsub!(" ", "_")
|
29
|
+
platform macname
|
30
|
+
when /^ProductVersion:\s+(.+)$/
|
31
|
+
platform_version $1
|
32
|
+
when /^BuildVersion:\s+(.+)$/
|
33
|
+
platform_build $1
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
platform_family "mac_os_x"
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
3
|
+
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
provides "fqdn", "domain"
|
20
|
+
|
21
|
+
require_plugin "#{os}::hostname"
|
22
|
+
|
23
|
+
# Domain is everything after the first dot
|
24
|
+
if fqdn
|
25
|
+
fqdn =~ /.+?\.(.*)/
|
26
|
+
domain $1
|
27
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
3
|
+
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
provides "hostname", "fqdn"
|
20
|
+
|
21
|
+
hostname from("hostname -s")
|
22
|
+
begin
|
23
|
+
fqdn from("hostname --fqdn")
|
24
|
+
rescue
|
25
|
+
Ohai::Log.debug("hostname -f returned an error, probably no domain is set")
|
26
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
3
|
+
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
def get_redhatish_platform(contents)
|
20
|
+
contents[/^Red Hat/i] ? "redhat" : contents[/(\w+)/i, 1].downcase
|
21
|
+
end
|
22
|
+
|
23
|
+
def get_redhatish_version(contents)
|
24
|
+
contents[/Rawhide/i] ? contents[/((\d+) \(Rawhide\))/i, 1].downcase : contents[/release ([\d\.]+)/, 1]
|
25
|
+
end
|
26
|
+
|
27
|
+
provides "platform", "platform_version", "platform_family"
|
28
|
+
|
29
|
+
require_plugin 'linux::lsb'
|
30
|
+
|
31
|
+
# platform [ and platform_version ? ] should be lower case to avoid dealing with RedHat/Redhat/redhat matching
|
32
|
+
if File.exists?("/etc/oracle-release")
|
33
|
+
contents = File.read("/etc/oracle-release").chomp
|
34
|
+
platform "oracle"
|
35
|
+
platform_version get_redhatish_version(contents)
|
36
|
+
elsif File.exists?("/etc/enterprise-release")
|
37
|
+
contents = File.read("/etc/enterprise-release").chomp
|
38
|
+
platform "oracle"
|
39
|
+
platform_version get_redhatish_version(contents)
|
40
|
+
elsif File.exists?("/etc/debian_version")
|
41
|
+
# Ubuntu and Debian both have /etc/debian_version
|
42
|
+
# Ubuntu should always have a working lsb, debian does not by default
|
43
|
+
if lsb[:id] =~ /Ubuntu/i
|
44
|
+
platform "ubuntu"
|
45
|
+
platform_version lsb[:release]
|
46
|
+
elsif lsb[:id] =~ /LinuxMint/i
|
47
|
+
platform "linuxmint"
|
48
|
+
platform_version lsb[:release]
|
49
|
+
else
|
50
|
+
if File.exists?("/usr/bin/raspi-config")
|
51
|
+
platform "raspbian"
|
52
|
+
else
|
53
|
+
platform "debian"
|
54
|
+
end
|
55
|
+
platform_version File.read("/etc/debian_version").chomp
|
56
|
+
end
|
57
|
+
elsif File.exists?("/etc/redhat-release")
|
58
|
+
contents = File.read("/etc/redhat-release").chomp
|
59
|
+
platform get_redhatish_platform(contents)
|
60
|
+
platform_version get_redhatish_version(contents)
|
61
|
+
elsif File.exists?("/etc/system-release")
|
62
|
+
contents = File.read("/etc/system-release").chomp
|
63
|
+
platform get_redhatish_platform(contents)
|
64
|
+
platform_version get_redhatish_version(contents)
|
65
|
+
elsif File.exists?('/etc/gentoo-release')
|
66
|
+
platform "gentoo"
|
67
|
+
platform_version File.read('/etc/gentoo-release').scan(/(\d+|\.+)/).join
|
68
|
+
elsif File.exists?('/etc/SuSE-release')
|
69
|
+
platform "suse"
|
70
|
+
suse_release = File.read("/etc/SuSE-release")
|
71
|
+
platform_version suse_release.scan(/VERSION = (\d+)\nPATCHLEVEL = (\d+)/).flatten.join(".")
|
72
|
+
platform_version suse_release.scan(/VERSION = ([\d\.]{2,})/).flatten.join(".") if platform_version == ""
|
73
|
+
elsif File.exists?('/etc/slackware-version')
|
74
|
+
platform "slackware"
|
75
|
+
platform_version File.read("/etc/slackware-version").scan(/(\d+|\.+)/).join
|
76
|
+
elsif File.exists?('/etc/arch-release')
|
77
|
+
platform "arch"
|
78
|
+
# no way to determine platform_version in a rolling release distribution
|
79
|
+
# kernel release will be used - ex. 2.6.32-ARCH
|
80
|
+
elsif lsb[:id] =~ /RedHat/i
|
81
|
+
platform "redhat"
|
82
|
+
platform_version lsb[:release]
|
83
|
+
elsif lsb[:id] =~ /Amazon/i
|
84
|
+
platform "amazon"
|
85
|
+
platform_version lsb[:release]
|
86
|
+
elsif lsb[:id] =~ /ScientificSL/i
|
87
|
+
platform "scientific"
|
88
|
+
platform_version lsb[:release]
|
89
|
+
elsif lsb[:id] =~ /XenServer/i
|
90
|
+
platform "xenserver"
|
91
|
+
platform_version lsb[:release]
|
92
|
+
elsif lsb[:id] # LSB can provide odd data that changes between releases, so we currently fall back on it rather than dealing with its subtleties
|
93
|
+
platform lsb[:id].downcase
|
94
|
+
platform_version lsb[:release]
|
95
|
+
end
|
96
|
+
|
97
|
+
|
98
|
+
case platform
|
99
|
+
when /debian/, /ubuntu/, /linuxmint/, /raspbian/
|
100
|
+
platform_family "debian"
|
101
|
+
when /fedora/
|
102
|
+
platform_family "fedora"
|
103
|
+
when /oracle/, /centos/, /redhat/, /scientific/, /enterpriseenterprise/, /amazon/, /xenserver/ # Note that 'enterpriseenterprise' is oracle's LSB "distributor ID"
|
104
|
+
platform_family "rhel"
|
105
|
+
when /suse/
|
106
|
+
platform_family "suse"
|
107
|
+
when /gentoo/
|
108
|
+
platform_family "gentoo"
|
109
|
+
when /slackware/
|
110
|
+
platform_family "slackware"
|
111
|
+
when /arch/
|
112
|
+
platform_family "arch"
|
113
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Thom May (<thom@clearairturbulence.org>)
|
3
|
+
# Copyright:: Copyright (c) 2009 Opscode, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
provides "virtualization"
|
20
|
+
|
21
|
+
virtualization Mash.new
|
22
|
+
|
23
|
+
# if it is possible to detect paravirt vs hardware virt, it should be put in
|
24
|
+
# virtualization[:mechanism]
|
25
|
+
|
26
|
+
## Xen
|
27
|
+
# /proc/xen is an empty dir for EL6 + Linode Guests
|
28
|
+
if File.exists?("/proc/xen")
|
29
|
+
virtualization[:system] = "xen"
|
30
|
+
# Assume guest
|
31
|
+
virtualization[:role] = "guest"
|
32
|
+
|
33
|
+
# This file should exist on most Xen systems, normally empty for guests
|
34
|
+
if File.exists?("/proc/xen/capabilities")
|
35
|
+
if File.read("/proc/xen/capabilities") =~ /control_d/i
|
36
|
+
virtualization[:role] = "host"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Xen Notes:
|
42
|
+
# - cpuid of guests, if we could get it, would also be a clue
|
43
|
+
# - may be able to determine if under paravirt from /dev/xen/evtchn (See OHAI-253)
|
44
|
+
# - EL6 guests carry a 'hypervisor' cpu flag
|
45
|
+
# - Additional edge cases likely should not change the above assumptions
|
46
|
+
# but rather be additive - btm
|
47
|
+
|
48
|
+
# Detect from kernel module
|
49
|
+
if File.exists?("/proc/modules")
|
50
|
+
modules = File.read("/proc/modules")
|
51
|
+
if modules =~ /^kvm/
|
52
|
+
virtualization[:system] = "kvm"
|
53
|
+
virtualization[:role] = "host"
|
54
|
+
elsif modules =~ /^vboxdrv/
|
55
|
+
virtualization[:system] = "vbox"
|
56
|
+
virtualization[:role] = "host"
|
57
|
+
elsif modules =~ /^vboxguest/
|
58
|
+
virtualization[:system] = "vbox"
|
59
|
+
virtualization[:role] = "guest"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# Detect KVM/QEMU from cpuinfo, report as KVM
|
64
|
+
# We could pick KVM from 'Booting paravirtualized kernel on KVM' in dmesg
|
65
|
+
# 2.6.27-9-server (intrepid) has this / 2.6.18-6-amd64 (etch) does not
|
66
|
+
# It would be great if we could read pv_info in the kernel
|
67
|
+
# Wait for reply to: http://article.gmane.org/gmane.comp.emulators.kvm.devel/27885
|
68
|
+
if File.exists?("/proc/cpuinfo")
|
69
|
+
if File.read("/proc/cpuinfo") =~ /QEMU Virtual CPU/
|
70
|
+
virtualization[:system] = "kvm"
|
71
|
+
virtualization[:role] = "guest"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# Detect OpenVZ / Virtuozzo.
|
76
|
+
# http://wiki.openvz.org/BC_proc_entries
|
77
|
+
if File.exists?("/proc/bc/0")
|
78
|
+
virtualization[:system] = "openvz"
|
79
|
+
virtualization[:role] = "host"
|
80
|
+
elsif File.exists?("/proc/vz")
|
81
|
+
virtualization[:system] = "openvz"
|
82
|
+
virtualization[:role] = "guest"
|
83
|
+
end
|
84
|
+
|
85
|
+
# http://www.dmo.ca/blog/detecting-virtualization-on-linux
|
86
|
+
if File.exists?("/usr/sbin/dmidecode")
|
87
|
+
popen4("dmidecode") do |pid, stdin, stdout, stderr|
|
88
|
+
stdin.close
|
89
|
+
dmi_info = stdout.read
|
90
|
+
case dmi_info
|
91
|
+
when /Manufacturer: Microsoft/
|
92
|
+
if dmi_info =~ /Product Name: Virtual Machine/
|
93
|
+
virtualization[:system] = "virtualpc"
|
94
|
+
virtualization[:role] = "guest"
|
95
|
+
end
|
96
|
+
when /Manufacturer: VMware/
|
97
|
+
if dmi_info =~ /Product Name: VMware Virtual Platform/
|
98
|
+
virtualization[:system] = "vmware"
|
99
|
+
virtualization[:role] = "guest"
|
100
|
+
end
|
101
|
+
when /Manufacturer: Xen/
|
102
|
+
if dmi_info =~ /Product Name: HVM domU/
|
103
|
+
virtualization[:system] = "xen"
|
104
|
+
virtualization[:role] = "guest"
|
105
|
+
end
|
106
|
+
else
|
107
|
+
nil
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
# Detect Linux-VServer
|
114
|
+
if File.exists?("/proc/self/status")
|
115
|
+
proc_self_status = File.read("/proc/self/status")
|
116
|
+
vxid = proc_self_status.match(/^(s_context|VxID): (\d+)$/)
|
117
|
+
if vxid and vxid[2]
|
118
|
+
virtualization[:system] = "linux-vserver"
|
119
|
+
if vxid[2] == "0"
|
120
|
+
virtualization[:role] = "host"
|
121
|
+
else
|
122
|
+
virtualization[:role] = "guest"
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
3
|
+
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
provides "os", "os_version"
|
20
|
+
|
21
|
+
require 'rbconfig'
|
22
|
+
|
23
|
+
require_plugin 'kernel'
|
24
|
+
|
25
|
+
case ::RbConfig::CONFIG['host_os']
|
26
|
+
when /aix(.+)$/
|
27
|
+
os "aix"
|
28
|
+
when /darwin(.+)$/
|
29
|
+
os "darwin"
|
30
|
+
when /hpux(.+)$/
|
31
|
+
os "hpux"
|
32
|
+
when /linux/
|
33
|
+
os "linux"
|
34
|
+
when /freebsd(.+)$/
|
35
|
+
os "freebsd"
|
36
|
+
when /openbsd(.+)$/
|
37
|
+
os "openbsd"
|
38
|
+
when /netbsd(.*)$/
|
39
|
+
os "netbsd"
|
40
|
+
when /solaris2/
|
41
|
+
os "solaris2"
|
42
|
+
when /mswin|mingw32|windows/
|
43
|
+
# After long discussion in IRC the "powers that be" have come to a concensus
|
44
|
+
# that there is no other Windows platforms exist that were not based on the
|
45
|
+
# Windows_NT kernel, so we herby decree that "windows" will refer to all
|
46
|
+
# platforms built upon the Windows_NT kernel and have access to win32 or win64
|
47
|
+
# subsystems.
|
48
|
+
os "windows"
|
49
|
+
else
|
50
|
+
os ::RbConfig::CONFIG['host_os']
|
51
|
+
end
|
52
|
+
|
53
|
+
os_version kernel[:release]
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Adam Jacob (<adam@opscode.com>)
|
3
|
+
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
provides "platform", "platform_version", "platform_family"
|
20
|
+
|
21
|
+
require_plugin "#{os}::platform"
|
22
|
+
|
23
|
+
platform os unless attribute?("platform")
|
24
|
+
|
25
|
+
platform_version os_version unless attribute?("platform_version")
|
26
|
+
|
27
|
+
platform_family platform unless attribute?("platform_family")
|
28
|
+
|