ManageIQ/dbus_api_service

View on GitHub
lib/dbus_api_service.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
require "sinatra/base"
require "dbus"
require "json"

class DBusApiService < Sinatra::Base
  DEFAULT_USER_ATTRIBUTES = %w(mail givenname sn displayname domainname).freeze

  get "/api/user_attrs/:userid", :provides => 'json' do
    attrs_needed = params[:attributes].nil? ? DEFAULT_USER_ATTRIBUTES : params[:attributes].split(',')

    begin
      ifp_interface = dbus_ifp_interface
      user_attrs = ifp_interface.GetUserAttr(params[:userid], attrs_needed).first
      result = attrs_needed.each_with_object({}) { |attr, hash| hash[attr] = Array(user_attrs[attr]).first }
      body normal_response(result)
    rescue => err
      status 400
      body error_response("Unable to get attributes for user #{params[:userid]} - #{err}")
    end
  end

  get "/api/user_groups/:userid", :provides => 'json' do
    begin
      ifp_interface = dbus_ifp_interface
      user_groups = ifp_interface.GetUserGroups(params[:userid])
      body normal_response(user_groups.first)
    rescue => err
      status 400
      body error_response("Unable to get groups for user #{params[:userid]} - #{err}")
    end
  end

  private

  def dbus_ifp_interface
    sysbus      = DBus.system_bus
    ifp_service = sysbus["org.freedesktop.sssd.infopipe"]
    ifp_object  = ifp_service.object "/org/freedesktop/sssd/infopipe"
    ifp_object.introspect
    ifp_object["org.freedesktop.sssd.infopipe"]
  end

  def error_response(error)
    { "error" => error.split("\n").first }.to_json
  end

  def normal_response(data)
    { "result" => data }.to_json
  end
end