class IDRAC::Client
def authenticated_request(method, path, options = {})
def authenticated_request(method, path, options = {}) login unless @session_id options[:headers] ||= {} options[:headers]['Cookie'] = "sessionid=#{@session_id}" response = connection.send(method, path, options[:params]) do |req| req.headers.merge!(options[:headers]) req.body = options[:body] if options[:body] end response end
def base_url
def base_url protocol = use_ssl ? 'https' : 'http' "#{protocol}://#{host}:#{port}" end
def connection
def connection @connection ||= Faraday.new(url: base_url, ssl: { verify: verify_ssl }) do |faraday| faraday.request :multipart faraday.request :url_encoded faraday.adapter Faraday.default_adapter end end
def get(path:, headers: {})
def get(path:, headers: {}) response = HTTParty.get( "#{base_url}/#{path}", headers: { "User-Agent" => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36", "Accept-Encoding" => "deflate, gzip", "Cookie" => @cookies }.merge(headers), verify: false ) end
def initialize(host:, username:, password:, port: 443, use_ssl: true, verify_ssl: true)
def initialize(host:, username:, password:, port: 443, use_ssl: true, verify_ssl: true) @host = host @username = username @password = password @port = port @use_ssl = use_ssl @verify_ssl = verify_ssl @session_id = nil @cookies = nil end
def login
def login response = connection.post('/data/login') do |req| req.headers['Content-Type'] = 'application/x-www-form-urlencoded' req.body = "user=#{username}&password=#{password}" end if response.status == 200 # Extract session ID from response doc = Nokogiri::HTML(response.body) @session_id = doc.at_css('script:contains("_this.SID")').text.match(/_this\.SID\s*=\s*"([^"]+)"/)[1] rescue nil # Store cookies for screenshot functionality @cookies = response.headers['set-cookie'] # Extract forward URL for screenshot functionality xml_doc = Nokogiri::XML(response.body) error_message = xml_doc.at_xpath('//errorMsg')&.text if error_message && !error_message.empty? raise Error, "Error Message: #{error_message}" end forward_url = xml_doc.xpath('//forwardUrl').text return forward_url else raise Error, "Login failed with status #{response.status}: #{response.body}" end end
def logout
def logout return unless @session_id response = connection.get('/data/logout') do |req| req.headers['Cookie'] = "sessionid=#{@session_id}" end @session_id = nil @cookies = nil response.status == 200 end
def screenshot
def screenshot # Create a Screenshot instance and capture a screenshot screenshot_instance = Screenshot.new(self) screenshot_instance.capture end