chris@3: /*
chris@3: * SONEWS News Server
chris@3: * see AUTHORS for the list of contributors
chris@3: *
chris@3: * This program is free software: you can redistribute it and/or modify
chris@3: * it under the terms of the GNU General Public License as published by
chris@3: * the Free Software Foundation, either version 3 of the License, or
chris@3: * (at your option) any later version.
chris@3: *
chris@3: * This program is distributed in the hope that it will be useful,
chris@3: * but WITHOUT ANY WARRANTY; without even the implied warranty of
chris@3: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
chris@3: * GNU General Public License for more details.
chris@3: *
chris@3: * You should have received a copy of the GNU General Public License
chris@3: * along with this program. If not, see .
chris@3: */
chris@3:
chris@3: package org.sonews;
chris@3:
chris@3: import java.sql.Driver;
chris@3: import java.sql.DriverManager;
chris@3: import java.util.Enumeration;
chris@3: import java.util.Date;
chris@3: import org.sonews.config.Config;
chris@3: import org.sonews.daemon.ChannelLineBuffers;
chris@3: import org.sonews.daemon.Connections;
chris@3: import org.sonews.daemon.NNTPDaemon;
chris@3: import org.sonews.feed.FeedManager;
chris@3: import org.sonews.mlgw.MailPoller;
chris@3: import org.sonews.storage.StorageBackendException;
chris@3: import org.sonews.storage.StorageManager;
chris@3: import org.sonews.storage.StorageProvider;
chris@3: import org.sonews.util.Log;
chris@3: import org.sonews.util.Purger;
chris@3: import org.sonews.util.io.Resource;
chris@3:
chris@3: /**
chris@3: * Startup class of the daemon.
chris@3: * @author Christian Lins
chris@3: * @since sonews/0.5.0
chris@3: */
chris@3: public final class Main
chris@3: {
chris@3:
chris@3: private Main()
chris@3: {
chris@3: }
chris@3:
chris@3: /** Version information of the sonews daemon */
cli@15: public static final String VERSION = "sonews/1.1.0";
chris@3: public static final Date STARTDATE = new Date();
chris@3:
chris@3: /**
chris@3: * The main entrypoint.
chris@3: * @param args
chris@3: * @throws Exception
chris@3: */
chris@3: public static void main(String[] args) throws Exception
chris@3: {
chris@3: System.out.println(VERSION);
chris@3: Thread.currentThread().setName("Mainthread");
chris@3:
chris@3: // Command line arguments
chris@3: boolean feed = false; // Enable feeding?
chris@3: boolean mlgw = false; // Enable Mailinglist gateway?
chris@3: int port = -1;
chris@3:
chris@3: for(int n = 0; n < args.length; n++)
chris@3: {
chris@3: if(args[n].equals("-c") || args[n].equals("-config"))
chris@3: {
chris@3: Config.inst().set(Config.LEVEL_CLI, Config.CONFIGFILE, args[++n]);
chris@3: System.out.println("Using config file " + args[n]);
chris@3: }
chris@3: else if(args[n].equals("-dumpjdbcdriver"))
chris@3: {
chris@3: System.out.println("Available JDBC drivers:");
chris@3: Enumeration drvs = DriverManager.getDrivers();
chris@3: while(drvs.hasMoreElements())
chris@3: {
chris@3: System.out.println(drvs.nextElement());
chris@3: }
chris@3: return;
chris@3: }
chris@3: else if(args[n].equals("-feed"))
chris@3: {
chris@3: feed = true;
chris@3: }
chris@3: else if(args[n].equals("-h") || args[n].equals("-help"))
chris@3: {
chris@3: printArguments();
chris@3: return;
chris@3: }
chris@3: else if(args[n].equals("-mlgw"))
chris@3: {
chris@3: mlgw = true;
chris@3: }
chris@3: else if(args[n].equals("-p"))
chris@3: {
chris@3: port = Integer.parseInt(args[++n]);
chris@3: }
chris@3: else if(args[n].equals("-v") || args[n].equals("-version"))
chris@3: {
chris@3: // Simply return as the version info is already printed above
chris@3: return;
chris@3: }
chris@3: }
chris@3:
chris@3: // Try to load the JDBCDatabase;
chris@3: // Do NOT USE BackendConfig or Log classes before this point because they require
chris@3: // a working JDBCDatabase connection.
chris@3: try
chris@3: {
chris@3: StorageProvider sprov =
chris@3: StorageManager.loadProvider("org.sonews.storage.impl.JDBCDatabaseProvider");
chris@3: StorageManager.enableProvider(sprov);
chris@3:
chris@3: // Make sure some elementary groups are existing
chris@3: if(!StorageManager.current().isGroupExisting("control"))
chris@3: {
chris@3: StorageManager.current().addGroup("control", 0);
cli@15: Log.get().info("Group 'control' created.");
chris@3: }
chris@3: }
chris@3: catch(StorageBackendException ex)
chris@3: {
chris@3: ex.printStackTrace();
chris@3: System.err.println("Database initialization failed with " + ex.toString());
chris@3: System.err.println("Make sure you have specified the correct database" +
chris@3: " settings in sonews.conf!");
chris@3: return;
chris@3: }
chris@3:
chris@3: ChannelLineBuffers.allocateDirect();
chris@3:
chris@3: // Add shutdown hook
chris@3: Runtime.getRuntime().addShutdownHook(new ShutdownHook());
chris@3:
chris@3: // Start the listening daemon
chris@3: if(port <= 0)
chris@3: {
chris@3: port = Config.inst().get(Config.PORT, 119);
chris@3: }
chris@3: final NNTPDaemon daemon = NNTPDaemon.createInstance(port);
chris@3: daemon.start();
chris@3:
chris@3: // Start Connections purger thread...
chris@3: Connections.getInstance().start();
chris@3:
chris@3: // Start mailinglist gateway...
chris@3: if(mlgw)
chris@3: {
chris@3: new MailPoller().start();
chris@3: }
chris@3:
chris@3: // Start feeds
chris@3: if(feed)
chris@3: {
chris@3: FeedManager.startFeeding();
chris@3: }
chris@3:
chris@3: Purger purger = new Purger();
chris@3: purger.start();
chris@3:
chris@3: // Wait for main thread to exit (setDaemon(false))
chris@3: daemon.join();
chris@3: }
chris@3:
chris@3: private static void printArguments()
chris@3: {
chris@3: String usage = Resource.getAsString("helpers/usage", true);
chris@3: System.out.println(usage);
chris@3: }
chris@3:
chris@3: }