3 * see AUTHORS for the list of contributors
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 import java.sql.Driver;
21 import java.sql.DriverManager;
22 import java.util.Enumeration;
23 import java.util.Date;
24 import java.util.logging.Level;
25 import org.sonews.config.Config;
26 import org.sonews.daemon.ChannelLineBuffers;
27 import org.sonews.daemon.CommandSelector;
28 import org.sonews.daemon.Connections;
29 import org.sonews.daemon.NNTPDaemon;
30 import org.sonews.feed.FeedManager;
31 import org.sonews.mlgw.MailPoller;
32 import org.sonews.storage.StorageBackendException;
33 import org.sonews.storage.StorageManager;
34 import org.sonews.storage.StorageProvider;
35 import org.sonews.util.Log;
36 import org.sonews.util.Purger;
37 import org.sonews.util.io.Resource;
40 * Startup class of the daemon.
41 * @author Christian Lins
44 public final class Main {
46 /** Version information of the sonews daemon */
47 public static final String VERSION = "sonews/1.1.0~Drupal";
49 /** The server's startup date */
50 public static final Date STARTDATE = new Date();
53 * The main entrypoint.
57 public static void main(String[] args) throws Exception {
58 System.out.println(VERSION);
59 Thread.currentThread().setName("Mainthread");
61 // Command line arguments
62 boolean feed = false; // Enable feeding?
63 boolean mlgw = false; // Enable Mailinglist gateway?
66 for (int n = 0; n < args.length; n++) {
67 if (args[n].equals("-c") || args[n].equals("-config")) {
68 Config.inst().set(Config.LEVEL_CLI, Config.CONFIGFILE, args[++n]);
69 System.out.println("Using config file " + args[n]);
70 } else if (args[n].equals("-dumpjdbcdriver")) {
71 System.out.println("Available JDBC drivers:");
72 Enumeration<Driver> drvs = DriverManager.getDrivers();
73 while (drvs.hasMoreElements()) {
74 System.out.println(drvs.nextElement());
77 } else if (args[n].equals("-feed")) {
79 } else if (args[n].equals("-h") || args[n].equals("-help")) {
82 } else if (args[n].equals("-mlgw")) {
84 } else if (args[n].equals("-p")) {
85 port = Integer.parseInt(args[++n]);
86 } else if (args[n].equals("-plugin-storage")) {
87 System.out.println("Warning: -plugin-storage is not implemented!");
88 } else if (args[n].equals("-plugin-command")) {
90 CommandSelector.addCommandHandler(args[++n]);
91 } catch (Exception ex) {
92 StringBuilder strBuf = new StringBuilder();
93 strBuf.append("Could not load command plugin: ");
94 strBuf.append(args[n]);
95 Log.get().warning(strBuf.toString());
96 Log.get().log(Level.INFO, "Main.java", ex);
98 } else if (args[n].equals("-plugin-storage")) {
99 System.out.println("Warning: -plugin-storage is not implemented!");
100 } else if (args[n].equals("-v") || args[n].equals("-version")) {
101 // Simply return as the version info is already printed above
106 // Try to load the JDBCDatabase;
107 // Do NOT USE BackendConfig or Log classes before this point because they require
108 // a working JDBCDatabase connection.
110 String provName = Config.inst().get(Config.LEVEL_FILE,
111 Config.STORAGE_PROVIDER, "org.sonews.storage.impl.JDBCDatabaseProvider");
112 StorageProvider sprov = StorageManager.loadProvider(provName);
113 StorageManager.enableProvider(sprov);
115 // Make sure some elementary groups are existing
116 if (!StorageManager.current().isGroupExisting("control")) {
117 StorageManager.current().addGroup("control", 0);
118 Log.get().info("Group 'control' created.");
120 } catch (StorageBackendException ex) {
121 Log.get().log(Level.SEVERE, ex.getLocalizedMessage(), ex);
122 System.err.println("Database initialization failed with " + ex.toString());
123 System.err.println("Make sure you have specified the correct database"
124 + " settings in sonews.conf!");
128 ChannelLineBuffers.allocateDirect();
131 Runtime.getRuntime().addShutdownHook(new ShutdownHook());
133 // Start the listening daemon
135 port = Config.inst().get(Config.PORT, 119);
137 final NNTPDaemon daemon = NNTPDaemon.createInstance(port);
140 // Start Connections purger thread...
141 Connections.getInstance().start();
143 // Start mailinglist gateway...
145 new MailPoller().start();
150 FeedManager.startFeeding();
153 Purger purger = new Purger();
156 // Wait for main thread to exit (setDaemon(false))
160 private static void printArguments() {
161 String usage = Resource.getAsString("helpers/usage", true);
162 System.out.println(usage);