akissa/baruwa-ruby

View on GitHub
lib/baruwa.rb

Summary

Maintainability
D
3 days
Test Coverage
# -*- encoding: utf-8 -*-
# vim: ai ts=4 sts=4 et sw=4
# baruwa: Ruby bindings for the Baruwa REST API
# Copyright (C) 2015-2020 Andrew Colin Kissa <andrew@topdog.za.net>
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.
require "cgi"
require "json"
require "openssl"
require "net/http"

require "baruwa/version"

class BaruwaAPIError < StandardError;end

class BaruwaAPI
    ENDPOINTS = {
        :users => {
            :list => {:name => '/users', :method => :get},
            :new => {:name => '/users', :method => :post},
            :get => {:name => '/users/%s', :method => :get},
            :update => {:name => '/users', :method => :put},
            :delete => {:name => '/users/%s', :method => :delete},
            :password => {:name => '/users/chpw/%s', :method => :post}
        },
        :aliases => {
            :get => {:name => '/aliasaddresses/%s', :method => :get},
            :new => {:name => '/aliasaddresses/%s', :method => :post},
            :update => {:name => '/aliasaddresses/%s', :method => :put},
            :delete => {:name => '/aliasaddresses/%s', :method => :delete}
        },
        :domains => {
            :list => {:name => '/domains', :method => :get},
            :new => {:name => '/domains', :method => :post},
            :get => {:name => '/domains/%s', :method => :get},
            :get_by_name => {:name => '/domains/byname/%s', :method => :get},
            :update => {:name => '/domains/%s', :method => :put},
            :delete => {:name => '/domains/%s', :method => :delete}
        },
        :domainaliases => {
            :list => {:name => '/domainaliases/%s', :method => :get},
            :new => {:name => '/domainaliases/%s', :method => :post},
            :get => {:name => '/domainaliases/%s/%s', :method => :get},
            :update => {:name => '/domainaliases/%s/%s', :method => :put},
            :delete => {:name => '/domainaliases/%s/%s', :method => :delete}
        },
        :domainsmarthosts => {
            :list => {:name => '/domains/smarthosts/%s', :method => :get},
            :new => {:name => '/domains/smarthosts/%s', :method => :post},
            :get => {:name => '/domains/smarthosts/%s/%s', :method => :get},
            :update => {:name => '/domains/smarthosts/%s/%s', :method => :put},
            :delete => {:name => '/domains/smarthosts/%s/%s', :method => :delete}
        },
        :deliveryservers => {
            :list => {:name => '/deliveryservers/%s', :method => :get},
            :new => {:name => '/deliveryservers/%s', :method => :post},
            :get => {:name => '/deliveryservers/%s/%s', :method => :get},
            :update => {:name => '/deliveryservers/%s/%s', :method => :put},
            :delete => {:name => '/deliveryservers/%s/%s', :method => :delete}
        },
        :userdeliveryservers => {
            :list => {:name => '/userdeliveryservers/%s', :method => :get},
            :new => {:name => '/userdeliveryservers/%s', :method => :post},
            :get => {:name => '/userdeliveryservers/%s/%s', :method => :get},
            :update => {:name => '/userdeliveryservers/%s/%s', :method => :put},
            :delete => {:name => '/userdeliveryservers/%s/%s', :method => :delete}
        },
        :authservers => {
            :list => {:name => '/authservers/%s', :method => :get},
            :new => {:name => '/authservers/%s', :method => :post},
            :get => {:name => '/authservers/%s/%s', :method => :get},
            :update => {:name => '/authservers/%s/%s', :method => :put},
            :delete => {:name => '/authservers/%s/%s', :method => :delete}
        },
        :ldapsettings => {
            :new => {:name => '/ldapsettings/%s/%s', :method => :post},
            :get => {:name => '/ldapsettings/%s/%s/%s', :method => :get},
            :update => {:name => '/ldapsettings/%s/%s/%s', :method => :put},
            :delete => {:name => '/ldapsettings/%s/%s/%s', :method => :delete}
        },
        :radiussettings => {
            :new => {:name => '/radiussettings/%s/%s', :method => :post},
            :get => {:name => '/radiussettings/%s/%s/%s', :method => :get},
            :update => {:name => '/radiussettings/%s/%s/%s', :method => :put},
            :delete => {:name => '/radiussettings/%s/%s/%s', :method => :delete}
        },
        :organizations => {
            :list => {:name => '/organizations', :method => :get},
            :new => {:name => '/organizations', :method => :post},
            :get => {:name => '/organizations/%s', :method => :get},
            :update => {:name => '/organizations/%s', :method => :put},
            :delete => {:name => '/organizations/%s', :method => :delete}
        },
        :relays => {
            :new => {:name => '/relays/%s', :method => :post},
            :get => {:name => '/relays/%s', :method => :get},
            :update => {:name => '/relays/%s', :method => :put},
            :delete => {:name => '/relays/%s', :method => :delete}
        },
        :fallbackservers => {
            :list => {:name => '/fallbackservers/list/%s', :method => :get},
            :new => {:name => '/fallbackservers/%s', :method => :post},
            :get => {:name => '/fallbackservers/%s', :method => :get},
            :update => {:name => '/fallbackservers/%s', :method => :put},
            :delete => {:name => '/fallbackservers/%s', :method => :delete}
        },
        :orgsmarthosts => {
            :list => {:name => '/organizations/smarthosts/%s', :method => :get},
            :new => {:name => '/organizations/smarthosts/%s', :method => :post},
            :get => {:name => '/organizations/smarthosts/%s/%s', :method => :get},
            :update => {:name => '/organizations/smarthosts/%s/%s', :method => :put},
            :delete => {:name => '/organizations/smarthosts/%s/%s', :method => :delete}
        },
        :status => {:name => '/status', :method => :get}
    }
    def initialize (url, token, ssl_verify=false)
      @baruwa_url = "#{url}/api/v1"
      @baruwa_token = token
      @ssl_verify = ssl_verify
    end

    def get_users(page=nil)
        # get users
        params = {}
        if page.is_a? Integer then
            params[:page] = page
        end
        call_api(ENDPOINTS[:users][:list], [], false, params)
    end

    def get_user(userid)
        # get a user
        call_api(ENDPOINTS[:users][:get], [userid])
    end

    def create_user(data)
        # create a user
        call_api(ENDPOINTS[:users][:new], [], data)
    end

    def update_user(data)
        # update a user
        call_api(ENDPOINTS[:users][:update], [], data)
    end

    def delete_user(userid)
        # delete a user
        call_api(ENDPOINTS[:users][:delete], [userid])
    end

    def set_user_passwd(userid, data)
        # set a user password
        call_api(ENDPOINTS[:users][:password], [userid], data)
    end

    def get_aliases(addressid)
        # get aliases
        call_api(ENDPOINTS[:aliases][:get], [addressid])
    end

    def create_alias(userid, data)
        # create an alias address
        call_api(ENDPOINTS[:aliases][:new], [userid], data)
    end

    def update_alias(addressid, data)
        # update an alias address
        call_api(ENDPOINTS[:aliases][:update], [addressid], data)
    end

    def delete_alias(addressid, data)
        # delete an alias address
        call_api(ENDPOINTS[:aliases][:delete], [addressid], data)
    end

    def get_domains(page=nil)
        # get domains
        params = {}
        if page.is_a? Integer then
            params[:page] = page
        end
        call_api(ENDPOINTS[:domains][:list], [], false, params)
    end

    def get_domain(domainid)
        # get a domain
        call_api(ENDPOINTS[:domains][:get], [domainid])
    end

    def get_domain_by_name(domainname)
        # get a domain by name
        call_api(ENDPOINTS[:domains][:get_by_name], [domainname])
    end

    def create_domain(data)
        # create a domain
        call_api(ENDPOINTS[:domains][:new], [], data)
    end

    def update_domain(domainid, data)
        # update a domain
        call_api(ENDPOINTS[:domains][:update], [domainid], data)
    end

    def delete_domain(domainid)
        # delete a domain
        call_api(ENDPOINTS[:domains][:delete], [domainid])
    end

    def get_domainaliases(domainid, page=nil)
        # get domain aliases
        params = {}
        if page.is_a? Integer then
            params[:page] = page
        end
        call_api(ENDPOINTS[:domainaliases][:list], [domainid], false, params)
    end

    def get_domainalias(domainid, aliasid)
        # get domain alias
        call_api(ENDPOINTS[:domainaliases][:get], [domainid, aliasid])
    end

    def create_domainalias(domainid, data)
        # create a domain alias
        call_api(ENDPOINTS[:domainaliases][:new], [domainid], data)
    end

    def update_domainalias(domainid, aliasid, data)
        # update a domain alias
        call_api(ENDPOINTS[:domainaliases][:update], [domainid, aliasid], data)
    end

    def delete_domainalias(domainid, aliasid, data)
        # delete a domain alias
        call_api(ENDPOINTS[:domainaliases][:delete], [domainid, aliasid], data)
    end

    def get_domain_smarthosts(domainid, page=nil)
        # get domain smarthosts
        params = {}
        if page.is_a? Integer then
            params[:page] = page
        end
        call_api(ENDPOINTS[:domainsmarthosts][:list], [domainid], false, params)
    end

    def get_domain_smarthost(domainid, smarthostid)
        # get domain smarthost
        call_api(ENDPOINTS[:domainsmarthosts][:get], [domainid, smarthostid])
    end

    def create_domain_smarthost(domainid, data)
        # create a domain smarthost
        call_api(ENDPOINTS[:domainsmarthosts][:new], [domainid], data)
    end

    def update_domain_smarthost(domainid, smarthostid, data)
        # update a domain smarthost
        call_api(ENDPOINTS[:domainsmarthosts][:update], [domainid, smarthostid], data)
    end

    def delete_domain_smarthost(domainid, smarthostid, data)
        # delete a domain smarthost
        call_api(ENDPOINTS[:domainsmarthosts][:delete], [domainid, smarthostid], data)
    end

    def get_deliveryservers(domainid, page=nil)
        # get delivery servers
        params = {}
        if page.is_a? Integer then
            params[:page] = page
        end
        call_api(ENDPOINTS[:deliveryservers][:list], [domainid], false, params)
    end

    def get_deliveryserver(domainid, serverid)
        # get a delivery server
        call_api(ENDPOINTS[:deliveryservers][:get], [domainid, serverid])
    end

    def create_deliveryserver(domainid, data)
        # create a delivery server
        call_api(ENDPOINTS[:deliveryservers][:new], [domainid], data)
    end

    def update_deliveryserver(domainid, serverid, data)
        # update a delivery server
        call_api(ENDPOINTS[:deliveryservers][:update], [domainid, serverid], data)
    end

    def delete_deliveryserver(domainid, serverid, data)
        # delete delivery servers
        call_api(ENDPOINTS[:deliveryservers][:delete], [domainid, serverid], data)
    end

    def get_user_deliveryservers(domainid, page=nil)
        # get delivery servers
        params = {}
        if page.is_a? Integer then
            params[:page] = page
        end
        call_api(ENDPOINTS[:userdeliveryservers][:list], [domainid], false, params)
    end

    def get_user_deliveryserver(domainid, serverid)
        # get a delivery server
        call_api(ENDPOINTS[:userdeliveryservers][:get], [domainid, serverid])
    end

    def create_user_deliveryserver(domainid, data)
        # create a delivery server
        call_api(ENDPOINTS[:userdeliveryservers][:new], [domainid], data)
    end

    def update_user_deliveryserver(domainid, serverid, data)
        # update a delivery server
        call_api(ENDPOINTS[:userdeliveryservers][:update], [domainid, serverid], data)
    end

    def delete_user_deliveryserver(domainid, serverid, data)
        # delete delivery servers
        call_api(ENDPOINTS[:userdeliveryservers][:delete], [domainid, serverid], data)
    end

    def get_authservers(domainid, page=nil)
        # get auth servers
        params = {}
        if page.is_a? Integer then
            params[:page] = page
        end
        call_api(ENDPOINTS[:authservers][:list], [domainid], false, params)
    end

    def get_authserver(domainid, serverid)
        # get auth server
        call_api(ENDPOINTS[:authservers][:get], [domainid, serverid])
    end

    def create_authserver(domainid, data)
        # create auth server
        call_api(ENDPOINTS[:authservers][:new], [domainid], data)
    end

    def update_authserver(domainid, serverid, data)
        # update an auth server
        call_api(ENDPOINTS[:authservers][:update], [domainid, serverid], data)
    end

    def delete_authserver(domainid, serverid, data)
        # delete an auth server
        call_api(ENDPOINTS[:authservers][:delete], [domainid, serverid], data)
    end

    def get_ldapsettings(domainid, serverid, settingsid)
        # get ldap settings
        call_api(ENDPOINTS[:ldapsettings][:get], [domainid, serverid, settingsid])
    end

    def create_ldapsettings(domainid, serverid, data)
        # create ldap settings
        call_api(ENDPOINTS[:ldapsettings][:new], [domainid, serverid], data)
    end

    def update_ldapsettings(domainid, serverid, settingsid, data)
        # update ldap settings
        call_api(ENDPOINTS[:ldapsettings][:update], [domainid, serverid, settingsid], data)
    end

    def delete_ldapsettings(domainid, serverid, settingsid, data)
        # delete ldap settings
        call_api(ENDPOINTS[:ldapsettings][:delete], [domainid, serverid, settingsid], data)
    end

    def get_radiussettings(domainid, serverid, settingsid)
        # get radius settings
        call_api(ENDPOINTS[:radiussettings][:get], [domainid, serverid, settingsid])
    end

    def create_radiussettings(domainid, serverid, data)
        # create radius settings
        call_api(ENDPOINTS[:radiussettings][:new], [domainid, serverid], data)
    end

    def update_radiussettings(domainid, serverid, settingsid, data)
        # update radius settings
        call_api(ENDPOINTS[:radiussettings][:update], [domainid, serverid, settingsid], data)
    end

    def delete_radiussettings(domainid, serverid, settingsid, data)
        # delete radius settings
        call_api(ENDPOINTS[:radiussettings][:delete], [domainid, serverid, settingsid], data)
    end

    def get_organizations(page=nil)
        # get organizations
        params = {}
        if page.is_a? Integer then
            params[:page] = page
        end
        call_api(ENDPOINTS[:organizations][:list], [], false, params)
    end

    def get_organization(orgid)
        # get organization
        call_api(ENDPOINTS[:organizations][:get], [orgid])
    end

    def create_organization(data)
        # create an organization
        call_api(ENDPOINTS[:organizations][:new], [], data)
    end

    def update_organization(orgid, data)
        # update an organization
        call_api(ENDPOINTS[:organizations][:update], [orgid], data)
    end

    def delete_organization(orgid)
        # delete an organization
        call_api(ENDPOINTS[:organizations][:delete], [orgid])
    end

    def get_relay(relayid)
        # get a relay setting
        call_api(ENDPOINTS[:relays][:get], [relayid])
    end

    def create_relay(orgid, data)
        # create a relay setting
        call_api(ENDPOINTS[:relays][:new], [orgid], data)
    end

    def update_relay(relayid, data)
        # update relay settings
        call_api(ENDPOINTS[:relays][:update], [relayid], data)
    end

    def delete_relay(relayid, data)
        # delete relay settings
        call_api(ENDPOINTS[:relays][:delete], [relayid], data)
    end

    def get_fallbackservers(orgid, page=nil)
        # get fallback servers
        params = {}
        if page.is_a? Integer then
            params[:page] = page
        end
        call_api(ENDPOINTS[:fallbackservers][:list], [orgid], false, params)
    end

    def get_fallbackserver(serverid)
        # get fallback server
        call_api(ENDPOINTS[:fallbackservers][:get], [serverid])
    end

    def create_fallbackserver(orgid, data)
        # create a fallback server
        call_api(ENDPOINTS[:fallbackservers][:new], [orgid], data)
    end

    def update_fallbackserver(serverid, data)
        # update a fallback server
        call_api(ENDPOINTS[:fallbackservers][:update], [serverid], data)
    end

    def delete_fallbackserver(serverid, data)
        # delete a fallback server
        call_api(ENDPOINTS[:fallbackservers][:delete], [serverid], data)
    end

    def get_org_smarthosts(orgid, page=nil)
        # get organization smarthosts
        params = {}
        if page.is_a? Integer then
            params[:page] = page
        end
        call_api(ENDPOINTS[:orgsmarthosts][:list], [orgid], false, params)
    end

    def get_org_smarthost(orgid, smarthostid)
        # get organization smarthost
        call_api(ENDPOINTS[:orgsmarthosts][:get], [orgid, smarthostid])
    end

    def create_org_smarthost(orgid, data)
        # create a organization smarthost
        call_api(ENDPOINTS[:orgsmarthosts][:new], [orgid], data)
    end

    def update_org_smarthost(orgid, smarthostid, data)
        # update a organization smarthost
        call_api(ENDPOINTS[:orgsmarthosts][:update], [orgid, smarthostid], data)
    end

    def delete_org_smarthost(orgid, smarthostid, data)
        # delete a organization smarthost
        call_api(ENDPOINTS[:orgsmarthosts][:delete], [orgid, smarthostid], data)
    end

    def get_status
        # get status
        call_api(ENDPOINTS[:status])
    end

    def get_params(params)
        # convert params has to string
        if params then
            params.collect {|k,v| "#{k}=#{CGI::escape(v.to_s)}"}.join('&')
        else
            params
        end
    end

    def parse_url(endpoint, opts, params=false)
        if opts.length > 0 then
            endpoint_string = endpoint[:name] % opts
        else
            endpoint_string = endpoint[:name]
        end
        url_string = @baruwa_url + endpoint_string
        url_string = url_string + '?' + get_params(params) if params
        uri = URI.parse(url_string)
        return uri
    end

    def set_headers
        {
            'User-Agent' => 'BaruwaAPI-Ruby',
            'Authorization' => "Bearer #{@baruwa_token}"
        }
    end

    def get_request(endpoint, url)
        case endpoint[:method]
        when :post
            Net::HTTP::Post.new(url.request_uri, set_headers)
        when :get
            Net::HTTP::Get.new(url.request_uri, set_headers)
        when :put
            Net::HTTP::Put.new(url.request_uri, set_headers)
        when :delete
            Net::HTTP::Delete.new(url.request_uri, set_headers)
        else
            throw "Unknown call method #{endpoint[:method]}"
        end
    end

    def parse_response(response)
        if response.code.to_i == 200 || response.code.to_i == 201
            if response.body.nil? || response.body.empty?
                {:code => response.code.to_i, :message => "Completed successfully"}
            else
                JSON.parse(response.body)
            end
        else
            raise StandardError.new("#{response.code} #{response.body}")
        end
    end

    def call_api(endpoint, opts=[], data=false, params=false)
        url = parse_url(endpoint, opts, params)
        call = get_request(endpoint, url)
        call.body = get_params(data)
        request = Net::HTTP.new(url.host, url.port)
        usessl = @baruwa_url.match('https')
        request.use_ssl = usessl
        if usessl
            if @ssl_verify == false
                request.verify_mode = OpenSSL::SSL::VERIFY_NONE
            end
        end
        response = request.start {|http| http.request(call)}
        parse_response(response)
    end
end