This repository has been archived on 2020-04-11. You can view files and clone it, but cannot push or open issues or pull requests.
ildus/lib/ildus/server/backend.rb

222 lines
6.6 KiB
Ruby

# = ildus/server/backend - generic server backend library
#
# Copyright (C) 2005 Paul van Tilburg <paul@luon.net>
#
# Ildus is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation; either version 2 of the License, or (at your option)
# any later version.
require 'singleton'
module Ildus
class Server
# = Backend access module
#
# Module that is able to load and retrieve account or
# backend classes & code.
module Backend
# Load the plugin for account backend _name_ and return the class
# that can be instantiated.
def self.get_account(name)
get("account", AccountBackend, name)
end
# Load the plugin for domain backend _name_ and return the class
# that can be instantiated.
def self.get_domain(name)
get("domain", DomainBackend, name)
end
# Method that does the actual loading and class retrieving.
def self.get(type, mod, name)
name = name.to_s
path = File.dirname(__FILE__)
file = File.join(path, "#{type}_backends", name + ".rb")
puts "Requiring #{file} for #{type} backend: #{name}... "
require file
return mod.const_get(name.capitalize)
rescue NameError, LoadError
nil
end
end # module Backend
# = Account administration backend module
#
# This module contains all account backends that are used for managing
# Ildus accounts in some database. All classes inherit from Basic,
# which defines the basic interface.
#
# For the interface of each class in the AccountBackend, see the Basic
# class.
module AccountBackend
# = Basic account backend
#
# Class defining the basic interface of an account backend class.
# All account backend classes should inherit from this class.
#
# All methods marked with (*Interface*) raise Handler::NotImplementedError
# and should be overriden by a class implementing the interface.
class Basic
# Configuration for the backend (Hash).
attr_reader :config
# The currently selected user.
attr_reader :user
# The currently selected password.
attr_reader :pass
# Boolean determining the authentication status.
attr_writer :auth
# Creates a new account backend object, the current *user*
# and *password* are undefined by default.
def initialize(backend_config)
@config = backend_config
@user = nil
@pass = nil
@auth = false
end
# Sets the _username_.
def user=(username)
@user = username
end
# Sets the _password_ and tries to set/review the authentication
# status via the interface (using #authenticate()).
def pass=(password)
@pass = password
authenticate
end
# Determines whether the backend considers the currently selected
# user with the currently selected password as authenticated.
def authenticated?
@auth
end
#################
# Backend methods
# (*Interface*) Considers the currently selected _user_ and
# _password_ and uses #auth= to set whether the user is
# authenticated or not.
def authenticate
raise Handler::NotImplementedError
end
# (*Interface*) Registers a new account _user_ with password
# _pass_ in the database.
def register_account(user, pass)
raise Handler::NotImplementedError
end
# (*Interface*) Removes the account of _user_ from the database.
def unregister_account(user)
raise Handler::NotImplementedError
end
end # class Basic
end # module AccountBackend
# = Domain administration backend module
#
# This module contains all domain backends that are used for managing
# Ildus domain records in some database. All classes inherit from
# Basic, which defines the basic interface.
#
# For the interface of each class in the DomainBackend, see the Basic
# class.
module DomainBackend
# = Basic domain backend
#
# Class defining the basic interface of a domain backend class.
# All domain backend classes should inherit from this class.
#
# All methods marked with (*Interface*) raise Handler::NotImplementedError
# and should be overriden by a class implementing the interface.
class Basic
# Configuration for the backend (Hash).
attr_accessor :config
# The currently selected user.
attr_accessor :user
# Creates a new backend object with the configuration
# _backend_config_. The current *user* is left undefined.
def initialize(backend_config)
@config = backend_config
@user = nil
end
# Method called when all actions are done and the data should be
# committed to the database (if not done real-time already before).
#
# This method can be override, but should also call +super+, since
# this methods runs the optional hook.
def commit
system "#{@config['hook']}" if @config['hook']
end
#################
# Backend methods
# (*Interface*) Returns a datastructure containing
# the list of hosts owned by the selected user.
def hosts
# FIXME: format constraints.
raise Handler::NotImplementedError
end
# (*Interface*) Adds the given _host_ to the list
# of owned hosts by the selected user.
def add_host(host)
raise Handler::NotImplementedError
end
# (*Interface*) Removes the given _host_ from the
# list of owned hosts by the selected user.
def remove_host(host)
raise Handler::NotImplementedError
end
# (*Interface*) Updates the address of the given
# _host_ to the give address _addr_.
def update_host(host, addr)
raise Handler::NotImplementedError
end
# (*Interface*) Adds the alias _new_alias_ to the
# given _host_.
def add_alias(new_alias, host)
raise Handler::NotImplementedError
end
# (*Interface*) Removes the alias _old_alias_ from
# the given _host_.
def remove_alias(old_alias, host)
raise Handler::NotImplementedError
end
end # class Basic
end # module DomainBackend
end # class Server
end # module Ildus