rubyipmi 0.10.0 → 0.11.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.
Files changed (89) hide show
  1. checksums.yaml +5 -5
  2. data/.document +5 -0
  3. data/.gitignore +50 -0
  4. data/.rspec +1 -0
  5. data/.rubocop.yml +66 -0
  6. data/.travis.yml +13 -0
  7. data/Gemfile +3 -3
  8. data/README.md +9 -3
  9. data/RELEASE_NOTES.md +33 -0
  10. data/Rakefile +15 -42
  11. data/lib/rubyipmi/commands/basecommand.rb +17 -23
  12. data/lib/rubyipmi/commands/mixins/power_mixin.rb +50 -0
  13. data/lib/rubyipmi/commands/mixins/sensors_mixin.rb +54 -0
  14. data/lib/rubyipmi/freeipmi/commands/basecommand.rb +26 -35
  15. data/lib/rubyipmi/freeipmi/commands/bmc.rb +4 -7
  16. data/lib/rubyipmi/freeipmi/commands/bmcconfig.rb +7 -17
  17. data/lib/rubyipmi/freeipmi/commands/bmcdevice.rb +2 -9
  18. data/lib/rubyipmi/freeipmi/commands/bmcinfo.rb +4 -10
  19. data/lib/rubyipmi/freeipmi/commands/chassis.rb +27 -45
  20. data/lib/rubyipmi/freeipmi/commands/chassisconfig.rb +23 -38
  21. data/lib/rubyipmi/freeipmi/commands/fru.rb +23 -42
  22. data/lib/rubyipmi/freeipmi/commands/lan.rb +4 -6
  23. data/lib/rubyipmi/freeipmi/commands/power.rb +8 -51
  24. data/lib/rubyipmi/freeipmi/commands/sensors.rb +10 -67
  25. data/lib/rubyipmi/freeipmi/connection.rb +14 -17
  26. data/lib/rubyipmi/freeipmi/errorcodes.rb +11 -17
  27. data/lib/rubyipmi/ipmitool/commands/basecommand.rb +12 -16
  28. data/lib/rubyipmi/ipmitool/commands/bmc.rb +13 -22
  29. data/lib/rubyipmi/ipmitool/commands/chassis.rb +26 -44
  30. data/lib/rubyipmi/ipmitool/commands/chassisconfig.rb +11 -21
  31. data/lib/rubyipmi/ipmitool/commands/fru.rb +35 -48
  32. data/lib/rubyipmi/ipmitool/commands/lan.rb +25 -28
  33. data/lib/rubyipmi/ipmitool/commands/power.rb +7 -58
  34. data/lib/rubyipmi/ipmitool/commands/sensors.rb +10 -68
  35. data/lib/rubyipmi/ipmitool/connection.rb +10 -19
  36. data/lib/rubyipmi/ipmitool/errorcodes.rb +11 -45
  37. data/lib/rubyipmi/observablehash.rb +1 -2
  38. data/lib/rubyipmi/version.rb +5 -0
  39. data/lib/rubyipmi.rb +23 -28
  40. data/rubyipmi.gemspec +17 -128
  41. metadata +18 -101
  42. data/spec/Vagrantfile +0 -45
  43. data/spec/fixtures/freeipmi/bmc_config.txt +0 -317
  44. data/spec/fixtures/freeipmi/bmc_config_lan_conf.txt +0 -19
  45. data/spec/fixtures/freeipmi/bmc_info.txt +0 -32
  46. data/spec/fixtures/freeipmi/errors.txt +0 -3
  47. data/spec/fixtures/freeipmi/fru.txt +0 -13
  48. data/spec/fixtures/freeipmi/sensors.txt +0 -29
  49. data/spec/fixtures/ipmitool/bmc_info.txt +0 -20
  50. data/spec/fixtures/ipmitool/errors.txt +0 -10
  51. data/spec/fixtures/ipmitool/fru.txt +0 -96
  52. data/spec/fixtures/ipmitool/lan.txt +0 -17
  53. data/spec/fixtures/ipmitool/sensors.txt +0 -105
  54. data/spec/integration/bmc_spec.rb +0 -48
  55. data/spec/integration/chassis_config_spec.rb +0 -38
  56. data/spec/integration/chassis_spec.rb +0 -26
  57. data/spec/integration/connection_spec.rb +0 -45
  58. data/spec/integration/fru_spec.rb +0 -38
  59. data/spec/integration/lan_spec.rb +0 -50
  60. data/spec/integration/power_spec.rb +0 -40
  61. data/spec/integration/rubyipmi_spec.rb +0 -114
  62. data/spec/integration/sensor_spec.rb +0 -43
  63. data/spec/manifests/default.pp +0 -50
  64. data/spec/puppetmodules/archive/LICENSE-2.0.txt +0 -202
  65. data/spec/puppetmodules/archive/Modulefile +0 -8
  66. data/spec/puppetmodules/archive/README.md +0 -40
  67. data/spec/puppetmodules/archive/manifests/download.pp +0 -157
  68. data/spec/puppetmodules/archive/manifests/extract.pp +0 -81
  69. data/spec/puppetmodules/archive/manifests/init.pp +0 -70
  70. data/spec/puppetmodules/archive/manifests/tar-gz.pp +0 -7
  71. data/spec/puppetmodules/archive/manifests/zip.pp +0 -7
  72. data/spec/puppetmodules/archive/metadata.json +0 -26
  73. data/spec/spec_helper.rb +0 -47
  74. data/spec/unit/freeipmi/bmc-info_spec.rb +0 -38
  75. data/spec/unit/freeipmi/bmc_spec.rb +0 -43
  76. data/spec/unit/freeipmi/connection_spec.rb +0 -121
  77. data/spec/unit/freeipmi/errorcodes_spec.rb +0 -28
  78. data/spec/unit/freeipmi/fru_spec.rb +0 -76
  79. data/spec/unit/freeipmi/lan_spec.rb +0 -0
  80. data/spec/unit/freeipmi/sensors_spec.rb +0 -85
  81. data/spec/unit/ipmitool/bmc_spec.rb +0 -77
  82. data/spec/unit/ipmitool/connection_spec.rb +0 -122
  83. data/spec/unit/ipmitool/errorcodes_spec.rb +0 -35
  84. data/spec/unit/ipmitool/fru_spec.rb +0 -77
  85. data/spec/unit/ipmitool/lan_spec.rb +0 -94
  86. data/spec/unit/ipmitool/sensors_spec.rb +0 -96
  87. data/spec/unit/rubyipmi_spec.rb +0 -50
  88. data/spec/vagrant +0 -27
  89. data/spec/vagrant.pub +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 3ed850aa093b990a1aa90dd18715c163e69a1d5f
4
- data.tar.gz: d26e0b37395b5c94054c5fa8287b02cf3a7b96eb
2
+ SHA256:
3
+ metadata.gz: 7d71a0a1e0d59728f61b38be628466e17f2a27b837138e538682afef45ee2d5a
4
+ data.tar.gz: a7df4346c51b1147ecc1060a6b7c66a37a111fd78366fc9feadeb4b889900ac8
5
5
  SHA512:
6
- metadata.gz: e0fba60554b048d68386581a7cb9a798c07257fd752f35ab8d0432d96bcddd7c4cf657818cc4cd2a0ac7257900e3d98af990ba4d190df626d6347510f926e8cc
7
- data.tar.gz: dfb8e7a813fd20f2f1a8ff61e8b532fae46db6214cdc54b959bf960efb506d2865badbafc7b5b90b9c49c3f88a3362b4b11e2ebb82a0984a1af323819d7006f1
6
+ metadata.gz: ca95d910f47ef78d95ffec0c67c7b5109c3b2d37be8e1068ed9f087c9bc77dbabd0eda7121c5d819ac9c6a94db7d09a4aeff3e147419913fc4b370447b969dd4
7
+ data.tar.gz: 3418f3612947c775531ae3a1102953d8457e6887c4d01992f19d2cf2fec0d5a5fc7303b12a1c74ad2438fda471981075a57af9a036f57fe19c6d815b5997d41f
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.gitignore ADDED
@@ -0,0 +1,50 @@
1
+ # rcov generated
2
+ coverage
3
+ coverage.data
4
+ .idea/
5
+ # rdoc generated
6
+ rdoc
7
+ .vagrant/
8
+ # yard generated
9
+ doc
10
+ .yardoc
11
+ Gemfile.lock
12
+ # bundler
13
+ .bundle
14
+ Gemfile.lock
15
+
16
+ # jeweler generated
17
+ pkg
18
+ .vagrant
19
+ # Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
20
+ #
21
+ # * Create a file at ~/.gitignore
22
+ # * Include files you want ignored
23
+ # * Run: git config --global core.excludesfile ~/.gitignore
24
+ #
25
+ # After doing this, these files will be ignored in all your git projects,
26
+ # saving you from having to 'pollute' every project you touch with them
27
+ #
28
+ # Not sure what to needs to be ignored for particular editors/OSes? Here's some ideas to get you started. (Remember, remove the leading # of the line)
29
+ #
30
+ # For MacOS:
31
+ #
32
+ #.DS_Store
33
+
34
+ # For TextMate
35
+ #*.tmproj
36
+ #tmtags
37
+
38
+ # For emacs:
39
+ #*~
40
+ #\#*
41
+ #.\#*
42
+
43
+ # For vim:
44
+ #*.swp
45
+
46
+ # For redcar:
47
+ #.redcar
48
+
49
+ # For rubinius:
50
+ #*.rbc
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/.rubocop.yml ADDED
@@ -0,0 +1,66 @@
1
+ Style/StringLiterals:
2
+ Enabled: false
3
+ AllCops:
4
+ Exclude:
5
+ - 'rubyipmi.gemspec'
6
+ SignalException:
7
+ EnforcedStyle: only_raise
8
+ Documentation:
9
+ Enabled: false
10
+ ClassAndModuleChildren:
11
+ Enabled: false
12
+ HashSyntax:
13
+ EnforcedStyle: hash_rockets
14
+ ClassCheck:
15
+ EnforcedStyle: kind_of?
16
+ SpaceInsideHashLiteralBraces:
17
+ EnforcedStyle: no_space
18
+ Style/WordArray:
19
+ Enabled: false
20
+
21
+
22
+ # TODO: fix these
23
+ Metrics/AbcSize:
24
+ Max: 60
25
+ Metrics/CyclomaticComplexity:
26
+ Max: 19
27
+ Metrics/LineLength:
28
+ Max: 149
29
+ Metrics/MethodLength:
30
+ Max: 44
31
+ Metrics/ModuleLength:
32
+ Max: 128
33
+ Metrics/PerceivedComplexity:
34
+ Max: 22
35
+ Style/SpecialGlobalVars:
36
+ Exclude:
37
+ - 'lib/rubyipmi.rb'
38
+ - 'lib/rubyipmi/commands/basecommand.rb'
39
+ - 'lib/rubyipmi/freeipmi/commands/fru.rb'
40
+ - 'lib/rubyipmi/ipmitool/commands/fru.rb'
41
+ Style/RescueModifier:
42
+ Exclude:
43
+ - 'lib/rubyipmi.rb'
44
+ Style/RegexpLiteral:
45
+ Exclude:
46
+ - 'spec/spec_helper.rb'
47
+ Style/PredicateName:
48
+ Exclude:
49
+ - 'lib/rubyipmi.rb'
50
+ Lint/RescueException:
51
+ Exclude:
52
+ - 'spec/integration/rubyipmi_spec.rb'
53
+ Style/AccessorMethodName:
54
+ Exclude:
55
+ - 'lib/rubyipmi/freeipmi/connection.rb'
56
+ - 'lib/rubyipmi/ipmitool/connection.rb'
57
+
58
+ # Fixed by deprecation
59
+ Style/MethodName:
60
+ Exclude:
61
+ - 'lib/rubyipmi/commands/mixins/power_mixin.rb'
62
+
63
+ # Don't understand
64
+ Style/FileName:
65
+ Exclude:
66
+ - 'spec/unit/freeipmi/bmc-info_spec.rb'
data/.travis.yml ADDED
@@ -0,0 +1,13 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0
5
+ - 2.1.3
6
+ - 2.2
7
+ branches:
8
+ only:
9
+ - master
10
+ - development
11
+ notifications:
12
+ email:
13
+ - corey@logicminds.biz
data/Gemfile CHANGED
@@ -3,11 +3,11 @@ source "http://rubygems.org"
3
3
  group :development do
4
4
  gem "rspec", "~> 3.1"
5
5
  gem "rdoc", "~> 3.12"
6
- gem "bundler", ">= 1.1.5"
7
- gem "jeweler", "~> 2.0.1"
6
+ gem "bundler", ">= 2.0.0"
8
7
  gem "highline"
9
8
  gem "rake"
10
- gem 'coveralls', require: false
9
+ gem 'coveralls', :require => false
11
10
  gem 'pry'
12
11
  gem 'pry-rescue'
12
+ gem "rubocop", "~> 0.33.0", :require => false
13
13
  end
data/README.md CHANGED
@@ -135,9 +135,15 @@ from the standard. In general this library should work will all servers.
135
135
  ```ruby
136
136
  require 'rubyipmi'
137
137
  conn = Rubyipmi.connect("username", "password", "hostname")
138
- conn.chassis.bootpxe(true, false) # reboot after setting, one time boot only - non persistent
139
- conn.chassis.bootdisk(false, false) # boot to disk on next reboot, don't reboot automatically
140
-
138
+ conn.chassis.bootpxe(reboot=bool, persistent=bool)
139
+ conn.chassis.bootdisk(reboot=bool, persistent=bool)
140
+
141
+ Examples:
142
+ conn.chassis.bootpxe(reboot=true, persistent=false) # reboot immediately, PXE boot once
143
+ conn.chassis.bootpxe(reboot=false, persistent=false) # on next reboot PXE boot once
144
+ conn.chassis.bootdisk(reboot=true, persistent=false) # reboot immediately, boot off disk once
145
+ conn.chassis.bootdisk(reboot=true, persistent=true) # reboot immediately, boot off disk forever
146
+ conn.chassis.bootdisk(reboot=false, persistent=true) # reboot off disk forever, starting on next reboot
141
147
  ```
142
148
 
143
149
 
data/RELEASE_NOTES.md CHANGED
@@ -1,3 +1,36 @@
1
+ ### 0.11.0
2
+ This is a big update with many minor changes and bug fixes. Thank you for all that submitted fixes.
3
+ - Removes jeweler dependency and replaces with bundler commands, updates gemspec
4
+ - Use HTTPS for homepage field in the gemspec
5
+ - Fix infinite loop when executing 'lan print' command
6
+ - The retry count counter is currently not incremented, so in the situation
7
+ when this command fails, library enters infinite loop of executing this
8
+ command, which is bad.
9
+
10
+ Adds a missing counter incrementation with the same style as
11
+ in basecommands and make it return current @info in case of a failure,
12
+ so all methods accessing it will just get return nil.
13
+
14
+ - Leverage Enumerable#each_with_object
15
+ - Add a SensorsMixin to remove duplicate code
16
+ - Enable Rubocop GuardClause and fix complaints
17
+ - Remove duplicate methods
18
+ - Fixes "NoMethodError: undefined method `success?' for nil:NilClass"
19
+ - Some ruby versions need to require 'English' otherwise $CHILD_STATUS is nil
20
+ - Fix rubocop Style/MethodName "Use snake_case for method names."
21
+ - Rename private method
22
+ - Add deprecation warnings for two public methods
23
+ - Delete unused method
24
+ - Update .rubocop.yml accordingly
25
+ - Refactor duplicated chassis power command methods
26
+ - Adds additional rubycops
27
+ - Fixes many rubycop infractions
28
+ - Remove puppet code and vagrant
29
+ - Remove if / else logic and unnecessary return in #validate_status
30
+ - Reword confusing project description
31
+ - Update README.md section on booting to specific devices
32
+ - Update documentation around bootpxe, bootdisk functions
33
+ - Remove pry statement from method
1
34
  ### 0.10.0
2
35
  * gh-26 - make the driver default to lan20
3
36
 
data/Rakefile CHANGED
@@ -1,10 +1,8 @@
1
1
  # encoding: utf-8
2
+ require 'bundler/gem_tasks'
2
3
 
3
- require 'rubygems'
4
- require 'bundler'
5
4
  @base_dir = File.dirname(__FILE__)
6
5
 
7
-
8
6
  begin
9
7
  Bundler.setup(:default, :development)
10
8
  rescue Bundler::BundlerError => e
@@ -13,29 +11,6 @@ rescue Bundler::BundlerError => e
13
11
  exit e.status_code
14
12
  end
15
13
  require 'rake'
16
-
17
- require 'jeweler'
18
- Jeweler::Tasks.new do |gem|
19
- # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
20
- gem.name = "rubyipmi"
21
- gem.homepage = "http://github.com/logicminds/rubyipmi"
22
- gem.license = "LGPLv2.1"
23
- gem.summary = %Q{A ruby wrapper for ipmi command line tools that supports ipmitool and freeipmi}
24
- gem.description = %Q{Provides a library for controlling IPMI devices using pure ruby code}
25
- gem.email = "corey@logicminds.biz"
26
- gem.authors = ["Corey Osman"]
27
- gem.files.exclude '.travis.yml'
28
- gem.files.exclude 'Gemfile.lock'
29
- gem.files.exclude '.rspec'
30
- gem.files.exclude '.gitignore'
31
- gem.files.exclude '.document'
32
- gem.files.exclude 'coverage/'
33
-
34
-
35
- # dependencies defined in Gemfile
36
- end
37
- Jeweler::RubygemsDotOrgTasks.new
38
-
39
14
  require 'rspec/core'
40
15
  require 'rspec/core/rake_task'
41
16
 
@@ -45,9 +20,8 @@ RSpec::Core::RakeTask.new(:unit) do |spec|
45
20
  end
46
21
 
47
22
  desc "Run integrations tests against real systems using a vagrant box"
48
- task :vintegration, :user, :pass, :host do |task, args|
23
+ task :vintegration, :user, :pass, :host do |_task, args|
49
24
  vars = "ipmiuser=#{args[:user]} ipmipass=#{args[:pass]} ipmihost=#{args[:host]}"
50
- ipmiprovider="freeipmi"
51
25
  puts `cd #{@base_dir}/spec && vagrant up`
52
26
  puts `cd #{@base_dir}/spec && vagrant provision`
53
27
  puts `vagrant ssh \"/rubyipmi/rake integration #{vars}\"`
@@ -58,9 +32,9 @@ RSpec::Core::RakeTask.new :integration do |spec|
58
32
  ENV['ipmiuser'] = 'admin'
59
33
  ENV['ipmipass'] = 'password'
60
34
  ENV['ipmihost'] = '10.0.1.16'
61
- providers ||= Array(ENV['ipmiprovider']) || ['freeipmi', 'ipmitool']
35
+ providers ||= Array(ENV['ipmiprovider']) || ['freeipmi', 'ipmitool']
62
36
 
63
- providers.each do | provider |
37
+ providers.each do |provider|
64
38
  ENV['ipmiprovider'] = provider
65
39
  spec.pattern = FileList['spec/integration/**/*_spec.rb']
66
40
  end
@@ -79,7 +53,7 @@ Rake::RDocTask.new do |rdoc|
79
53
  end
80
54
 
81
55
  desc "send diagnostics to logicminds for testing for the given host"
82
- task :send_diag, :user, :pass, :host do |t, args |
56
+ task :send_diag, :user, :pass, :host do |_t, args|
83
57
  require 'rubyipmi'
84
58
  require 'net/smtp'
85
59
  require 'json'
@@ -91,20 +65,19 @@ task :send_diag, :user, :pass, :host do |t, args |
91
65
  data = Rubyipmi.get_diag(args[:user], args[:pass], args[:host])
92
66
  emailto = 'corey@logicminds.biz'
93
67
  subject = "Rubyipmi diagnostics data"
94
- send_email(emailto, data.to_json, {:subject => subject})
95
-
68
+ send_email(emailto, data.to_json, :subject => subject)
96
69
  end
97
70
 
98
- def send_email(to,data, opts={})
71
+ def send_email(to, data, opts = {})
99
72
  gmail_id = ask("Enter your gmail account: ")
100
73
  pass = ask("Enter your gmail password: ") { |q| q.echo = '*' }
101
74
  opts[:from] = gmail_id
102
- opts[:server] ||= 'smtp.gmail.com'
103
- opts[:from_alias] ||= gmail_id
104
- opts[:subject] ||= @subject
105
- opts[:body] ||= data
106
- opts[:to] ||= to
107
- opts[:port] ||= 587
75
+ opts[:server] ||= 'smtp.gmail.com'
76
+ opts[:from_alias] ||= gmail_id
77
+ opts[:subject] ||= @subject
78
+ opts[:body] ||= data
79
+ opts[:to] ||= to
80
+ opts[:port] ||= 587
108
81
  msg = <<END_OF_MESSAGE
109
82
  From: #{opts[:from_alias]} <#{opts[:from]}>
110
83
  To: <#{to}>
@@ -114,9 +87,9 @@ Date: #{Time.now.rfc2822}
114
87
  #{opts[:body]}
115
88
  END_OF_MESSAGE
116
89
 
117
- smtp = Net::SMTP.new(opts[:server],opts[:port])
90
+ smtp = Net::SMTP.new(opts[:server], opts[:port])
118
91
  smtp.enable_starttls
119
- smtp.start(opts[:server],gmail_id,pass,:login) do
92
+ smtp.start(opts[:server], gmail_id, pass, :login) do
120
93
  smtp.send_message(msg, gmail_id, to)
121
94
  end
122
95
  end
@@ -3,7 +3,6 @@ require 'tempfile'
3
3
  require 'rubyipmi'
4
4
 
5
5
  module Rubyipmi
6
-
7
6
  class BaseCommand
8
7
  include Observable
9
8
  attr_reader :cmd, :max_retry_count
@@ -39,7 +38,7 @@ module Rubyipmi
39
38
 
40
39
  def locate_command(commandname)
41
40
  location = `which #{commandname}`.strip
42
- if not $?.success?
41
+ unless $?.success?
43
42
  logger.error("#{commandname} command not found, is #{commandname} installed?") if logger
44
43
  raise "#{commandname} command not found, is #{commandname} installed?"
45
44
  end
@@ -70,8 +69,7 @@ module Rubyipmi
70
69
  command = makecommand
71
70
  @lastcall = "#{command}"
72
71
  @result = `#{command} 2>&1`
73
- # sometimes the command tool does not return the correct result so we have to validate it with additional
74
- # code
72
+ # sometimes the command tool does not return the correct result, validate it with additional code
75
73
  process_status = validate_status($?)
76
74
  rescue
77
75
  if retrycount < max_retry_count
@@ -84,7 +82,7 @@ module Rubyipmi
84
82
  end
85
83
  ensure
86
84
  removepass
87
- return process_status
85
+ process_status
88
86
  end
89
87
  end
90
88
 
@@ -93,30 +91,26 @@ module Rubyipmi
93
91
  # until all the fixes are exhausted or a error not defined in the errorcodes is found
94
92
  # this must be overrided in the subclass, as there are no generic errors that fit both providers
95
93
  def find_fix(result)
96
- if result
97
- # The errorcode code hash contains the fix
98
- begin
99
- fix = ErrorCodes.search(result)
100
- @options.merge_notify!(fix)
101
- rescue
102
- Rubyipmi.logger.debug("Could not find fix for error code: \n#{result}") if logger
103
- raise "Could not find fix for error code: \n#{result}"
104
- end
94
+ return unless result
95
+ # The errorcode code hash contains the fix
96
+ begin
97
+ fix = ErrorCodes.search(result)
98
+ @options.merge_notify!(fix)
99
+ rescue
100
+ Rubyipmi.logger.debug("Could not find fix for error code: \n#{result}") if logger
101
+ raise "Could not find fix for error code: \n#{result}"
105
102
  end
106
103
  end
107
104
 
108
105
  def update(opts)
109
- @options.merge!(opts)
106
+ @options.merge!(opts)
110
107
  end
111
108
 
112
- # This method will check if the results are really valid as the exit code can be misleading and incorrect
109
+ # This method will check if the results are really valid as the exit code can be misleading and incorrect
113
110
  def validate_status(exitstatus)
114
- # override in child class if needed
115
- if ! exitstatus.success?
116
- raise "Error occurred"
117
- else
118
- return true
119
- end
111
+ raise "Error occurred" unless exitstatus.success?
112
+
113
+ true
120
114
  end
121
115
  end
122
- end
116
+ end
@@ -0,0 +1,50 @@
1
+ module Rubyipmi
2
+ module PowerMixin
3
+ # Turn the system on
4
+ def on
5
+ command("on")
6
+ end
7
+
8
+ # Turn the system off
9
+ def off
10
+ command("off")
11
+ end
12
+
13
+ # Perform a power reset on the system
14
+ def reset
15
+ command("reset")
16
+ end
17
+
18
+ # Power cycle the system
19
+ def cycle
20
+ off? ? on : command("cycle")
21
+ end
22
+
23
+ # Perform a soft shutdown, like briefly pushing the power button
24
+ def soft_shutdown
25
+ command("soft")
26
+ end
27
+
28
+ # Test to see if the power is on
29
+ def on?
30
+ status == "on"
31
+ end
32
+
33
+ # Test to see if the power is off
34
+ def off?
35
+ status == "off"
36
+ end
37
+
38
+ # DEPRECATED: Please use soft_shutdown instead.
39
+ def softShutdown
40
+ warn "[DEPRECATION] `softShutdown` is deprecated, please use `soft_shutdown` instead."
41
+ soft_shutdown
42
+ end
43
+
44
+ # DEPRECATED: Please use power_interrupt instead.
45
+ def powerInterrupt
46
+ warn "[DEPRECATION] `powerInterrupt` is deprecated, please use `power_interrupt` instead."
47
+ power_interrupt
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,54 @@
1
+ module Rubyipmi
2
+ module SensorsMixin
3
+ def refresh
4
+ @sensors = nil
5
+ list
6
+ end
7
+
8
+ def list
9
+ @sensors ||= parse(getsensors)
10
+ end
11
+
12
+ def count
13
+ list.count
14
+ end
15
+
16
+ def names
17
+ list.keys
18
+ end
19
+
20
+ # returns a hash of fan sensors where the key is fan name and value is the sensor
21
+ def fanlist(refreshdata = false)
22
+ refresh if refreshdata
23
+ list.each_with_object({}) { |(name, sensor), flist| flist[name] = sensor if name =~ /.*fan.*/ }
24
+ end
25
+
26
+ # returns a hash of sensors where each key is the name of the sensor and the value is the sensor
27
+ def templist(refreshdata = false)
28
+ refresh if refreshdata
29
+ list.each_with_object({}) do |(name, sensor), tlist|
30
+ tlist[name] = sensor if (sensor[:unit] =~ /.*degree.*/ || name =~ /.*temp.*/)
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ def method_missing(method, *_args, &_block)
37
+ if !list.key?(method.to_s)
38
+ raise NoMethodError
39
+ else
40
+ list[method.to_s]
41
+ end
42
+ end
43
+
44
+ def parse(data)
45
+ return {} if data.nil?
46
+
47
+ data.lines.each_with_object({}) do |line, sensorlist|
48
+ # skip the header
49
+ sensor = sensor_class.new(line)
50
+ sensorlist[sensor[:name]] = sensor
51
+ end
52
+ end
53
+ end
54
+ end
@@ -1,14 +1,12 @@
1
1
  require 'rubyipmi/freeipmi/errorcodes'
2
2
 
3
3
  module Rubyipmi::Freeipmi
4
-
5
4
  class BaseCommand < Rubyipmi::BaseCommand
6
-
7
5
  def setpass
8
6
  super
9
7
  @options["config-file"] = @passfile.path
10
- @passfile.write "username #{@options["username"]}\n"
11
- @passfile.write "password #{@options["password"]}\n"
8
+ @passfile.write "username #{@options['username']}\n"
9
+ @passfile.write "password #{@options['password']}\n"
12
10
  @passfile.close
13
11
  end
14
12
 
@@ -18,41 +16,36 @@ module Rubyipmi::Freeipmi
18
16
 
19
17
  def makecommand
20
18
  # need to format the options to freeipmi format
21
- args = @options.collect { |k, v|
19
+ args = @options.collect do |k, v|
22
20
  # must remove from command line as its handled via conf file
23
21
  next if k == 'password'
24
22
  next if k == 'username'
25
- if not v
23
+ if !v
26
24
  "--#{k}"
27
25
  else
28
26
  "--#{k}=#{v}"
29
27
  end
30
- }.join(" ")
31
- return "#{cmd} #{args.rstrip}"
28
+ end.join(" ")
29
+
30
+ "#{cmd} #{args.rstrip}"
32
31
  end
33
32
 
34
33
  # This method will check if the results are really valid as the exit code can be misleading and incorrect
35
34
  # this is required because freeipmi in older version always returned 0 even if an error occured
36
35
  def validate_status(exitstatus)
37
36
  case @cmdname
38
- when "ipmipower"
39
- # until ipmipower returns the correct exit status this is a hack
40
- # essentially any result greater than 23 characters is an error
41
- if @result.length > 23
42
- raise "Error occurred"
43
- end
44
- when "bmc-config"
45
- if @result.length > 100 and exitstatus.success?
46
- return true
47
- else
48
- raise "Error occurred"
49
- end
37
+ when "ipmipower"
38
+ # until ipmipower returns the correct exit status this is a hack
39
+ # essentially any result greater than 23 characters is an error
40
+ raise "Error occurred" if @result.length > 23
41
+ when "bmc-config"
42
+ if @result.length > 100 && exitstatus.success?
43
+ return true
50
44
  else
51
- if exitstatus.success?
52
- return true
53
- else
54
- raise "Error occurred"
55
- end
45
+ raise "Error occurred"
46
+ end
47
+ else
48
+ super
56
49
  end
57
50
  end
58
51
 
@@ -60,16 +53,14 @@ module Rubyipmi::Freeipmi
60
53
  # If a fix is found it is applied to the options hash, and then the last run command is retried
61
54
  # until all the fixes are exhausted or a error not defined in the errorcodes is found
62
55
  def find_fix(result)
63
- if result
64
- # The errorcode code hash contains the fix
65
- begin
66
- fix = ErrorCodes.search(result)
67
- @options.merge_notify!(fix)
68
- rescue
69
- raise "Could not find fix for error code: \n#{result}"
70
- end
56
+ return unless result
57
+ # The errorcode code hash contains the fix
58
+ begin
59
+ fix = ErrorCodes.search(result)
60
+ @options.merge_notify!(fix)
61
+ rescue
62
+ raise "Could not find fix for error code: \n#{result}"
71
63
  end
72
64
  end
73
-
74
65
  end
75
- end
66
+ end
@@ -1,8 +1,6 @@
1
1
  module Rubyipmi::Freeipmi
2
-
3
2
  class Bmc < Rubyipmi::Freeipmi::BaseCommand
4
-
5
- #attr_accessor :options
3
+ # attr_accessor :options
6
4
  attr_accessor :config
7
5
 
8
6
  def initialize(opts = ObservableHash.new)
@@ -12,7 +10,7 @@ module Rubyipmi::Freeipmi
12
10
 
13
11
  def version
14
12
  @options['version'] = false
15
- value = runcmd
13
+ runcmd
16
14
  @options.delete_notify('version')
17
15
  @result.slice(/\d\.\d.\d/)
18
16
  end
@@ -25,12 +23,12 @@ module Rubyipmi::Freeipmi
25
23
  end
26
24
  end
27
25
 
28
- def reset(type='cold')
26
+ def reset(type = 'cold')
29
27
  device.reset(type)
30
28
  end
31
29
 
32
30
  def guid
33
- information.guid
31
+ information.guid
34
32
  end
35
33
 
36
34
  def config
@@ -48,6 +46,5 @@ module Rubyipmi::Freeipmi
48
46
  def device
49
47
  @bmcdevice ||= Rubyipmi::Freeipmi::BmcDevice.new(options)
50
48
  end
51
-
52
49
  end
53
50
  end