From 4b6989ef7bbbf8472d102a831c63e0d2fade6fd2 Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Sat, 28 Nov 2009 17:08:02 +0000 Subject: [PATCH] * Addressbook, susidns: Rework addressbook into a HttpServlet, so susidns can kick it when the subscription list changes --- .../java/src/net/i2p/addressbook/Servlet.java | 47 ++++++++++++++----- apps/addressbook/web.xml | 6 +++ .../src/i2p/susi/dns/SubscriptionsBean.java | 14 +++++- 3 files changed, 54 insertions(+), 13 deletions(-) diff --git a/apps/addressbook/java/src/net/i2p/addressbook/Servlet.java b/apps/addressbook/java/src/net/i2p/addressbook/Servlet.java index 8f26788e4e..c5239609e5 100644 --- a/apps/addressbook/java/src/net/i2p/addressbook/Servlet.java +++ b/apps/addressbook/java/src/net/i2p/addressbook/Servlet.java @@ -21,24 +21,43 @@ package net.i2p.addressbook; -import javax.servlet.GenericServlet; +import java.util.Random; + import javax.servlet.ServletConfig; import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; /** * A wrapper for addressbook to allow it to be started as a web application. * + * This was a GenericServlet, we make it an HttpServlet solely to provide a hook + * for SusiDNS to wake us up when the subscription list changes. + * * @author Ragnarok * */ -public class Servlet extends GenericServlet { +public class Servlet extends HttpServlet { + private Thread _thread; + private String _nonce; + private static final String PROP_NONCE = "addressbook.nonce"; - /* (non-Javadoc) - * @see javax.servlet.Servlet#service(javax.servlet.ServletRequest, javax.servlet.ServletResponse) + /** + * Hack to allow susidns to kick the daemon when the subscription list changes. + * URL must be /addressbook/ with wakeup param set, and nonce param set from system property. + * + * (non-Javadoc) + * see javax.servlet.Servlet#service(javax.servlet.ServletRequest, javax.servlet.ServletResponse) */ - public void service(ServletRequest request, ServletResponse response) { + public void service(HttpServletRequest request, HttpServletResponse response) { + //System.err.println("Got request nonce = " + request.getParameter("nonce")); + if (_thread != null && request.getParameter("wakeup") != null && + _nonce != null && _nonce.equals(request.getParameter("nonce"))) { + //System.err.println("Sending interrupt"); + _thread.interrupt(); + } + // no output } /* (non-Javadoc) @@ -49,15 +68,19 @@ public class Servlet extends GenericServlet { try { super.init(config); } catch (ServletException exp) { + System.err.println("Addressbook init exception: " + exp); } + _nonce = "" + Math.abs((new Random()).nextLong()); + // put the nonce where susidns can get it + System.setProperty(PROP_NONCE, _nonce); String[] args = new String[1]; args[0] = config.getInitParameter("home"); - DaemonThread thread = new DaemonThread(args); - thread.setDaemon(true); - thread.setName("Addressbook"); - thread.start(); + _thread = new DaemonThread(args); + _thread.setDaemon(true); + _thread.setName("Addressbook"); + _thread.start(); System.out.println("INFO: Starting Addressbook " + Daemon.VERSION); - System.out.println("INFO: config root under " + args[0]); + //System.out.println("INFO: config root under " + args[0]); } } diff --git a/apps/addressbook/web.xml b/apps/addressbook/web.xml index 0c3548c68d..c5fe302a6b 100644 --- a/apps/addressbook/web.xml +++ b/apps/addressbook/web.xml @@ -13,4 +13,10 @@ </init-param> <load-on-startup>1</load-on-startup> </servlet> + + <servlet-mapping> + <servlet-name>addressbook</servlet-name> + <url-pattern>/</url-pattern> + </servlet-mapping> + </web-app> diff --git a/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java b/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java index 56a42208b3..b860e23930 100644 --- a/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java +++ b/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java @@ -128,7 +128,19 @@ public class SubscriptionsBean if( lastSerial != null && serial != null && serial.compareTo( lastSerial ) == 0 ) { if( action.compareToIgnoreCase( "save") == 0 ) { save(); - message = "Subscriptions saved."; + String nonce = System.getProperty("addressbook.nonce"); + if (nonce != null) { + // Yes this is a hack. + // No it doesn't work on a text-mode browser. + // Fetching from the addressbook servlet + // with the correct parameters will kick off a + // config reload and fetch. + message = "Subscriptions saved, updating addressbook from subscription sources now." + + "<img height=\"1\" width=\"1\" alt=\"\" " + + "src=\"/addressbook/?wakeup=1&nonce=" + nonce + "\">"; + } else { + message = "Subscriptions saved."; + } } else if( action.compareToIgnoreCase( "reload") == 0 ) { reload(); -- GitLab