rubyipmi 0.10.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
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