moob 0.3.8 → 0.3.11

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/bin/moob CHANGED
@@ -45,6 +45,12 @@ OptionParser.new do |opts|
45
45
  end
46
46
  end
47
47
 
48
+ opts.on '-r', '--params foo=bar,dead=beef', Array,
49
+ 'Comma-separated list of parameter/value pairs to use with set_params action' do |a|
50
+ options[:params]=a.inject({}) { |r, i| s=i.split('='); r[s[0]]=s[1]; r}
51
+ end
52
+
53
+
48
54
  opts.on '-u', '--username u',
49
55
  'LOM username',
50
56
  'Defaults to the model\'s default if known' do |u|
@@ -70,6 +76,12 @@ OptionParser.new do |opts|
70
76
  opts.on '-v', '--verbose' do
71
77
  $VERBOSE = true
72
78
  end
79
+
80
+ opts.on '-V', '--version',
81
+ 'Prints version string and exits' do
82
+ puts "moob #{Moob::VERSION.join('.')}"
83
+ exit 0
84
+ end
73
85
  end.parse!
74
86
 
75
87
  if options[:machines].empty?
@@ -96,7 +108,13 @@ begin
96
108
  case action
97
109
  when :jnlp
98
110
  Moob.start_jnlp lom
111
+ when :show_console_preview
112
+ Moob.show_console_preview lom
113
+ when :save_console_preview
114
+ savefile=Moob.save_console_preview lom
115
+ $stderr.puts "Console preview saved as #{savefile}"
99
116
  else
117
+
100
118
  res = lom.send action
101
119
  puts res if res
102
120
  end
@@ -1,5 +1,7 @@
1
+ require 'fileutils'
2
+
1
3
  module Moob
2
- VERSION = [0,3,8]
4
+ VERSION = [0,3,11]
3
5
 
4
6
  class ResponseError < Exception
5
7
  def initialize response
@@ -25,12 +27,14 @@ module Moob
25
27
  :ibm => IbmEServer
26
28
  }
27
29
 
30
+ AUTODETECT_ORDER = [ :idrac7, :idrac6, :megatrends, :sun, :ibm ]
31
+
28
32
  def self.lom type, hostname, options = {}
29
33
  case type
30
34
  when :auto
31
- TYPES.find do |sym, klass|
35
+ AUTODETECT_ORDER.each do |sym|
32
36
  Moob.inform "Trying type #{sym}..."
33
- lom = klass.new hostname, options
37
+ lom = TYPES[sym].new hostname, options
34
38
  if lom.detect
35
39
  Moob.inform "Type #{sym} detected."
36
40
  return lom
@@ -59,6 +63,29 @@ module Moob
59
63
  raise 'javaws failed' unless system "javaws -wait #{filepath}"
60
64
  end
61
65
 
66
+ def self.show_console_preview lom
67
+ imgfile, headers = lom.fetch_console_preview
68
+
69
+ if RUBY_PLATFORM =~ /darwin/
70
+ raise 'open failed' unless system "open #{imgfile.path}"
71
+ else
72
+ raise 'see failed' unless system "see #{imgfile.path}"
73
+ end
74
+ end
75
+
76
+ def self.save_console_preview lom
77
+ imgfile, headers = lom.fetch_console_preview
78
+
79
+ timestamp=Time.parse(headers['Last-modified'])
80
+ fileext=headers['Content-type'].split('/')[1]
81
+
82
+ filename="#{lom.hostname}-#{timestamp.utc.iso8601(0)}.#{fileext}"
83
+
84
+ FileUtils.cp(imgfile, filename)
85
+
86
+ return filename
87
+ end
88
+
62
89
  def self.inform msg
63
90
  $stderr.puts "\033[36m#{msg}\033[0m" if $VERBOSE
64
91
  end
@@ -12,6 +12,7 @@ class Moob::BaseLom
12
12
  @transport = options[:transport] or 'https'
13
13
  @username = options[:username]
14
14
  @password = options[:password]
15
+ @params = options[:params]
15
16
 
16
17
  @session = Patron::Session.new
17
18
  @session.headers['User-Agent'] = 'Mozilla/5.0 (Macintosh; '\
@@ -1,3 +1,6 @@
1
+ require 'tempfile'
2
+ require 'time'
3
+
1
4
  module Moob
2
5
  class Idrac6 < BaseLom
3
6
  @name = 'Dell iDrac 6'
@@ -17,7 +20,7 @@ class Idrac6 < BaseLom
17
20
  v6DHCPEnabled v6DHCPServers v6DNS1 v6DNS2
18
21
  v6SiteLocal v6SiteLocal3 v6SiteLocal4 v6SiteLocal5 v6SiteLocal6 v6SiteLocal7 v6SiteLocal8
19
22
  v6SiteLocal9 v6SiteLocal10 v6SiteLocal11 v6SiteLocal12 v6SiteLocal13 v6SiteLocal14 v6SiteLocal15
20
- ipmiLAN ipmiMinPriv
23
+ ipmiLAN ipmiMinPriv hostname
21
24
  ]
22
25
 
23
26
  def initialize hostname, options = {}
@@ -151,12 +154,44 @@ class Idrac6 < BaseLom
151
154
  end]
152
155
  end
153
156
 
157
+ action :set_params, 'Set iDRAC parameters'
158
+ def set_params
159
+ unless @params
160
+ raise "Params are not set!"
161
+ end
162
+ drac_set_params @params
163
+ end
164
+
154
165
  action :enable_ipmi, 'Enable IPMI over LAN (on LOM port)'
155
166
  def enable_ipmi
156
- req = @session.post 'data?set=ipmiLAN:1', {}
157
- raise ResponseError.new req unless req.status == 200
167
+ drac_set_params({ 'ipmiLAN' => 1 })
168
+ end
169
+
170
+ def drac_set_params params
171
+ params.each do |p,v|
172
+ req = @session.post "data?set=#{p}:#{v}", {}
173
+ raise ResponseError.new req unless req.status == 200
174
+ end
158
175
  return nil
159
176
  end
160
177
 
178
+ action :show_console_preview, 'Display iDRAC console screenshot'
179
+ action :save_console_preview, 'Save iDRAC console screenshot'
180
+
181
+ def fetch_console_preview
182
+ imgfile = Tempfile.new('console_preview')
183
+
184
+ refreshreq = @session.get "data?get=consolepreview[auto%20#{Time.now.utc.to_i}]", {}
185
+
186
+ raise ResponseError.new req unless refreshreq.status == 200
187
+
188
+ req = @session.get_file "capconsole/scapture0.png?#{Time.now.utc.to_i}", imgfile.path
189
+
190
+ raise ResponseError.new req unless req.status == 200
191
+ raise UnexpectedContentError.new req unless req.headers['Content-type'] =~ /image\//
192
+
193
+ return imgfile, req.headers
194
+ end
195
+
161
196
  end
162
197
  end
@@ -17,7 +17,7 @@ class Idrac7 < BaseLom
17
17
  v6DHCPEnabled v6DHCPServers v6DNS1 v6DNS2
18
18
  v6SiteLocal v6SiteLocal3 v6SiteLocal4 v6SiteLocal5 v6SiteLocal6 v6SiteLocal7 v6SiteLocal8
19
19
  v6SiteLocal9 v6SiteLocal10 v6SiteLocal11 v6SiteLocal12 v6SiteLocal13 v6SiteLocal14 v6SiteLocal15
20
- ipmiLAN ipmiMinPriv ipmiKey
20
+ ipmiLAN ipmiMinPriv ipmiKey hostname
21
21
  ]
22
22
 
23
23
  def initialize hostname, options = {}
@@ -180,12 +180,44 @@ class Idrac7 < BaseLom
180
180
  end]
181
181
  end
182
182
 
183
+ action :set_params, 'Set iDRAC parameters'
184
+ def set_params
185
+ unless @params
186
+ raise "Params are not set!"
187
+ end
188
+ drac_set_params @params
189
+ end
190
+
183
191
  action :enable_ipmi, 'Enable IPMI over LAN (on LOM port)'
184
192
  def enable_ipmi
185
- req = @session.post 'data?set=ipmiLAN:1', {}
186
- raise ResponseError.new req unless req.status == 200
193
+ drac_set_params({ 'ipmiLAN' => 1 })
194
+ end
195
+
196
+ def drac_set_params params
197
+ params.each do |p,v|
198
+ req = @session.post "data?set=#{p}:#{v}", {}
199
+ raise ResponseError.new req unless req.status == 200
200
+ end
187
201
  return nil
188
202
  end
189
203
 
204
+ action :show_console_preview, 'Display iDRAC console screenshot'
205
+ action :save_console_preview, 'Save iDRAC console screenshot'
206
+
207
+ def fetch_console_preview
208
+ imgfile = Tempfile.new('console_preview')
209
+
210
+ refreshreq = @session.get "data?get=consolepreview[auto%20#{Time.now.utc.to_i}]", {}
211
+
212
+ raise ResponseError.new req unless refreshreq.status == 200
213
+
214
+ req = @session.get_file "capconsole/scapture0.png?#{Time.now.utc.to_i}", imgfile.path
215
+
216
+ raise ResponseError.new req unless req.status == 200
217
+ raise UnexpectedContentError.new req unless req.headers['Content-type'] =~ /image\//
218
+
219
+ return imgfile, req.headers
220
+ end
221
+
190
222
  end
191
223
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: moob
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.8
4
+ version: 0.3.11
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-28 00:00:00.000000000 Z
12
+ date: 2013-05-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: patron
16
- requirement: &70258431369160 !ruby/object:Gem::Requirement
16
+ requirement: &70155657258840 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.4.14
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70258431369160
24
+ version_requirements: *70155657258840
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: json
27
- requirement: &70258431368680 !ruby/object:Gem::Requirement
27
+ requirement: &70155657258380 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: 1.5.3
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70258431368680
35
+ version_requirements: *70155657258380
36
36
  description: Control systems using Web-based out-of-band managers without a browser
37
37
  email:
38
38
  - pierre@spotify.com