Bind SCGI server to localhost by default, and allow overriding.
[jsvc.git] / src / dolda / jsvc / scgi / DirServer.java
index 1ac452c..ef38a93 100644 (file)
@@ -7,10 +7,12 @@ import java.util.logging.*;
 import dolda.jsvc.*;
 import dolda.jsvc.util.*;
 import dolda.jsvc.j2ee.PosixArgs;
+import java.lang.management.ManagementFactory;
+import javax.management.*;
 
 public class DirServer extends Server {
     private final Map<File, DSContext> contexts = new HashMap<File, DSContext>();
-    private final Environment env;
+    public final Environment env;
     private final Logger logger = Logger.getLogger("dolda.jsvc.scgi.dirserver");
     private Thread sdhook = null, main = null;
     
@@ -26,6 +28,11 @@ public class DirServer extends Server {
            if(ctx != null) {
                if(ctx.mtime < file.lastModified()) {
                    ctx.tg.shutdown();
+                   try {
+                       ManagementFactory.getPlatformMBeanServer().unregisterMBean(ctx.mbean.name);
+                   } catch(InstanceNotFoundException e) {
+                   } catch(MBeanRegistrationException e) {
+                   }
                    contexts.remove(file);
                    ctx = null;
                    act = "reloaded %s as %s";
@@ -33,6 +40,12 @@ public class DirServer extends Server {
            }
            if(ctx == null) {
                ctx = new DSContext(file, env);
+               try {
+                   ManagementFactory.getPlatformMBeanServer().registerMBean(ctx.mbean, ctx.mbean.name);
+               } catch(InstanceAlreadyExistsException e) {
+               } catch(MBeanRegistrationException e) {
+               } catch(NotCompliantMBeanException e) {
+               }
                contexts.put(file, ctx);
                logger.config(String.format(act, file, ctx.name()));
            }
@@ -77,20 +90,31 @@ public class DirServer extends Server {
            }
        }
        super.shutdown();
+       try {
+           ManagementFactory.getPlatformMBeanServer().unregisterMBean(dolda.jsvc.scgi.jmx.Server.name);
+       } catch(InstanceNotFoundException e) {
+       } catch(MBeanRegistrationException e) {
+       }
     }
 
     private static void usage(PrintStream out) {
-       out.println("usage: dolda.jsvc.scgi.DirServer [-h] [-e CHARSET] [-d DATADIR] PORT");
+       out.println("usage: dolda.jsvc.scgi.DirServer [-h] [-B BINDADDR] [-e CHARSET] [-d DATADIR] PORT");
     }
     
     public static void main(String[] args) {
-       PosixArgs opt = PosixArgs.getopt(args, "h");
+       PosixArgs opt = PosixArgs.getopt(args, "he:d:B:");
        if(opt == null) {
            usage(System.err);
            System.exit(1);
        }
        String charset = null;
        File datroot = null;
+       InetAddress bindaddr;
+       try {
+           bindaddr = InetAddress.getLocalHost();
+       } catch(UnknownHostException e) {
+           throw(new Error("WTF?!", e));
+       }
        for(char c : opt.parsed()) {
            switch(c) {
            case 'e':
@@ -103,6 +127,14 @@ public class DirServer extends Server {
                    System.exit(1);
                }
                break;
+           case 'B':
+               try {
+                   bindaddr = InetAddress.getByName(opt.arg);
+               } catch(UnknownHostException e) {
+                   System.err.println(opt.arg  + ": no such host");
+                   System.exit(1);
+               }
+               break;
            case 'h':
                usage(System.out);
                return;
@@ -116,14 +148,22 @@ public class DirServer extends Server {
        env.initvm();
        int port = Integer.parseInt(opt.rest[0]);
        ServerSocket sk;
+       SocketAddress saddr = new InetSocketAddress(bindaddr, port);
        try {
-           sk = new ServerSocket(port);
+           sk = new ServerSocket();
+           sk.bind(saddr);
        } catch(IOException e) {
-           System.err.println("could not bind to port " + port + ": " + e.getMessage());
+           System.err.println("could not bind to " + saddr + ": " + e.getMessage());
            System.exit(1);
            return; /* Because javac is stupid. :-/ */
        }
        DirServer s = new DirServer(sk, env);
+       try {
+           ManagementFactory.getPlatformMBeanServer().registerMBean(new dolda.jsvc.scgi.jmx.Server(s), dolda.jsvc.scgi.jmx.Server.name);
+       } catch(InstanceAlreadyExistsException e) {
+       } catch(MBeanRegistrationException e) {
+       } catch(NotCompliantMBeanException e) {
+       }
        if(charset != null)
            s.headcs = charset;