escoffier 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.1.2
data/bin/loads CHANGED
@@ -1,26 +1,51 @@
1
1
  #!/usr/bin/env ruby
2
+ #
3
+ # loads uses Simple Network Management Protocol (SNMP) configured for the
4
+ # WADRC site to display load information of computer utilization to allow
5
+ # people to know where to process.
6
+ #
7
+ # Originally based off of a script written by John Ollinger @ Waisman,
8
+ # this uses SNMP instead of ssh and displays color based on percent
9
+ # utilization.
10
+ #
11
+ # EKK / WADRC Neuroimaging Core / Sept. 20, 2010
2
12
 
3
13
  require 'rubygems'
4
- require 'pp'
5
14
  require 'snmp'
6
15
  require 'term/ansicolor'
16
+ LOAD_PATHS = %w{. ~/.loads /etc /Data/vtrak1/data1/lab_scripts }
7
17
 
8
- def hosts
18
+ # Load in the list of hosts to monitor.
19
+ # Look for a file called "load_config.yaml" first in the current directory, then
20
+ def host_list
9
21
  if ARGV.size >= 1
10
22
  hosts = ARGV
11
- else
12
- # Key-value pairs are hostname and number of CPUs
13
- hosts = {
14
- :miho => 4,
15
- :pebbles => 4,
16
- :schroeder => 8,
17
- :nelson => 8,
18
- :jimbo => 8,
19
- :kearney => 8,
20
- :stella => 16}
23
+ else
24
+ LOAD_PATHS.each do |path|
25
+ hosts = read_config File.join(path, "load_config.yaml")
26
+ if hosts
27
+ # puts "Using hosts listed in load_config.yaml from #{path}"
28
+ return hosts
29
+ end
30
+ end
31
+
32
+ # If no host config was found, just use localhost.
33
+ if hosts.nil?
34
+ puts "Warning: Unable to find host information."
35
+ hosts = {:localhost => 0}
36
+ end
37
+ end
38
+ end
39
+
40
+ # Read YAML file if it exists.
41
+ def read_config(file)
42
+ if File.readable? file
43
+ require 'yaml'
44
+ YAML::load_file file
21
45
  end
22
46
  end
23
47
 
48
+ # Gather CPU Utilization Data from a list of Hosts using SNMP
24
49
  def gather_data_on(hosts)
25
50
  load_data = {}
26
51
 
@@ -40,13 +65,12 @@ def gather_data_on(hosts)
40
65
  # just list the required OID's directly.
41
66
  SNMP::Manager.open(:Host => hostname, :Community => 'brainmap', :MibModules => mibs, :retries => 1, :timeout => 1) do |manager|
42
67
  name = manager.get("sysName.0").varbind_list.first.value.split(".").first.to_s
68
+ oids = ["1.3.6.1.4.1.2021.10.1.3.1", "1.3.6.1.4.1.2021.10.1.3.2", "1.3.6.1.4.1.2021.10.1.3.3"]
69
+ load_data[name] = { :loads => manager.get(oids).each_varbind.collect {|vb| vb.value.to_s }, :cpu_count => cpus }
43
70
  # 1-min: UCD-SNMP-MIB::laLoad.1 => "1.3.6.1.4.1.2021.10.1.3.1"
44
71
  # 5-min: UCD-SNMP-MIB::laLoad.2 => "1.3.6.1.4.1.2021.10.1.3.2"
45
72
  # 15-min: UCD-SNMP-MIB::laLoad.3 => "1.3.6.1.4.1.2021.10.1.3.3"
46
- # load_data[name] = [manager.get(["UCD-SNMP-MIB::laLoad.1", "UCD-SNMP-MIB::laLoad.2", "UCD-SNMP-MIB::laLoad.3"]).each_varbind.collect{|vb| vb.value.to_s }, cpus]
47
- load_data[name] = [manager.get(["1.3.6.1.4.1.2021.10.1.3.1", "1.3.6.1.4.1.2021.10.1.3.2", "1.3.6.1.4.1.2021.10.1.3.3"]).each_varbind.collect{|vb| vb.value.to_s }, cpus]
48
- # response = manager.get(["sysName.0", "UCD-SNMP-MIB::laLoad.1", "UCD-SNMP-MIB::laLoad.2", "UCD-SNMP-MIB::laLoad.3"])
49
- # pp response
73
+ # oids = ["UCD-SNMP-MIB::laLoad.1", "UCD-SNMP-MIB::laLoad.2", "UCD-SNMP-MIB::laLoad.3"]
50
74
  end
51
75
  rescue SNMP::RequestTimeout => e
52
76
  puts "Warning: #{e}"
@@ -55,34 +79,47 @@ def gather_data_on(hosts)
55
79
  end
56
80
  end
57
81
 
58
- display_data(load_data)
82
+ unless load_data.empty?
83
+ build_display(load_data)
84
+ else
85
+ puts Term::ANSIColor.bold {"\nError: No CPU load data available."}
86
+ puts "Please check that SNMP is running on all machines and that they are "
87
+ "configured correctly in load_config.yaml\n\n"
88
+ end
59
89
  end
60
90
 
61
- def display_data(load_data)
62
- display = ""
63
- display << "\nLoad Averages over three intervals:\n\n"
64
- display << Term::ANSIColor.bold {"\t%-15s\t%-4s\t" % ["Server (CPUs)", "% Util"] }
65
- display << Term::ANSIColor.bold {"%s\t%s\t%s\n" % ["1-minute", "5-minutes", "15-minutes"] }
91
+ # Header Information for the CPU Table
92
+ def header
93
+ display = "\nLoad Averages over three intervals:\n\n"
94
+ display << Term::ANSIColor.bold
95
+ display << "\t%-15s\t%-4s\t" % ["Server (CPUs)", "% Util"]
96
+ display << "%s\t%s\t%s\n" % ["1-minute", "5-minutes", "15-minutes"]
66
97
  display << "\t%-15s\t%-4s\t%s\t%s\t%s\n" % ["-"*13, "-"*6, "-" * 8, "-" * 8, "-" * 8]
67
- load_data.sort_by{|la| la.last.first}.reverse.each do |average_hash|
68
- cpus = average_hash.last.last
69
- utilization = (average_hash.last.first[1].to_f / cpus) * 100
98
+ display << Term::ANSIColor.clear
99
+ end
100
+
101
+ # Build Output for the CPU Table
102
+ def build_display(load_data)
103
+ display = header
104
+ load_data.sort_by{|data| data.last[:loads][1].to_f / data.last[:cpu_count]}.reverse.each do |hostname, averages|
105
+ utilization = (averages[:loads][1].to_f / averages[:cpu_count]) * 100
106
+ low = 50; high = 80
70
107
  case utilization
71
- when 0.0...50.0
108
+ when 0...low
72
109
  color = "green"
73
- when 50.0..100
110
+ when low..high
74
111
  color = "yellow"
75
112
  else
76
113
  color = "red"
77
114
  end
78
115
  display << eval("Term::ANSIColor.#{color}")
79
- display << "\t%-15s\t" % "#{average_hash.first} (#{average_hash.last.last})"
116
+ display << "\t%-15s\t" % "#{hostname} (#{averages[:cpu_count]})"
80
117
  display << "%-2.2f\t" % utilization
81
- average_hash.last.first.collect {|la| display << "%s\t\t" % la }
118
+ averages[:loads].collect {|la| display << "%s\t\t" % la }
82
119
  display << "\n"
83
120
  end
84
121
  display << Term::ANSIColor.clear
85
122
  end
86
123
 
87
-
88
- puts gather_data_on hosts
124
+ # Run Main Program
125
+ puts gather_data_on host_list
@@ -0,0 +1,6 @@
1
+ # Example load_config.yaml script for loads
2
+ # Format: Resolvable hostname: Number of CPUs
3
+ pebbles: 4
4
+ schroeder: 8
5
+ nelson: 8
6
+ rafiki: 16
data/escoffier.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{escoffier}
8
- s.version = "0.1.1"
8
+ s.version = "0.1.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Erik Kastman"]
@@ -25,6 +25,7 @@ Gem::Specification.new do |s|
25
25
  "bin/loads",
26
26
  "bin/mise",
27
27
  "bin/normalize_directory.rb",
28
+ "config/load_config.yaml",
28
29
  "escoffier.gemspec",
29
30
  "lib/escoffier.rb",
30
31
  "lib/escoffier/compressible.rb",
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 1
9
- version: 0.1.1
8
+ - 2
9
+ version: 0.1.2
10
10
  platform: ruby
11
11
  authors:
12
12
  - Erik Kastman
@@ -85,6 +85,7 @@ files:
85
85
  - bin/loads
86
86
  - bin/mise
87
87
  - bin/normalize_directory.rb
88
+ - config/load_config.yaml
88
89
  - escoffier.gemspec
89
90
  - lib/escoffier.rb
90
91
  - lib/escoffier/compressible.rb