rubyipmi 0.4.0 → 0.5.0

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.0
1
+ 0.5.0
@@ -1,10 +1,12 @@
1
1
  require "observer"
2
+ require 'tempfile'
2
3
 
3
4
  module Rubyipmi
4
5
 
5
6
  class BaseCommand
6
7
  include Observable
7
8
 
9
+
8
10
  attr_reader :cmd
9
11
  attr_accessor :options
10
12
  attr_reader :lastcall
@@ -13,6 +15,15 @@ module Rubyipmi
13
15
  # override in subclass
14
16
  end
15
17
 
18
+ def setpass
19
+ @passfile = Tempfile.new('')
20
+ @passfile.open
21
+ end
22
+
23
+ def removepass
24
+ @passfile.close!
25
+ end
26
+
16
27
  def to_s
17
28
  makecommand
18
29
  end
@@ -86,6 +97,7 @@ module Rubyipmi
86
97
 
87
98
 
88
99
  def run(debug=false)
100
+ setpass
89
101
  @result = nil
90
102
  command = makecommand
91
103
  if debug
@@ -94,6 +106,7 @@ module Rubyipmi
94
106
 
95
107
  @lastcall = "#{command}"
96
108
  @result = `#{command} 2>&1`
109
+ removepass
97
110
  #puts "Last Call: #{@lastcall}"
98
111
 
99
112
  # sometimes the command tool doesnt return the correct result
@@ -108,12 +121,14 @@ module Rubyipmi
108
121
 
109
122
 
110
123
  def run_without_opts(args=[], debug=false)
124
+ setpass
111
125
  @result = ""
112
126
  if debug
113
127
  return "#{cmd} #{args.join(" ")}"
114
128
  else
115
129
  @lastcall = "#{cmd} #{args.join(" ")}"
116
130
  @result = `#{cmd} #{args.join(" ")} 2>&1`
131
+ removepass
117
132
  end
118
133
 
119
134
  process_status = validate_status($?)
@@ -2,6 +2,15 @@ module Rubyipmi::Freeipmi
2
2
 
3
3
  class BaseCommand < Rubyipmi::BaseCommand
4
4
 
5
+ def setpass
6
+ super
7
+ @options["config-file"] = @passfile.path
8
+ @passfile.puts "password #{@options["password"]}\n"
9
+ @passfile.puts "username #{@options["username"]}"
10
+
11
+ @passfile.close
12
+ end
13
+
5
14
  def makecommand
6
15
  # need to format the options to freeipmi format
7
16
  args = @options.collect { |k, v|
@@ -11,6 +20,10 @@ module Rubyipmi::Freeipmi
11
20
  "--#{k}=#{v}"
12
21
  end
13
22
  }.join(" ")
23
+ # must remove from command line as its handled via conf file
24
+ args.delete("--password")
25
+ args.delete("--username")
26
+
14
27
 
15
28
  return "#{cmd} #{args}"
16
29
  end
@@ -0,0 +1,59 @@
1
+ module Rubyipmi::Freeipmi
2
+
3
+ class Fru < Rubyipmi::Freeipmi::BaseCommand
4
+
5
+ def initialize(opts = ObservableHash.new)
6
+ super("ipmi-fru", opts)
7
+ end
8
+
9
+ # return the list of fru information in a hash
10
+ def list
11
+ @list ||= parse(command)
12
+ end
13
+
14
+ def serial
15
+ list["chassis_serial_number"]
16
+ end
17
+
18
+ def manufacturer
19
+ list["board_manufacturer"]
20
+ end
21
+
22
+ def product
23
+ list["board_product_name"]
24
+ end
25
+
26
+ private
27
+
28
+ def method_missing(method, *args, &block)
29
+ if not list.has_key?(method.to_s)
30
+ raise NoMethodError
31
+ else
32
+ list[method.to_s]
33
+ end
34
+ end
35
+
36
+ # parse the fru information
37
+ def parse(data)
38
+ datalist = {}
39
+ data.lines.each do |line|
40
+ key, value = line.split(':')
41
+ next if key =~ /\n/
42
+ value = value.strip
43
+ key = key.gsub(/FRU/, '').strip.gsub(/\ /, '_').downcase
44
+ datalist[key] = value.strip
45
+ end
46
+ return datalist
47
+ end
48
+
49
+ # run the command and return result
50
+ def command
51
+ value = runcmd
52
+ if value
53
+ return @result
54
+ end
55
+ end
56
+
57
+ end
58
+
59
+ end
@@ -30,6 +30,10 @@ module Rubyipmi
30
30
  return "freeipmi"
31
31
  end
32
32
 
33
+ def fru
34
+ @fru ||= Rubyipmi::Freeipmi::Fru.new(@options)
35
+ end
36
+
33
37
  def bmc
34
38
  @bmc ||= Rubyipmi::Freeipmi::Bmc.new(@options)
35
39
  end
@@ -2,6 +2,15 @@ module Rubyipmi::Ipmitool
2
2
 
3
3
  class BaseCommand < Rubyipmi::BaseCommand
4
4
 
5
+ def setpass
6
+ super
7
+ @options["f"] = @passfile.path
8
+ @passfile.puts "#{@options["P"]}"
9
+ @passfile.close
10
+
11
+
12
+ end
13
+
5
14
  def makecommand
6
15
  args = ""
7
16
  # need to format the options to ipmitool format
@@ -9,6 +18,9 @@ module Rubyipmi::Ipmitool
9
18
  next if k == "cmdargs"
10
19
  args << "-#{k} #{v} "
11
20
  end
21
+ # must remove from command line as its handled via conf file
22
+ args.delete("-P")
23
+
12
24
  # since ipmitool requires commands to be in specific order
13
25
  args << " " + options["cmdargs"]
14
26
 
@@ -0,0 +1,63 @@
1
+ module Rubyipmi::Ipmitool
2
+
3
+ class Fru < Rubyipmi::Ipmitool::BaseCommand
4
+
5
+ def initialize(opts = ObservableHash.new)
6
+ super("ipmitool", opts)
7
+ end
8
+
9
+ # return the list of fru information in a hash
10
+ def list
11
+ @list ||= parse(command)
12
+ end
13
+
14
+ # returns the serial of the board
15
+ def serial
16
+ list["board_serial"]
17
+ end
18
+
19
+ # returns the manufacturer of the server
20
+ def manufacturer
21
+ list["product_manufacturer"]
22
+ end
23
+
24
+ # returns the product name of the server
25
+ def product
26
+ list["product_name"]
27
+ end
28
+
29
+ private
30
+
31
+ def method_missing(method, *args, &block)
32
+ if not list.has_key?(method.to_s)
33
+ raise NoMethodError
34
+ else
35
+ list[method.to_s]
36
+ end
37
+ end
38
+
39
+ # parse the fru information
40
+ def parse(data)
41
+ datalist = {}
42
+ data.lines.each do |line|
43
+ key, value = line.split(':')
44
+ next if key =~ /\n/
45
+ key = key.strip.gsub(/\ /, '_').downcase
46
+ datalist[key] = value.strip
47
+ end
48
+ return datalist
49
+ end
50
+
51
+ # run the command and return result
52
+ def command
53
+ @options["cmdargs"] = "fru"
54
+ value = runcmd
55
+ @options.delete_notify("cmdargs")
56
+ if value
57
+ return @result
58
+ end
59
+ end
60
+
61
+ end
62
+
63
+ end
@@ -29,6 +29,10 @@ module Rubyipmi
29
29
  #getWorkArounds
30
30
  end
31
31
 
32
+ def fru
33
+ @fru ||= Rubyipmi::Ipmitool::Fru.new(@options)
34
+ end
35
+
32
36
  def provider
33
37
  return "ipmitool"
34
38
  end
data/lib/rubyipmi.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  require 'rubyipmi/ipmitool/connection'
2
2
  require 'rubyipmi/freeipmi/connection'
3
+ require 'net/smtp'
4
+
3
5
 
4
6
  module Rubyipmi
5
7
 
@@ -77,4 +79,13 @@ module Rubyipmi
77
79
  end
78
80
  return available
79
81
  end
80
- end
82
+
83
+ def self.printdiag(user, pass, host)
84
+ @conn = Rubyipmi::connect(user, pass, host)
85
+ puts "Product: #{@conn.fru.product}"
86
+ puts "Manufacturer: #{@conn.fru.manufacturer}"
87
+ puts "BMC Info #{@conn.bmc.info.inspect}\n"
88
+ puts "Please email to corey@logicminds.biz when troubleshooting"
89
+ return true
90
+ end
91
+ end
data/rubyipmi.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "rubyipmi"
8
- s.version = "0.4.0"
8
+ s.version = "0.5.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Corey Osman"]
12
- s.date = "2012-08-27"
12
+ s.date = "2012-08-28"
13
13
  s.description = "A ruby wrapper for ipmi command line tools that supports ipmitool and freeipmi"
14
14
  s.email = "corey@logicminds.biz"
15
15
  s.extra_rdoc_files = [
@@ -35,6 +35,7 @@ Gem::Specification.new do |s|
35
35
  "lib/rubyipmi/freeipmi/commands/bmcinfo.rb",
36
36
  "lib/rubyipmi/freeipmi/commands/chassis.rb",
37
37
  "lib/rubyipmi/freeipmi/commands/chassisconfig.rb",
38
+ "lib/rubyipmi/freeipmi/commands/fru.rb",
38
39
  "lib/rubyipmi/freeipmi/commands/lan.rb",
39
40
  "lib/rubyipmi/freeipmi/commands/power.rb",
40
41
  "lib/rubyipmi/freeipmi/commands/sensors.rb",
@@ -44,6 +45,7 @@ Gem::Specification.new do |s|
44
45
  "lib/rubyipmi/ipmitool/commands/bmc.rb",
45
46
  "lib/rubyipmi/ipmitool/commands/chassis.rb",
46
47
  "lib/rubyipmi/ipmitool/commands/chassisconfig.rb",
48
+ "lib/rubyipmi/ipmitool/commands/fru.rb",
47
49
  "lib/rubyipmi/ipmitool/commands/lan.rb",
48
50
  "lib/rubyipmi/ipmitool/commands/power.rb",
49
51
  "lib/rubyipmi/ipmitool/commands/sensors.rb",
@@ -55,6 +57,7 @@ Gem::Specification.new do |s|
55
57
  "spec/chassis_config_spec.rb",
56
58
  "spec/chassis_spec.rb",
57
59
  "spec/connection_spec.rb",
60
+ "spec/fru_spec.rb",
58
61
  "spec/lan_spec.rb",
59
62
  "spec/power_spec.rb",
60
63
  "spec/rubyipmi_spec.rb",
data/spec/fru_spec.rb ADDED
@@ -0,0 +1,38 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "Fru" do
4
+
5
+ attr_accessor :provider
6
+ before :each do
7
+ user = ENV["ipmiuser"]
8
+ pass = ENV["ipmipass"]
9
+ host = ENV["ipmihost"]
10
+ provider = ENV["ipmiprovider"]
11
+ @conn = Rubyipmi.connect(user, pass, host, provider)
12
+
13
+ end
14
+
15
+ it "test should return manufacturer" do
16
+ @conn.fru.manufacturer.should_not be nil
17
+ end
18
+
19
+ it "test should return serial" do
20
+ @conn.fru.serial.should_not be nil
21
+ end
22
+
23
+ it "test should return product name" do
24
+ @conn.fru.product.should_not be nil
25
+ end
26
+
27
+ it "test should return fru list" do
28
+ @conn.fru.list.length.should be > 1
29
+ end
30
+
31
+ it "test missing method with known good method" do
32
+ @conn.fru.chassis_type.should_not be nil
33
+ end
34
+
35
+ it "test missing method with known bad method" do
36
+ expect {@conn.fru.blah}.to raise_exception
37
+ end
38
+ end
@@ -53,6 +53,10 @@ describe "rubyipmi" do
53
53
  Rubyipmi.providers_installed?.length.should be > 0
54
54
  end
55
55
 
56
+ it "test printdiag report" do
57
+ Rubyipmi.printdiag(@user, @pass, @host).should be_true
58
+ end
59
+
56
60
 
57
61
 
58
62
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubyipmi
3
3
  version: !ruby/object:Gem::Version
4
- hash: 15
4
+ hash: 11
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 4
8
+ - 5
9
9
  - 0
10
- version: 0.4.0
10
+ version: 0.5.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Corey Osman
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-08-27 00:00:00 Z
18
+ date: 2012-08-28 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  requirement: &id001 !ruby/object:Gem::Requirement
@@ -122,6 +122,7 @@ files:
122
122
  - lib/rubyipmi/freeipmi/commands/bmcinfo.rb
123
123
  - lib/rubyipmi/freeipmi/commands/chassis.rb
124
124
  - lib/rubyipmi/freeipmi/commands/chassisconfig.rb
125
+ - lib/rubyipmi/freeipmi/commands/fru.rb
125
126
  - lib/rubyipmi/freeipmi/commands/lan.rb
126
127
  - lib/rubyipmi/freeipmi/commands/power.rb
127
128
  - lib/rubyipmi/freeipmi/commands/sensors.rb
@@ -131,6 +132,7 @@ files:
131
132
  - lib/rubyipmi/ipmitool/commands/bmc.rb
132
133
  - lib/rubyipmi/ipmitool/commands/chassis.rb
133
134
  - lib/rubyipmi/ipmitool/commands/chassisconfig.rb
135
+ - lib/rubyipmi/ipmitool/commands/fru.rb
134
136
  - lib/rubyipmi/ipmitool/commands/lan.rb
135
137
  - lib/rubyipmi/ipmitool/commands/power.rb
136
138
  - lib/rubyipmi/ipmitool/commands/sensors.rb
@@ -142,6 +144,7 @@ files:
142
144
  - spec/chassis_config_spec.rb
143
145
  - spec/chassis_spec.rb
144
146
  - spec/connection_spec.rb
147
+ - spec/fru_spec.rb
145
148
  - spec/lan_spec.rb
146
149
  - spec/power_spec.rb
147
150
  - spec/rubyipmi_spec.rb