theforeman/foreman

View on GitHub
app/services/proxy_api/dhcp.rb

Summary

Maintainability
A
1 hr
Test Coverage
module ProxyAPI
  class DHCP < ProxyAPI::Resource
    def initialize(args)
      @url = args[:url] + "/dhcp"
      super args
    end

    # Retrieve the Server's subnets
    # Returns: Array of Hashes or false
    # Example [{"network":"192.168.11.0","netmask":"255.255.255.0"},{"network":"192.168.122.0","netmask":"255.255.255.0"}]
    def subnets
      parse get
    rescue => e
      raise ProxyException.new(url, e, N_("Unable to retrieve DHCP subnets"))
    end

    def subnet(subnet)
      parse get(subnet)
    rescue => e
      raise ProxyException.new(url, e, N_("Unable to retrieve DHCP subnet"))
    end

    def unused_ip(subnet, mac = nil)
      params = {}
      params[:mac] = mac if mac.present?

      if subnet.from.present? && subnet.to.present?
        params[:from] = subnet.from
        params[:to] = subnet.to
      end
      if params.any?
        params = params.map { |e| e.join("=") }.join("&")
      else
        params = ""
      end
      parse get("#{subnet.network}/unused_ip", query: params)
    rescue => e
      raise ProxyException.new(url, e, N_("Unable to retrieve unused IP"))
    end

    # Retrieves a DHCP entry for a mac
    # [+subnet+] : String in dotted decimal format
    # [+mac+]    : String in coloned sextuplet format
    # Returns    : Hash or false
    def record(subnet, mac)
      response = parse(get("#{subnet}/mac/#{mac}"))
      attrs = response.merge(:network => subnet, :proxy => self)
      if response.keys.grep(/Sun/i).empty?
        Net::DHCP::Record.new attrs
      else
        Net::DHCP::SparcRecord.new attrs
      end
    rescue RestClient::ResourceNotFound
      nil
    rescue => e
      raise ProxyException.new(url, e, N_("Unable to retrieve DHCP entry for %s"), mac)
    end

    # Retrieves an array of DHCP entries
    # [+subnet+] : String in dotted decimal format
    # [+ip+]    : ip address
    # Returns    : Hash or false
    def records_by_ip(subnet, ip)
      response = parse(get("#{subnet}/ip/#{ip}"))
      response.map do |entry|
        attrs = entry.merge(:network => subnet, :proxy => self)
        if entry.keys.grep(/Sun/i).empty?
          Net::DHCP::Record.new attrs
        else
          Net::DHCP::SparcRecord.new attrs
        end
      end
    rescue RestClient::ResourceNotFound
      nil
    rescue => e
      raise ProxyException.new(url, e, N_("Unable to retrieve DHCP entry for %s"), ip)
    end

    # Sets a DHCP entry
    # [+subnet+] : String in dotted decimal format
    # [+mac+]    : String in coloned sextuplet format
    # [+args+]   : Hash containing DHCP values. The :mac key is taken from the mac parameter
    # Returns    : Boolean status
    def set(subnet, args)
      raise "Must define a subnet" if subnet.empty?
      raise "Must provide arguments" unless args.is_a?(Hash)
      parse(post(args, subnet.to_s))
    rescue => e
      raise ProxyException.new(url, e, N_("Unable to set DHCP entry"))
    end

    # Deletes a DHCP entry
    # [+subnet+] : String in dotted decimal format
    # [+mac+]    : String in coloned sextuplet format
    # Returns    : Boolean status
    def delete(subnet, mac)
      parse super("#{subnet}/mac/#{mac}")
    rescue => e
      raise ProxyException.new(url, e, N_("Unable to delete DHCP entry for %s"), mac)
    end
  end
end