moob 0.3.15 → 0.3.16

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MTk1OTgxOTAwMDdmODUxNTYwMjIyZjE5MTAzNTI2ZDAwNDNmYjFkNA==
4
+ YWY1NjAwYTJkYzk2MjhjM2VlZWMxNzczMjFlNTNiNTZiZGY3ZmM0NA==
5
5
  data.tar.gz: !binary |-
6
- ZmYxMjlkMmVhY2QxZDRkZTYwZWVjODZhZDE5NDBlMmU0NTkwMWQwMA==
6
+ ZTk0N2I3ZGE2NDUxZDczNmIxYjM0MmM0Y2M4ODVhMWFjOGMyMzU2Mw==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZWVkZTNkZGNlOGEyNjBjOTM3ZDhkNGYxNGZmOTVkYTZmNzYwY2QwODIzYzNl
10
- MTYwYTBiYTNhMDczNWM3MDM1M2RmNGU1YjZiNWY2MDE2Mjc0ZmM3NjM4Yzli
11
- Y2FmZjI5NTVlYjlhN2ZkOWQ1MjViOGJhZTY2YTU2YzUyZWFiOTQ=
9
+ NmIzNmRkNWU1MzIzZjViZWY1NWI0MzVhM2E5YjdjZmVhNzRmYjBhZjQ4ZDgy
10
+ MmY5Nzk0NjA2NTdkNTk0NjA3MjFmMzA4MTFiNzU3YWJjNjZjMmE4ZDVkY2Ji
11
+ ZmVkZGY2N2I0NDZiZjNiNjZlMzgzODRjMTc0OWVhOWVhODYyYzk=
12
12
  data.tar.gz: !binary |-
13
- ZmRmZTViMjk5YzJjNDZmYTY2MjM5MTJkZTViNGM1MGI0Nzk4NWMyMzcwODQw
14
- OWRjODYwOTdlM2JjZTFmMzQ0NWUzNGFjNjJjMDcwNmNhNmYyMGMyZTNjMGI5
15
- ODVlOWUwOTYwOGQ5Y2Q5MjkyNDJmYjZkODQwOTFkMmY3NzNiZjQ=
13
+ ZmI5Y2ViMWNiZmY4ZWM2MDY3YjU1NWVkODMzYWQ5Yjg5YmNjNjBmZjEyMThk
14
+ ZmEwMjZhMGQ2NGY5NDJhMGNlNDE2NWIxNDk2ODY5YmYyYTQxNDk5NzAyMjcx
15
+ ZWUxMjM1ZmE0M2ZhNzE0MDAwOTZkMzgxOGE1ZjA5MDRhYTNmMGI=
@@ -2,7 +2,6 @@ require 'fileutils'
2
2
  require 'tempfile'
3
3
 
4
4
  module Moob
5
- VERSION = [0,3,15]
6
5
 
7
6
  class ResponseError < Exception
8
7
  def initialize response
@@ -13,6 +12,7 @@ module Moob
13
12
  end
14
13
  end
15
14
 
15
+ autoload :VERSION, 'moob/version.rb'
16
16
  autoload :BaseLom, 'moob/baselom.rb'
17
17
  autoload :Idrac6, 'moob/idrac6.rb'
18
18
  autoload :Idrac7, 'moob/idrac7.rb'
@@ -82,8 +82,12 @@ class Idrac7 < BaseLom
82
82
  end
83
83
 
84
84
  def logout
85
- out = @session.get 'data/logout'
86
- raise ResponseError.new out unless out.status == 200
85
+ if @skiplogout
86
+ Moob.inform 'Skipping logout...'
87
+ else
88
+ out = @session.get 'data/logout'
89
+ raise ResponseError.new out unless out.status == 200
90
+ end
87
91
  return self
88
92
  end
89
93
 
@@ -224,5 +228,11 @@ class Idrac7 < BaseLom
224
228
  return imgfile, req.headers
225
229
  end
226
230
 
231
+ action :lomreset, 'Reset LOM'
232
+ def lomreset
233
+ @skiplogout = true
234
+ drac_set_params({ 'iDracReset' => 1 })
235
+ end
236
+
227
237
  end
228
238
  end
@@ -0,0 +1,164 @@
1
+ module Moob
2
+ class Pec < BaseLom
3
+ @name = 'Dell PowerEdge C series'
4
+
5
+ INFO_FIELDS = %w[
6
+ asic certificate
7
+ chassisFLEDStatus chassisILEDStatus chassisName
8
+ biosVer fwUpdated fwVersion hostname hwVersion
9
+ ipmiKey ipmiLAN ipmiMinPriv
10
+ productDescription productName pwState
11
+ serialOverLanBaud serialOverLanEnabled serialOverLanPriv
12
+ hostname
13
+ ifName macAddr autoNeg v4Enabled v4DHCPEnabled v4IPAddr
14
+ v4NetMask v4Gateway
15
+ ]
16
+
17
+ def initialize hostname, options = {}
18
+ super hostname, options
19
+ @username ||= 'root'
20
+ @password ||= 'root'
21
+ @index = nil
22
+ end
23
+
24
+ def authenticate
25
+ @session.handle_cookies nil
26
+
27
+ login = @session.get 'login.html'
28
+
29
+ raise ResponseError.new login unless login.status == 200
30
+
31
+ auth = @session.post 'data/login', "user=#{@username}&password=#{@password}"
32
+
33
+ raise ResponseError.new auth unless auth.status == 200
34
+
35
+ auth.body =~ /<authResult>([^<]+)<\/authResult>/
36
+
37
+ raise 'Cannot find auth result' unless $&
38
+ raise "Auth failed with: \"#{auth.body}\"" unless $1 == "0"
39
+
40
+ auth.body =~ /<forwardUrl>([^<]+)<\/forwardUrl>/
41
+
42
+ raise 'Cannot find the authenticated index url after auth' unless $&
43
+
44
+ @indexurl = $1
45
+
46
+
47
+ Moob.inform "Requesting indexurl of #{@indexurl}"
48
+ @authhash = @indexurl.split('?')[1]
49
+
50
+ @index = @session.get @indexurl
51
+
52
+ # someone decided it was a good idea to include a ST2 token in every XHR
53
+ # request. We need it for a lot of our features.
54
+ @index.body =~ /var CSRF_TOKEN_2_VALUE = "([0-9a-f]+)";/
55
+ raise ResponseError.new @index unless @index.status == 200
56
+ @st2 = $1
57
+
58
+ @session.headers['ST2'] = @st2
59
+
60
+ return self
61
+ end
62
+
63
+ def logout
64
+ out = @session.get 'data/logout'
65
+ raise ResponseError.new out unless out.status == 200
66
+ return self
67
+ end
68
+
69
+ def detect
70
+ begin
71
+ home = @session.get 'login.html'
72
+ home.body =~ /Dell Remote Management Controller/
73
+ rescue
74
+ false
75
+ end
76
+ end
77
+
78
+ action :jnlp, 'Remote control'
79
+
80
+ def jnlp
81
+ # On PEC LOM CSRF_TOKEN_1 carries the auth token
82
+ @index.body =~ /var CSRF_TOKEN_1\s+= \"ST1\" \+ \"=\" \+ "([0-9a-f]+)";/
83
+ @st1 = $1
84
+
85
+ viewer = @session.get "viewer.jnlp(#{@hostname}@0@#{Time.now.to_i * 1000})?ST1=#{@st1}"
86
+ raise ResponseError.new viewer unless viewer.status == 200
87
+
88
+ return viewer.body
89
+ end
90
+
91
+ def power_control action
92
+ req = @session.post "data?set=pwState:#{action}", {}
93
+ raise ResponseError.new req unless req.status == 200
94
+ return nil
95
+ end
96
+
97
+ [
98
+ [0, :poff, 'Power Off System'],
99
+ [1, :pon, 'Power On System'],
100
+ [2, :pcycle, 'Power Cycle System (cold boot)'],
101
+ [3, :preset, 'Reset System (warm boot)'],
102
+ [4, :nmi, 'NMI (Non-Masking Interrupt)'],
103
+ [5, :shutdown, 'Graceful Shutdown']
104
+ ].each do |code, name, desc|
105
+ action name, desc
106
+ class_eval %{def #{name}; power_control #{code}; end}
107
+ end
108
+
109
+
110
+ action :pstatus, 'Power status'
111
+ def pstatus
112
+ case get_infos(['pwState'])['pwState']
113
+ when '0'
114
+ return :off
115
+ when '1'
116
+ return :on
117
+ else
118
+ return nil
119
+ end
120
+ end
121
+
122
+ action :infos, 'Get system information'
123
+ def infos
124
+ return JSON.pretty_generate get_infos INFO_FIELDS
125
+ end
126
+
127
+ def get_infos keys
128
+ infos = @session.post "data?get=#{keys.join(',')}", {}
129
+
130
+ raise ResponseError.new infos unless infos.status == 200
131
+ raise "The status isn't OK" unless infos.body =~ /<status>ok<\/status>/
132
+
133
+ return Hash[keys.collect do |k|
134
+ if infos.body =~ /<#{k}>(.*?)<\/#{k}>/
135
+ [k, $1]
136
+ else
137
+ [k, nil]
138
+ end
139
+ end]
140
+ end
141
+
142
+ action :set_params, 'Set LOM parameters'
143
+ def set_params
144
+ unless @params
145
+ raise "Params are not set!"
146
+ end
147
+ drac_set_params @params
148
+ end
149
+
150
+ action :enable_ipmi, 'Enable IPMI over LAN (on LOM port)'
151
+ def enable_ipmi
152
+ drac_set_params({ 'ipmiLAN' => 1 })
153
+ end
154
+
155
+ def drac_set_params params
156
+ params.each do |p,v|
157
+ req = @session.post "data?set=#{p}:#{v}", {}
158
+ raise ResponseError.new req unless req.status == 200
159
+ end
160
+ return nil
161
+ end
162
+
163
+ end
164
+ end
@@ -67,5 +67,13 @@ class Supermicro < BaseLom
67
67
  end
68
68
  end
69
69
 
70
+ action :jnlp, 'Remote control'
71
+ def jnlp
72
+ viewer = @session.get 'cgi/url_redirect.cgi?url_name=&url_type=jwsk'
73
+ raise ResponseError.new viewer unless viewer.status == 200
74
+
75
+ return viewer.body
76
+ end
77
+
70
78
  end
71
79
  end
@@ -0,0 +1,3 @@
1
+ module Moob
2
+ VERSION = [0,3,16]
3
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: moob
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.15
4
+ version: 0.3.16
5
5
  platform: ruby
6
6
  authors:
7
- - Pierre Carrier
7
+ - Nathan Ferch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-08 00:00:00.000000000 Z
11
+ date: 2014-09-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: patron
@@ -40,7 +40,7 @@ dependencies:
40
40
  version: 1.5.3
41
41
  description: Control systems using Web-based out-of-band managers without a browser
42
42
  email:
43
- - pierre@spotify.com
43
+ - nf@spotify.com
44
44
  executables:
45
45
  - moob
46
46
  extensions: []
@@ -54,8 +54,10 @@ files:
54
54
  - lib/moob/idrac6.rb
55
55
  - lib/moob/idrac7.rb
56
56
  - lib/moob/megatrends.rb
57
+ - lib/moob/pec.rb
57
58
  - lib/moob/sunilom.rb
58
59
  - lib/moob/supermicro.rb
60
+ - lib/moob/version.rb
59
61
  homepage: https://github.com/spotify/moob
60
62
  licenses:
61
63
  - ISC