All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.jradius.server.JRadiusServer Maven / Gradle / Ivy

The newest version!
/**
 * JRadius - A RADIUS Server Java Adapter
 * Copyright (C) 2004-2005 PicoPoint, B.V.
 * Copyright (c) 2006 David Bird 
 *
 * This library is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or (at
 * your option) any later version.
 *
 * This library is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
 * License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this library; if not, write to the Free Software Foundation,
 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 *
 */

package net.jradius.server;

import java.lang.reflect.InvocationTargetException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

import org.springframework.beans.factory.InitializingBean;

import net.jradius.handler.chain.JRCommand;
import net.jradius.log.RadiusLog;
import net.jradius.packet.attribute.AttributeDictionary;
import net.jradius.packet.attribute.AttributeFactory;
import net.jradius.server.config.Configuration;
import net.jradius.server.config.DictionaryConfigurationItem;
import net.jradius.server.config.ListenerConfigurationItem;
import net.jradius.session.JRadiusSessionManager;

/**
 * Constants used in the server. This is currently too FreeRADIUS specific
 * and that will change.
 *
 * @author David Bird
 */
public class JRadiusServer implements InitializingBean
{
    /**
     * TODO:
     * The following are taken from FreeRADIUS. JRadius should, however,
     * define its own (non server specific) values here! 
     */
    public static final int JRADIUS_authenticate = 1;
    public static final int JRADIUS_authorize    = 2;
    public static final int JRADIUS_preacct      = 3;
    public static final int JRADIUS_accounting   = 4;
    public static final int JRADIUS_checksimul   = 5;
    public static final int JRADIUS_pre_proxy    = 6;
    public static final int JRADIUS_post_proxy   = 7;
    public static final int JRADIUS_post_auth    = 8;
    public static final int JRADIUS_max_request_type = 8; /* the highest numbered request type */
    
    public static final int RLM_MODULE_REJECT    = 0;   /* immediately reject the request */
    public static final int RLM_MODULE_FAIL      = 1;   /* module failed, don't reply */
    public static final int RLM_MODULE_OK        = 2;   /* the module is OK, continue */
    public static final int RLM_MODULE_HANDLED   = 3;   /* the module handled the request, so stop. */
    public static final int RLM_MODULE_INVALID   = 4;   /* the module considers the request invalid. */
    public static final int RLM_MODULE_USERLOCK  = 5;   /* reject the request (user is locked out) */
    public static final int RLM_MODULE_NOTFOUND  = 6;   /* user not found */
    public static final int RLM_MODULE_NOOP      = 7;   /* module succeeded without doing anything */
    public static final int RLM_MODULE_UPDATED   = 8;   /* OK (pairs modified) */
    public static final int RLM_MODULE_NUMCODES  = 9;   /* How many return codes there are */

    private List processors;
    private List listeners;
    
    private EventDispatcher eventDispatcher;
    
    private boolean running = false;

    /**
     * Initializes a new JRadiusServer. The constructor calls initializeServer(),
     * the initialization method that reads the configuration file and sets up
     * processors and listeners.
     * @throws SecurityException
     * @throws IllegalArgumentException
     * @throws ClassNotFoundException
     * @throws NoSuchMethodException
     * @throws InstantiationException
     * @throws IllegalAccessException
     * @throws InvocationTargetException
     */
    public JRadiusServer() throws Exception
    {
        processors = new LinkedList();
        listeners = new LinkedList();
    }

    public JRadiusServer(EventDispatcher eventDispatcher) throws Exception
    {
    	this();
    	this.eventDispatcher = eventDispatcher;
    }

    public void afterPropertiesSet() throws Exception 
    {
    	if (eventDispatcher == null)
    	{
    		eventDispatcher = new EventDispatcher();
    	}
    	initializeServer();
	}

    public boolean isRunning()
    {
        return this.running;
    }

	/**
     * Start the JRadiusServer. Make sure the server is
     * initialized first by calling initializeServer()
     */
    public void start()
    {
        if(this.running == false)
        {
            RadiusLog.info("Starting Event Dispatcher...");
            this.eventDispatcher.start();

            RadiusLog.info("Starting Processors...");
            for (Iterator i = processors.iterator(); i.hasNext();)
            {
                Processor processor = (Processor) i.next();
                processor.start();
                RadiusLog.info("  Started processor " + processor.getName());
            }
            RadiusLog.info("Processors succesfully started.");

            RadiusLog.info("Starting Listeners...");
            for (Iterator i = listeners.iterator(); i.hasNext();)
            {
                Listener listener = (Listener) i.next();
                listener.start();
                RadiusLog.info("  Started listener " + listener.getName());
            }
            RadiusLog.info("Listeners succesfully started.");

            this.running = true;
        }
    }
    
    public void stop()
    {
        if (this.running)
        {
            for (Iterator i = listeners.iterator(); i.hasNext();)
            {
                Listener listener = (Listener) i.next();
                listener.setActive(false);
                RadiusLog.info("Stopping listener " + listener.getName());
            }

            for (Iterator i = processors.iterator(); i.hasNext();)
            {
                Processor processor = (Processor) i.next();
                processor.setActive(false);
                RadiusLog.info("Stopping processor " + processor.getName());
                processor.interrupt();
            }

            JRadiusSessionManager.shutdownManagers();

            this.eventDispatcher.setActive(false);
            this.eventDispatcher.interrupt();

            this.running = false;
        }
    }

    /**
     * Read the configuration and initialize the JRadiusServer
     * @throws SecurityException
     * @throws IllegalArgumentException
     * @throws ClassNotFoundException
     * @throws NoSuchMethodException
     * @throws InstantiationException
     * @throws IllegalAccessException
     * @throws InvocationTargetException
     */
    private void initializeServer() throws Exception
    {
        RadiusLog.info("Initializing JRadius Server....");
        for (Iterator i = Configuration.getDictionaryConfigs().iterator(); i.hasNext();)
        {
            DictionaryConfigurationItem dictionaryConfig = (DictionaryConfigurationItem) i.next();
            RadiusLog.info("Loading dictionary: " + dictionaryConfig.getClassName());
            AttributeFactory.loadAttributeDictionary((AttributeDictionary)Configuration.getBean(dictionaryConfig.getClassName()));
        }
        for (ListenerConfigurationItem listenerConfig :  Configuration.getListenerConfigs())
        {
            LinkedBlockingQueue queue = new LinkedBlockingQueue();
            createListenerWithConfigAndQueue(listenerConfig, queue);
            createProcessorsWithConfigAndQueue(listenerConfig, queue);
        }
        RadiusLog.info("JRadius Server succesfully Initialized.");
    }

    
    private void createProcessorsWithConfigAndQueue(ListenerConfigurationItem listenerConfig, BlockingQueue queue) throws Exception
    {
        for (int j = 0; j < listenerConfig.getNumberOfThreads(); j++)
        {
            Processor processor = newProcessorForName(listenerConfig.getProcessorClassName());
            processor.setRequestQueue(queue);
            RadiusLog.info("Created processor " + processor.getName());
            setPacketHandlersForProcessor(listenerConfig, processor);
            setEventHandlersForProcessor(listenerConfig, eventDispatcher);
            processor.setEventDispatcher(eventDispatcher);
            processors.add(processor);
        }
    }

    private void setPacketHandlersForProcessor(ListenerConfigurationItem cfg, Processor processor)
    {
        List requestHandlers = cfg.getRequestHandlers();
        if (requestHandlers == null)
        {
            RadiusLog.debug("No packet handlers are configured, maybe using chains instead.");
            return;
        }

        for (JRCommand handler : requestHandlers)
        {
            RadiusLog.info("Packet handler " + handler.getClass().getName());
        }

        processor.setRequestHandlers(requestHandlers);
    }
    
    private void setEventHandlersForProcessor(ListenerConfigurationItem cfg, EventDispatcher dispatcher)
    {
        List eventHandlers = cfg.getEventHandlers();
        if (eventHandlers == null)
        {
            return;
        }
        for (JRCommand handler : eventHandlers)
        {
            RadiusLog.info("Event handler " + handler.getClass().getName());
        }

        dispatcher.setEventHandlers(eventHandlers);
    }
    
    private void createListenerWithConfigAndQueue(ListenerConfigurationItem listenerConfig, BlockingQueue queue) throws Exception
    {
        Listener listener = newListenerWithConfig(listenerConfig);
        listener.setRequestQueue(queue);

        this.listeners.add(listener);

        RadiusLog.info("Created listener " + listener.getName());
    }
    
    private Listener newListenerWithConfig(ListenerConfigurationItem cfg) throws Exception
    {
        Listener listener = (Listener) Configuration.getBean(cfg.getClassName());
        listener.setConfiguration(cfg);

        return listener;
    }
    
    private Processor newProcessorForName(String className) throws Exception
    {
        Processor processor = (Processor) Configuration.getBean(className);
        return processor;
    }
    
    public static String resultCodeToString(int resultCode)
    {
        switch(resultCode)
        {
            case RLM_MODULE_REJECT  : return "REJECT";
            case RLM_MODULE_FAIL    : return "FAIL";
            case RLM_MODULE_OK      : return "OK";
            case RLM_MODULE_HANDLED : return "HANDLED";
            case RLM_MODULE_INVALID : return "INVALID";
            case RLM_MODULE_USERLOCK: return "USERLOCK";
            case RLM_MODULE_NOTFOUND: return "NOTFOUND";
            case RLM_MODULE_NOOP    : return "NOOP";
            case RLM_MODULE_UPDATED : return "UPDATED";
            case RLM_MODULE_NUMCODES: return "NUMCODES";
            default:                  return "UNKNOWN";
        }
    }
    
    public void setEventDispatcher(EventDispatcher eventDispatcher) 
    {
		this.eventDispatcher = eventDispatcher;
	}

	public EventDispatcher getEventDispatcher()
    {
        return eventDispatcher;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy