[freenet-dev] [freenet-cvs] r15135 - in trunk/freenet/src/freenet: clients/http pluginmanager
Florent Daignière
nextgens at freenetproject.org
Fri Sep 14 14:05:23 UTC 2007
* Matthew Toseland <toad at amphibian.dyndns.org> [2007-09-14 14:58:26]:
> IMHO this is ugly. It's basically a function of the plugin loader, not the
> interface.
Agreed... but to be done properly the whole plugin system has to be
redesigned (remember, you were working on it last year)... and the
urgency is/was to fix the bug causing plugins to be re-downloaded on
every startup.
>
> On Thursday 13 September 2007 12:24, you wrote:
> > Author: nextgens
> > Date: 2007-09-13 11:24:55 +0000 (Thu, 13 Sep 2007)
> > New Revision: 15135
> >
> > Modified:
> > trunk/freenet/src/freenet/clients/http/PproxyToadlet.java
> > trunk/freenet/src/freenet/pluginmanager/PluginManager.java
> > Log:
> > plugins: Move some code around... sorry for the big diff
> >
> > Basically, checking for <plugname># should be done on the toadlet and not on
> the plugin manager ... otherwise we end up storing the # version in the
> configuration ... and we actually re-download everything on each startup :(
> >
> > nb: current loaded plugins using # will be "forgotten"
> >
> > Modified: trunk/freenet/src/freenet/clients/http/PproxyToadlet.java
> > ===================================================================
> > --- trunk/freenet/src/freenet/clients/http/PproxyToadlet.java 2007-09-13
> 09:08:18 UTC (rev 15134)
> > +++ trunk/freenet/src/freenet/clients/http/PproxyToadlet.java 2007-09-13
> 11:24:55 UTC (rev 15135)
> > @@ -1,7 +1,12 @@
> > package freenet.clients.http;
> >
> > +import java.io.File;
> > +import java.io.FileNotFoundException;
> > import java.io.IOException;
> > +import java.io.InputStream;
> > +import java.net.MalformedURLException;
> > import java.net.URI;
> > +import java.net.URL;
> > import java.util.Date;
> > import java.util.Iterator;
> >
> > @@ -20,6 +25,7 @@
> > import freenet.support.Logger;
> > import freenet.support.MultiValueTable;
> > import freenet.support.api.HTTPRequest;
> > +import freenet.support.io.FileUtil;
> >
> > public class PproxyToadlet extends Toadlet {
> > private static final int MAX_PLUGIN_NAME_LENGTH = 1024;
> > @@ -39,7 +45,7 @@
> > }
> >
> > public void handlePost(URI uri, HTTPRequest request, ToadletContext ctx)
> > - throws ToadletContextClosedException, IOException {
> > + throws ToadletContextClosedException, IOException {
> >
> > MultiValueTable headers = new MultiValueTable();
> >
> > @@ -55,7 +61,7 @@
> > super.sendErrorPage(ctx, 403, "Unauthorized", l10n("unauthorized"));
> > return;
> > }
> > -
> > +
> > String path=request.getPath();
> >
> > // remove leading / and plugins/ from path
> > @@ -65,7 +71,7 @@
> > if(Logger.shouldLog(Logger.MINOR, this)) Logger.minor(this, "Pproxy
> received POST on "+path);
> >
> > PluginManager pm = node.pluginManager;
> > -
> > +
> > if(path.length()>0)
> > {
> > try
> > @@ -114,10 +120,85 @@
> > {
> >
> > if (request.isPartSet("load")) {
> > - if(Logger.shouldLog(Logger.MINOR, this))
> Logger.minor(this, "Loading "+request.getPartAsString("load",
> MAX_PLUGIN_NAME_LENGTH));
> > - pm.startPlugin(request.getPartAsString("load", MAX_PLUGIN_NAME_LENGTH),
> true);
> > - //writeReply(ctx, 200, "text/html", "OK", mkForwardPage("Loading
> plugin", "Loading plugin...", ".", 5));
> > + String filename = request.getPartAsString("load",
> MAX_PLUGIN_NAME_LENGTH);
> > + final boolean logMINOR = Logger.shouldLog(Logger.MINOR, this);
> > + boolean downloaded = false;
> >
> > + if(logMINOR) Logger.minor(this, "Loading "+filename);
> > + if (filename.endsWith("#")) {
> > + for (int tries = 0; (tries <= 5) && (downloaded == false); tries++) {
> > + if (filename.indexOf('@') > -1) {
> > + Logger
> > + .error(this,
> > + "We don't allow downloads from anywhere else but our server");
> > + return;
> > + }
> > + String pluginname = filename.substring(0,
> > + filename.length() - 1);
> > + filename = null;
> > +
> > + URL url;
> > + InputStream is = null;
> > +
> > + try {
> > + url = new URL(
> > + "http://downloads.freenetproject.org/alpha/plugins/"
> > + + pluginname + ".jar.url");
> > + if (logMINOR)
> > + Logger.minor(this, "Downloading " + url);
> > + is = url.openStream();
> > +
> > + File pluginsDirectory = new File("plugins");
> > + if (!pluginsDirectory.exists()) {
> > + Logger
> > + .normal(this,
> > + "The plugin directory hasn't been found, let's create it");
> > + if (!pluginsDirectory.mkdir())
> > + return;
> > + }
> > +
> > + File finalFile = new File("plugins/" + pluginname
> > + + ".jar");
> > + if (!FileUtil.writeTo(is, finalFile))
> > + Logger.error(this,
> > + "Failed to rename the temporary file into "
> > + + finalFile);
> > +
> > + filename = "*@file://"
> > + + FileUtil.getCanonicalFile(finalFile);
> > + if (logMINOR)
> > + Logger.minor(this, "Rewritten to " + filename);
> > + downloaded = true;
> > + } catch (MalformedURLException mue) {
> > + Logger.error(this,
> > + "MalformedURLException has occured : " + mue,
> > + mue);
> > + return;
> > + } catch (FileNotFoundException e) {
> > + Logger.error(this,
> > + "FileNotFoundException has occured : " + e, e);
> > + return;
> > + } catch (IOException ioe) {
> > + System.out.println("Caught :" + ioe.getMessage());
> > + ioe.printStackTrace();
> > + return;
> > + } finally {
> > + try {
> > + if (is != null)
> > + is.close();
> > + } catch (IOException ioe) {
> > + }
> > + }
> > + if (filename == null)
> > + return;
> > + else if(!downloaded) {
> > + Logger.error(this, "Can't load the given plugin; giving up");
> > + return;
> > + }
> > + }
> > + }
> > +
> > + pm.startPlugin(filename, true);
> > headers.put("Location", ".");
> > ctx.sendReplyHeaders(302, "Found", headers, null, 0);
> > return;
> > @@ -192,7 +273,7 @@
> > }
> >
> > public void handleGet(URI uri, HTTPRequest request, ToadletContext ctx)
> > - throws ToadletContextClosedException, IOException {
> > + throws ToadletContextClosedException, IOException {
> >
> > //String basepath = "/plugins/";
> > String path = request.getPath();
> > @@ -202,7 +283,7 @@
> > if(path.startsWith("plugins/")) path =
> path.substring("plugins/".length());
> >
> > PluginManager pm = node.pluginManager;
> > -
> > +
> > if(Logger.shouldLog(Logger.MINOR, this))
> > Logger.minor(this, "Pproxy fetching "+path);
> > try {
> > @@ -281,18 +362,18 @@
> > if(pi.isStopping()) {
> > actionCell.addChild("#", l10n("pluginStopping"));
> > } else {
> > - if (pi.isPproxyPlugin()) {
> > - HTMLNode visitForm = actionCell.addChild("form", new String[]
> { "method", "action", "target" }, new String[] { "get",
> pi.getPluginClassName(), "_new" });
> > - visitForm.addChild("input", new String[] { "type", "name", "value" },
> new String[] { "hidden", "formPassword", core.formPassword });
> > - visitForm.addChild("input", new String[] { "type", "value" }, new
> String[] { "submit", L10n.getString("PluginToadlet.visit") });
> > + if (pi.isPproxyPlugin()) {
> > + HTMLNode visitForm = actionCell.addChild("form", new String[]
> { "method", "action", "target" }, new String[] { "get",
> pi.getPluginClassName(), "_new" });
> > + visitForm.addChild("input", new String[]
> { "type", "name", "value" }, new String[] { "hidden", "formPassword",
> core.formPassword });
> > + visitForm.addChild("input", new String[] { "type", "value" }, new
> String[] { "submit", L10n.getString("PluginToadlet.visit") });
> > + }
> > + HTMLNode unloadForm =
> ctx.addFormChild(actionCell, ".", "unloadPluginForm");
> > + unloadForm.addChild("input", new String[]
> { "type", "name", "value" }, new String[] { "hidden", "unload",
> pi.getThreadName() });
> > + unloadForm.addChild("input", new String[] { "type", "value" }, new
> String[] { "submit", l10n("unload") });
> > + HTMLNode reloadForm =
> ctx.addFormChild(actionCell, ".", "reloadPluginForm");
> > + reloadForm.addChild("input", new String[]
> { "type", "name", "value" }, new String[] { "hidden", "reload",
> pi.getThreadName() });
> > + reloadForm.addChild("input", new String[] { "type", "value" }, new
> String[] { "submit", l10n("reload") });
> > }
> > - HTMLNode unloadForm =
> ctx.addFormChild(actionCell, ".", "unloadPluginForm");
> > - unloadForm.addChild("input", new String[] { "type", "name", "value" },
> new String[] { "hidden", "unload", pi.getThreadName() });
> > - unloadForm.addChild("input", new String[] { "type", "value" }, new
> String[] { "submit", l10n("unload") });
> > - HTMLNode reloadForm =
> ctx.addFormChild(actionCell, ".", "reloadPluginForm");
> > - reloadForm.addChild("input", new String[] { "type", "name", "value" },
> new String[] { "hidden", "reload", pi.getThreadName() });
> > - reloadForm.addChild("input", new String[] { "type", "value" }, new
> String[] { "submit", l10n("reload") });
> > - }
> > }
> > }
> >
> >
> > Modified: trunk/freenet/src/freenet/pluginmanager/PluginManager.java
> > ===================================================================
> > --- trunk/freenet/src/freenet/pluginmanager/PluginManager.java 2007-09-13
> 09:08:18 UTC (rev 15134)
> > +++ trunk/freenet/src/freenet/pluginmanager/PluginManager.java 2007-09-13
> 11:24:55 UTC (rev 15135)
> > @@ -4,13 +4,10 @@
> > package freenet.pluginmanager;
> >
> > import java.io.BufferedReader;
> > -import java.io.File;
> > -import java.io.FileNotFoundException;
> > import java.io.IOException;
> > import java.io.InputStream;
> > import java.io.InputStreamReader;
> > import java.net.JarURLConnection;
> > -import java.net.MalformedURLException;
> > import java.net.URI;
> > import java.net.URL;
> > import java.net.URLClassLoader;
> > @@ -34,7 +31,6 @@
> > import freenet.support.URIPreEncoder;
> > import freenet.support.api.HTTPRequest;
> > import freenet.support.api.StringArrCallback;
> > -import freenet.support.io.FileUtil;
> >
> > public class PluginManager {
> >
> > @@ -68,15 +64,15 @@
> > // Start plugins in the config
> > pmconfig.register("loadplugin", null, 9, true,
> false, "PluginManager.loadedOnStartup", "PluginManager.loadedOnStartupLong",
> > new StringArrCallback() {
> > - public String[] get() {
> > - return getConfigLoadString();
> > - }
> > - public void set(String[] val) throws InvalidConfigValueException {
> > - //if(storeDir.equals(new File(val))) return;
> > - // FIXME
> > - throw new
> InvalidConfigValueException(L10n.getString("PluginManager.cannotSetOnceLoaded"));
> > - }
> > - });
> > + public String[] get() {
> > + return getConfigLoadString();
> > + }
> > + public void set(String[] val) throws InvalidConfigValueException {
> > + //if(storeDir.equals(new File(val))) return;
> > + // FIXME
> > + throw new
> InvalidConfigValueException(L10n.getString("PluginManager.cannotSetOnceLoaded"));
> > + }
> > + });
> >
> > String fns[] = pmconfig.getStringArr("loadplugin");
> > if (fns != null) {
> > @@ -93,7 +89,7 @@
> > for (int i = 0 ; i < fns.length ; i++)
> > System.err.println("Load: " + StringArrOption.decode(fns[i]));
> > System.err.println("=================================");
> > - */
> > + */
> > }
> >
> > private String[] getConfigLoadString() {
> > @@ -135,9 +131,9 @@
> > System.err.println("Plugin "+filename+" appears to require a later
> JVM");
> > Logger.error(this, "Plugin "+filename+" appears to require a later
> JVM");
> > core.alerts.register(new SimpleUserAlert(true,
> > - l10n("pluginReqNewerJVMTitle", "name", filename),
> > - l10n("pluginReqNewerJVM", "name", filename),
> > - UserAlert.ERROR));
> > + l10n("pluginReqNewerJVMTitle", "name", filename),
> > + l10n("pluginReqNewerJVM", "name", filename),
> > + UserAlert.ERROR));
> > }
> > }
> > if(store) core.storeConfig();
> > @@ -156,7 +152,7 @@
> > node.ipDetector.registerPortForwardPlugin((FredPluginPortForward) plug);
> > }
> > }
> > -
> > +
> > private String l10n(String key, String pattern, String value) {
> > return L10n.getString("PluginManager."+key, pattern, value);
> > }
> > @@ -178,7 +174,7 @@
> > }
> > core.storeConfig();
> > }
> > -
> > +
> > public void unregisterPluginToadlet(PluginInfoWrapper pi) {
> > synchronized (toadletList) {
> > try {
> > @@ -260,7 +256,7 @@
> > }
> > /*if (handler == null)
> > return null;
> > - */
> > + */
> >
> > if (handler instanceof FredPluginHTTP)
> > return ((FredPluginHTTP)handler).handleHTTPGet(request);
> > @@ -275,7 +271,7 @@
> > }
> > /*if (handler == null)
> > return null;
> > - */
> > + */
> >
> > if (handler instanceof FredPluginHTTP)
> > return ((FredPluginHTTP)handler).handleHTTPPost(request);
> > @@ -310,94 +306,19 @@
> > * @throws PluginNotFoundException If anything goes wrong.
> > */
> > private FredPlugin LoadPlugin(String origFilename)
> > - throws PluginNotFoundException {
> > + throws PluginNotFoundException {
> > logMINOR = Logger.shouldLog(Logger.MINOR, this);
> > Class cls = null;
> > for (int tries = 0; (tries <= 5) && (cls == null); tries++) {
> > String filename = origFilename;
> > + if (filename.endsWith("*")) {
> > + filename = "*@http://downloads.freenetproject.org/alpha/plugins/"
> > + + filename.substring(filename.lastIndexOf(".") + 1,
> > + filename.length() - 1) + ".jar.url";
> > + if (logMINOR)
> > + Logger.minor(this, "Rewritten to " + filename);
> > + }
> > try {
> > - if (filename.endsWith("*")) {
> > - filename = "*@http://downloads.freenetproject.org/alpha/plugins/"
> > - + filename.substring(filename.lastIndexOf(".") + 1,
> > - filename.length() - 1) + ".jar.url";
> > - // System.out.println(filename);
> > - if (logMINOR)
> > - Logger.minor(this, "Rewritten to " + filename);
> > - }
> > - if (filename.endsWith("#")) {
> > - if (filename.indexOf('@') > -1) {
> > - Logger
> > - .error(this,
> > - "We don't allow downloads from anywhere else but our server");
> > - return null;
> > - }
> > - String pluginname = filename.substring(0,
> > - filename.length() - 1);
> > - filename = null;
> > -
> > - URL url;
> > - InputStream is = null;
> > -
> > - try {
> > - url = new URL(
> > - "http://downloads.freenetproject.org/alpha/plugins/"
> > - + pluginname + ".jar.url");
> > - if (logMINOR)
> > - Logger.minor(this, "Downloading " + url);
> > - is = url.openStream();
> > -
> > - File pluginsDirectory = new File("plugins");
> > - if (!pluginsDirectory.exists()) {
> > - Logger
> > - .normal(this,
> > - "The plugin directory hasn't been found, let's create it");
> > - if (!pluginsDirectory.mkdir())
> > - return null;
> > - }
> > -
> > - File finalFile = new File("plugins/" + pluginname
> > - + ".jar");
> > - if (!FileUtil.writeTo(is, finalFile)) {
> > - Logger.error(this,
> > - "Failed to rename the temporary file into "
> > - + finalFile);
> > - throw new PluginNotFoundException(
> > - "Cannot write plugin to "
> > - + finalFile
> > - + " from "
> > - + url
> > - + " - check for permissions problem and disk full!");
> > - }
> > -
> > - filename = "*@file://"
> > - + FileUtil.getCanonicalFile(finalFile);
> > - if (logMINOR)
> > - Logger.minor(this, "Rewritten to " + filename);
> > -
> > - } catch (MalformedURLException mue) {
> > - Logger.error(this,
> > - "MalformedURLException has occured : " + mue,
> > - mue);
> > - return null;
> > - } catch (FileNotFoundException e) {
> > - Logger.error(this,
> > - "FileNotFoundException has occured : " + e, e);
> > - return null;
> > - } catch (IOException ioe) {
> > - System.out.println("Caught :" + ioe.getMessage());
> > - ioe.printStackTrace();
> > - return null;
> > - } finally {
> > - try {
> > - if (is != null)
> > - is.close();
> > - } catch (IOException ioe) {
> > - }
> > - }
> > - if (filename == null)
> > - return null;
> > - }
> > -
> > BufferedReader in = null;
> > InputStream is = null;
> > if ((filename.indexOf("@") >= 0)) {
> > @@ -411,7 +332,7 @@
> > String[] parts = filename.split("@");
> > if (parts.length != 2) {
> > throw new PluginNotFoundException(
> > - "Could not split at \"@\".");
> > + "Could not split at \"@\".");
> > }
> > realClass = parts[0];
> > realURL = parts[1];
> > @@ -431,8 +352,8 @@
> > if (realURL == null)
> > throw new PluginNotFoundException(
> > "Initialization error: "
> > - + url
> > - + " isn't a plugin loading url!");
> > + + url
> > + + " isn't a plugin loading url!");
> > realURL = realURL.trim();
> > if (logMINOR)
> > Logger.minor(this, "Loaded new URL: "
> > @@ -458,7 +379,7 @@
> >
> > URL url = new URL("jar:" + realURL + "!/");
> > JarURLConnection jarConnection = (JarURLConnection) url
> > - .openConnection();
> > + .openConnection();
> > // Java seems to cache even file: urls...
> > jarConnection.setUseCaches(false);
> > JarFile jf = jarConnection.getJarFile();
> > @@ -487,8 +408,8 @@
> > if (logMINOR)
> > Logger.minor(this,
> > "Found plugin main class "
> > - + realClass
> > - + " from manifest");
> > + + realClass
> > + + " from manifest");
> > }
> > }
> > // System.err.println("Real classname: " +
> > @@ -517,7 +438,6 @@
> >
> > if (cls == null)
> > throw new PluginNotFoundException("Unknown error");
> > -
> > } catch (Exception e) {
> > Logger.normal(this, "Failed to load plugin " + filename + " : "
> > + e, e);
> > @@ -548,7 +468,7 @@
> >
> > return (FredPlugin) o;
> > }
> > -
> > +
> > Ticker getTicker() {
> > return node.getTicker();
> > }
> >
> > _______________________________________________
> > cvs mailing list
> > cvs at freenetproject.org
> > http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs
> >
> >
> _______________________________________________
> Devl mailing list
> Devl at freenetproject.org
> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://emu.freenetproject.org/pipermail/devl/attachments/20070914/5d21195d/attachment.pgp
More information about the Devl
mailing list