class Moob::Pec

Constants

INFO_FIELDS

Public Class Methods

new(hostname, options = {}) click to toggle source
Calls superclass method Moob::BaseLom::new
# File lib/moob/pec.rb, line 17
def initialize hostname, options = {}
  super hostname, options
  @username ||= 'root'
  @password ||= 'root'
  @index = nil
end

Public Instance Methods

authenticate() click to toggle source
# File lib/moob/pec.rb, line 24
def authenticate
  @session.handle_cookies nil

  login = @session.get 'login.html'

  raise ResponseError.new login unless login.status == 200

  auth = @session.post 'data/login', "user=#{@username}&password=#{@password}"

  raise ResponseError.new auth unless auth.status == 200

  auth.body =~ /<authResult>([^<]+)<\/authResult>/

  raise 'Cannot find auth result' unless $&
  raise "Auth failed with: \"#{auth.body}\"" unless $1 == "0"

  auth.body =~ /<forwardUrl>([^<]+)<\/forwardUrl>/

  raise 'Cannot find the authenticated index url after auth' unless $&

  @indexurl = $1


  Moob.inform "Requesting indexurl of #{@indexurl}"
  @authhash = @indexurl.split('?')[1]

  @index = @session.get @indexurl

  # someone decided it was a good idea to include a ST2 token in every XHR
  # request. We need it for a lot of our features.
  @index.body =~ /var CSRF_TOKEN_2_VALUE = "([0-9a-f]+)";/
  raise ResponseError.new @index unless @index.status == 200
  @st2 = $1

  @session.headers['ST2'] = @st2

  return self
end
detect() click to toggle source
# File lib/moob/pec.rb, line 69
def detect
  begin
    home = @session.get 'login.html'
    home.body =~ /Dell Remote Management Controller/
  rescue
    false
  end
end
drac_set_params(params) click to toggle source
# File lib/moob/pec.rb, line 155
def drac_set_params params
  params.each do |p,v|
    req = @session.post "data?set=#{p}:#{v}", {}
    raise ResponseError.new req unless req.status == 200
  end
  return nil
end
enable_ipmi() click to toggle source
# File lib/moob/pec.rb, line 151
def enable_ipmi
  drac_set_params({ 'ipmiLAN' => 1 })
end
get_infos(keys) click to toggle source
# File lib/moob/pec.rb, line 127
def get_infos keys
  infos = @session.post "data?get=#{keys.join(',')}", {}

  raise ResponseError.new infos unless infos.status == 200
  raise "The status isn't OK" unless infos.body =~ /<status>ok<\/status>/

  return Hash[keys.collect do |k|
    if infos.body =~ /<#{k}>(.*?)<\/#{k}>/
      [k, $1]
    else
      [k, nil]
    end
  end]
end
infos() click to toggle source
# File lib/moob/pec.rb, line 123
def infos
  return JSON.pretty_generate get_infos INFO_FIELDS
end
jnlp() click to toggle source
# File lib/moob/pec.rb, line 80
def jnlp
  # On PEC LOM CSRF_TOKEN_1 carries the auth token
  @index.body =~ /var CSRF_TOKEN_1\s+= \"ST1\" \+ \"=\" \+ "([0-9a-f]+)";/
  @st1 = $1

  viewer = @session.get "viewer.jnlp(#{@hostname}@0@#{Time.now.to_i * 1000})?ST1=#{@st1}"
  raise ResponseError.new viewer unless viewer.status == 200

  return viewer.body
end
logout() click to toggle source
# File lib/moob/pec.rb, line 63
def logout
  out = @session.get 'data/logout'
  raise ResponseError.new out unless out.status == 200
  return self
end
power_control(action) click to toggle source
# File lib/moob/pec.rb, line 91
def power_control action
  req = @session.post "data?set=pwState:#{action}", {}
  raise ResponseError.new req unless req.status == 200
  return nil
end
pstatus() click to toggle source
# File lib/moob/pec.rb, line 111
def pstatus
  case get_infos(['pwState'])['pwState']
  when '0'
    return :off
  when '1'
    return :on
  else
    return nil
  end
end
set_params() click to toggle source
# File lib/moob/pec.rb, line 143
def set_params
  unless @params
    raise "Params are not set!"
  end
  drac_set_params @params
end