moob 0.3.12 → 0.3.15

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MTk1OTgxOTAwMDdmODUxNTYwMjIyZjE5MTAzNTI2ZDAwNDNmYjFkNA==
5
+ data.tar.gz: !binary |-
6
+ ZmYxMjlkMmVhY2QxZDRkZTYwZWVjODZhZDE5NDBlMmU0NTkwMWQwMA==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ ZWVkZTNkZGNlOGEyNjBjOTM3ZDhkNGYxNGZmOTVkYTZmNzYwY2QwODIzYzNl
10
+ MTYwYTBiYTNhMDczNWM3MDM1M2RmNGU1YjZiNWY2MDE2Mjc0ZmM3NjM4Yzli
11
+ Y2FmZjI5NTVlYjlhN2ZkOWQ1MjViOGJhZTY2YTU2YzUyZWFiOTQ=
12
+ data.tar.gz: !binary |-
13
+ ZmRmZTViMjk5YzJjNDZmYTY2MjM5MTJkZTViNGM1MGI0Nzk4NWMyMzcwODQw
14
+ OWRjODYwOTdlM2JjZTFmMzQ0NWUzNGFjNjJjMDcwNmNhNmYyMGMyZTNjMGI5
15
+ ODVlOWUwOTYwOGQ5Y2Q5MjkyNDJmYjZkODQwOTFkMmY3NzNiZjQ=
@@ -1,7 +1,8 @@
1
1
  require 'fileutils'
2
+ require 'tempfile'
2
3
 
3
4
  module Moob
4
- VERSION = [0,3,12]
5
+ VERSION = [0,3,15]
5
6
 
6
7
  class ResponseError < Exception
7
8
  def initialize response
@@ -18,16 +19,18 @@ module Moob
18
19
  autoload :Megatrends, 'moob/megatrends.rb'
19
20
  autoload :SunILom, 'moob/sunilom.rb'
20
21
  autoload :IbmEServer, 'moob/ibmeserver.rb'
22
+ autoload :Supermicro, 'moob/supermicro.rb'
21
23
 
22
24
  TYPES = {
23
25
  :idrac6 => Idrac6,
24
26
  :idrac7 => Idrac7,
25
27
  :megatrends => Megatrends,
26
28
  :sun => SunILom,
27
- :ibm => IbmEServer
29
+ :ibm => IbmEServer,
30
+ :supermicro => Supermicro
28
31
  }
29
32
 
30
- AUTODETECT_ORDER = [ :idrac7, :idrac6, :megatrends, :sun, :ibm ]
33
+ AUTODETECT_ORDER = [ :idrac7, :idrac6, :supermicro, :megatrends, :sun, :ibm ]
31
34
 
32
35
  def self.lom type, hostname, options = {}
33
36
  case type
@@ -55,12 +58,11 @@ module Moob
55
58
  raise "Invalid JNLP file (\"#{jnlp}\")"
56
59
  end
57
60
 
58
- filepath = "/tmp/#{lom.hostname}_#{Time.now.to_i}.jnlp"
59
- File.open filepath, 'w' do |f|
60
- f.write jnlp
61
- end
61
+ tmpfile = Tempfile.new("#{lom.hostname}_#{Time.now.to_i}.jnlp")
62
+ tmpfile.write jnlp
63
+ tmpfile.close
62
64
 
63
- raise 'javaws failed' unless system "javaws -wait #{filepath}"
65
+ raise 'javaws failed' unless system "javaws -wait #{tmpfile.path}"
64
66
  end
65
67
 
66
68
  def self.show_console_preview lom
@@ -1,4 +1,5 @@
1
1
  module Moob
2
+
2
3
  class Idrac7 < BaseLom
3
4
  @name = 'Dell iDrac 7'
4
5
 
@@ -29,6 +30,8 @@ class Idrac7 < BaseLom
29
30
 
30
31
  def authenticate
31
32
  @session.handle_cookies nil
33
+ # Needed for new version of iDrac emb web server to even responde
34
+ @session.headers['Accept-Language'] = 'en-US,en;q=0.8,sv;q=0.6'
32
35
 
33
36
  login = @session.get 'login.html'
34
37
 
@@ -57,16 +60,22 @@ class Idrac7 < BaseLom
57
60
  end
58
61
 
59
62
  Moob.inform "Requesting indexurl of #{@indexurl}"
60
- @authhash = @indexurl.split('?')[1]
61
-
62
- @index = @session.get @indexurl
63
63
 
64
64
  # someone decided it was a good idea to include a ST2 token in every XHR
65
65
  # request. We need it for a lot of our features.
66
- @index.body =~ /var TOKEN_VALUE = "([0-9a-f]+)";/
67
- raise ResponseError.new @index unless @index.status == 200
66
+ @authhash = @indexurl.split('?')[1]
67
+ @authhash =~ /ST2=([0-9a-f]+)/
68
68
  @st2 = $1
69
69
 
70
+ if @st2.nil?
71
+ Moob.inform 'Trying to parse ST2 token from HTML page'
72
+
73
+ @index = @session.get @indexurl
74
+ @index.body =~ /var TOKEN_VALUE = "([0-9a-f]+)";/
75
+ raise ResponseError.new @index unless @index.status == 200
76
+ @st2 = $1
77
+ end
78
+
70
79
  @session.headers['ST2'] = @st2
71
80
 
72
81
  return self
@@ -81,7 +90,7 @@ class Idrac7 < BaseLom
81
90
  def detect
82
91
  begin
83
92
  home = @session.get 'login.html'
84
- home.body =~ /Integrated Dell Remote Access Controller 7/
93
+ home.body =~ /(Integrated Dell Remote Access Controller 7)|(iDRAC7)/
85
94
  rescue
86
95
  false
87
96
  end
@@ -90,16 +99,11 @@ class Idrac7 < BaseLom
90
99
  action :jnlp, 'Remote control'
91
100
 
92
101
  def jnlp
93
- @index.body =~ /var tmpHN += +"([^"]+)"/
94
- raise "Couldn't find the DNS name" unless $&
95
- dns_name = $1
96
-
97
- @index.body =~ /var sysNameStr += +"([^"]+)"/
98
- raise "Couldn't find the system name" unless $&
99
- sys_name = $1 # eg PowerEdge R610
102
+ # Request system name and hostname from data end-point
103
+ req = get_infos ['sysDesc' ,'hostname']
100
104
 
101
105
  # eg escaped "idrac-A1BCD2E, PowerEdge R610, User:root"
102
- title = CGI::escape "#{dns_name}, #{sys_name}, User:#{@username}"
106
+ title = CGI::escape "#{req['hostname']}, #{req['sysDesc']}, User:#{@username}"
103
107
 
104
108
  viewer = @session.get "viewer.jnlp(#{@hostname}@0@#{title}@#{Time.now.to_i * 1000}@#{@authhash})"
105
109
  raise ResponseError.new viewer unless viewer.status == 200
@@ -166,6 +170,7 @@ class Idrac7 < BaseLom
166
170
  end
167
171
 
168
172
  def get_infos keys
173
+ Moob.inform "Requesting data?get=#{keys.join(',')}"
169
174
  infos = @session.post "data?get=#{keys.join(',')}", {}
170
175
 
171
176
  raise ResponseError.new infos unless infos.status == 200
@@ -0,0 +1,71 @@
1
+ module Moob
2
+ class Supermicro < BaseLom
3
+ @name = 'Supermicro'
4
+
5
+ def initialize hostname, options = {}
6
+ super hostname, options
7
+ @username ||= 'ADMIN'
8
+ @password ||= 'ADMIN'
9
+ begin
10
+ @ip = Socket.getaddrinfo(hostname, nil)[0][3]
11
+ rescue
12
+ raise "Couldn't resolve \"#{hostname}\""
13
+ end
14
+ @session.base_url = "#{@transport}://#{@ip}/"
15
+ end
16
+
17
+ def authenticate
18
+ @session.handle_cookies nil
19
+ auth = @session.post 'cgi/login.cgi',
20
+ "name=#{@username}&pwd=#{@password}"
21
+
22
+ raise ResponseError.new auth unless auth.status == 200
23
+ return self
24
+ end
25
+
26
+ def detect
27
+ begin
28
+ home = @session.get '/'
29
+ home.body =~ /META NAME=\"ATEN International Co Ltd\.\"/
30
+ rescue
31
+ false
32
+ end
33
+ end
34
+
35
+ def power_action action
36
+ time_s = Time.now.strftime("%a %b %d %Y %H:%M:%S")
37
+ req = @session.get "cgi/ipmi.cgi?POWER_INFO.XML=" + CGI::escape(action) + "&time_stamp=" + CGI::escape(time_s)
38
+ raise ResponseError.new req unless req.status == 200
39
+ unless req.body =~ /POWER_INFO/
40
+ raise 'The answer looks wrong'
41
+ end
42
+ return nil
43
+ end
44
+
45
+ action :poff, 'Power Off'
46
+ action :pon, 'Power On'
47
+ action :pcycle, 'Power Cycle'
48
+ action :preset, 'Power Reset'
49
+ action :shutdown, 'Soft Power Off'
50
+ def poff; power_action "(1,0)"; end
51
+ def pon; power_action "(1,1)"; end
52
+ def pcycle; power_action "(1,2)"; end
53
+ def preset; power_action "(1,3)"; end
54
+ def shutdown; power_action "(1,5)"; end
55
+
56
+ action :pstatus, 'Power status'
57
+ def pstatus
58
+ time_s = Time.now.strftime("%a %b %d %Y %H:%M:%S")
59
+ status = @session.get "cgi/ipmi.cgi?POWER_INFO.XML=(0%2C0)&time_stamp=" + CGI::escape(time_s)
60
+ raise ResponseError.new status unless status.status == 200
61
+ raise 'Couldn\'t read the state' unless status.body =~ /POWER STATUS=\"([A-Z]+)\"/
62
+ case $1
63
+ when 'OFF'
64
+ return :off
65
+ when 'ON'
66
+ return :on
67
+ end
68
+ end
69
+
70
+ end
71
+ end
metadata CHANGED
@@ -1,38 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: moob
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.12
5
- prerelease:
4
+ version: 0.3.15
6
5
  platform: ruby
7
6
  authors:
8
7
  - Pierre Carrier
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-05-23 00:00:00.000000000 Z
11
+ date: 2014-03-08 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: patron
16
- requirement: &70189391905360 !ruby/object:Gem::Requirement
17
- none: false
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
21
19
  version: 0.4.14
22
20
  type: :runtime
23
21
  prerelease: false
24
- version_requirements: *70189391905360
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 0.4.14
25
27
  - !ruby/object:Gem::Dependency
26
28
  name: json
27
- requirement: &70189391904800 !ruby/object:Gem::Requirement
28
- none: false
29
+ requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
31
  - - ~>
31
32
  - !ruby/object:Gem::Version
32
33
  version: 1.5.3
33
34
  type: :runtime
34
35
  prerelease: false
35
- version_requirements: *70189391904800
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 1.5.3
36
41
  description: Control systems using Web-based out-of-band managers without a browser
37
42
  email:
38
43
  - pierre@spotify.com
@@ -41,38 +46,38 @@ executables:
41
46
  extensions: []
42
47
  extra_rdoc_files: []
43
48
  files:
49
+ - COPYING
44
50
  - bin/moob
51
+ - lib/moob.rb
45
52
  - lib/moob/baselom.rb
46
53
  - lib/moob/ibmeserver.rb
47
54
  - lib/moob/idrac6.rb
48
55
  - lib/moob/idrac7.rb
49
56
  - lib/moob/megatrends.rb
50
57
  - lib/moob/sunilom.rb
51
- - lib/moob.rb
52
- - COPYING
58
+ - lib/moob/supermicro.rb
53
59
  homepage: https://github.com/spotify/moob
54
60
  licenses:
55
61
  - ISC
62
+ metadata: {}
56
63
  post_install_message:
57
64
  rdoc_options: []
58
65
  require_paths:
59
66
  - lib
60
67
  required_ruby_version: !ruby/object:Gem::Requirement
61
- none: false
62
68
  requirements:
63
69
  - - ! '>='
64
70
  - !ruby/object:Gem::Version
65
71
  version: '0'
66
72
  required_rubygems_version: !ruby/object:Gem::Requirement
67
- none: false
68
73
  requirements:
69
74
  - - ! '>='
70
75
  - !ruby/object:Gem::Version
71
76
  version: 1.2.0
72
77
  requirements: []
73
78
  rubyforge_project: moob
74
- rubygems_version: 1.8.11
79
+ rubygems_version: 2.2.2
75
80
  signing_key:
76
- specification_version: 3
81
+ specification_version: 4
77
82
  summary: Manage Out-Of-Band!
78
83
  test_files: []