2008-06-16 12:31:14 +00:00
|
|
|
package net.i2p.router.web;
|
|
|
|
|
2009-06-15 15:32:27 +00:00
|
|
|
import java.io.File;
|
Big refactor of the router console update subsystem, in preparation for
implementing out-of-console updaters like i2psnark.
- Add new update interfaces in net.i2p.update
- All update implementations moved to routerconsole update/
- Implement an UpdateManager that registers with the RouterContext
- UpdateManager handles multiple types of things to update
(router, plugins, news, ...) and methods of updating (HTTP, ...)
- UpdateManager maintains list of installed, downloaded, and available versions of everything
- Define Updaters that can check for a new version and/or download an item
- Individual Updaters register with the UpdateManager obtained from
I2PAppContext, identifying the type of update item and
update method they can handle.
- Updaters need only core libs, no router.jar or routerconsole access required.
- All checks and updates are initiated via the UpdateManager.
- All status on checks and updates in-progress or completed are
obtained from the UpdateManager. No more use of System properties
to broadcast update state.
- All update and checker tasks are intantiated on demand and threaded;
no more static references left over.
- Split out the Runners and Checkers from the Handlers and make the inheritance more sane.
- No more permanent NewsFetcher thread; run on the SimpleScheduler queue
and thread a checker task only to fetch the news.
- No more static NewsFetcher instance in routerconsole.
All helper methods that are still required are moved to NewsHelper.
The UpdateManager implements the policy for when to check and download.
All requests go through the UpdateManager.
For each update type, there's several parts:
- The xxxUpdateHandler implements the Updater
- The xxxUpdateChecker implements the UpdateTask for checking
- The xxxUpdateRunner implements the UpdateTask for downloading
New and moved classes:
web/ update/
---- -------
new ConsoleUpdateManager.java
new PluginUpdateChecker.java from PluginUpdateChecker
PluginUpdateChecker -> PluginUpdateHandler.java
PluginUpdateHandler.java -> PluginUpdateRunner
new UnsignedUpdateHandler.java
UnsignedUpdateHandler -> UnsignedUpdateRunner.java
new UnsignedUpdateChecker from NewsFetcher
UpdateHandler.java remains
new UpdateHandler.java
new UpdateRunner.java from UpdateHandler
move NewsHandler from NewsFetcher
new NewsFetcher
new NewsTimerTask
new DummyHandler
Initial checkin. Unfinished, untested, unpolished.
2012-06-18 22:09:45 +00:00
|
|
|
import java.net.URI;
|
|
|
|
import java.net.URISyntaxException;
|
2008-06-16 12:31:14 +00:00
|
|
|
import java.util.HashMap;
|
2008-06-17 13:48:41 +00:00
|
|
|
import java.util.Iterator;
|
|
|
|
import java.util.List;
|
2011-11-28 20:32:23 +00:00
|
|
|
import java.util.Locale;
|
2008-06-16 12:31:14 +00:00
|
|
|
import java.util.Map;
|
2008-06-17 13:48:41 +00:00
|
|
|
import java.util.Properties;
|
|
|
|
import java.util.Set;
|
|
|
|
|
2010-12-24 16:52:23 +00:00
|
|
|
import net.i2p.router.client.ClientManagerFacadeImpl;
|
2008-06-17 13:48:41 +00:00
|
|
|
import net.i2p.router.startup.ClientAppConfig;
|
2008-06-20 20:20:50 +00:00
|
|
|
import net.i2p.router.startup.LoadClientAppsJob;
|
Big refactor of the router console update subsystem, in preparation for
implementing out-of-console updaters like i2psnark.
- Add new update interfaces in net.i2p.update
- All update implementations moved to routerconsole update/
- Implement an UpdateManager that registers with the RouterContext
- UpdateManager handles multiple types of things to update
(router, plugins, news, ...) and methods of updating (HTTP, ...)
- UpdateManager maintains list of installed, downloaded, and available versions of everything
- Define Updaters that can check for a new version and/or download an item
- Individual Updaters register with the UpdateManager obtained from
I2PAppContext, identifying the type of update item and
update method they can handle.
- Updaters need only core libs, no router.jar or routerconsole access required.
- All checks and updates are initiated via the UpdateManager.
- All status on checks and updates in-progress or completed are
obtained from the UpdateManager. No more use of System properties
to broadcast update state.
- All update and checker tasks are intantiated on demand and threaded;
no more static references left over.
- Split out the Runners and Checkers from the Handlers and make the inheritance more sane.
- No more permanent NewsFetcher thread; run on the SimpleScheduler queue
and thread a checker task only to fetch the news.
- No more static NewsFetcher instance in routerconsole.
All helper methods that are still required are moved to NewsHelper.
The UpdateManager implements the policy for when to check and download.
All requests go through the UpdateManager.
For each update type, there's several parts:
- The xxxUpdateHandler implements the Updater
- The xxxUpdateChecker implements the UpdateTask for checking
- The xxxUpdateRunner implements the UpdateTask for downloading
New and moved classes:
web/ update/
---- -------
new ConsoleUpdateManager.java
new PluginUpdateChecker.java from PluginUpdateChecker
PluginUpdateChecker -> PluginUpdateHandler.java
PluginUpdateHandler.java -> PluginUpdateRunner
new UnsignedUpdateHandler.java
UnsignedUpdateHandler -> UnsignedUpdateRunner.java
new UnsignedUpdateChecker from NewsFetcher
UpdateHandler.java remains
new UpdateHandler.java
new UpdateRunner.java from UpdateHandler
move NewsHandler from NewsFetcher
new NewsFetcher
new NewsTimerTask
new DummyHandler
Initial checkin. Unfinished, untested, unpolished.
2012-06-18 22:09:45 +00:00
|
|
|
import net.i2p.router.update.ConsoleUpdateManager;
|
|
|
|
import static net.i2p.update.UpdateType.*;
|
2008-06-16 12:31:14 +00:00
|
|
|
|
2011-12-23 00:56:48 +00:00
|
|
|
import org.mortbay.jetty.handler.ContextHandlerCollection;
|
2008-06-20 20:20:50 +00:00
|
|
|
|
2008-06-16 12:31:14 +00:00
|
|
|
/**
|
2008-06-17 13:48:41 +00:00
|
|
|
* Saves changes to clients.config or webapps.config
|
2008-06-16 12:31:14 +00:00
|
|
|
*/
|
|
|
|
public class ConfigClientsHandler extends FormHandler {
|
|
|
|
|
2009-08-15 16:08:33 +00:00
|
|
|
@Override
|
2008-06-16 12:31:14 +00:00
|
|
|
protected void processForm() {
|
2010-03-29 21:20:48 +00:00
|
|
|
// set action for when CR is hit in a text input box
|
|
|
|
if (_action.length() <= 0) {
|
|
|
|
String url = getJettyString("pluginURL");
|
|
|
|
if (url != null && url.length() > 0)
|
|
|
|
_action = "Install Plugin";
|
|
|
|
else
|
|
|
|
_action = "Save Client Configuration";
|
|
|
|
}
|
|
|
|
|
2009-10-26 10:53:53 +00:00
|
|
|
if (_action.equals(_("Save Client Configuration"))) {
|
2008-06-17 13:48:41 +00:00
|
|
|
saveClientChanges();
|
2009-10-28 18:26:50 +00:00
|
|
|
return;
|
|
|
|
}
|
2010-12-24 16:52:23 +00:00
|
|
|
if (_action.equals(_("Save Interface Configuration"))) {
|
|
|
|
saveInterfaceChanges();
|
|
|
|
return;
|
|
|
|
}
|
2009-10-28 18:26:50 +00:00
|
|
|
if (_action.equals(_("Save WebApp Configuration"))) {
|
2008-06-17 13:48:41 +00:00
|
|
|
saveWebAppChanges();
|
2009-10-28 18:26:50 +00:00
|
|
|
return;
|
|
|
|
}
|
2010-02-10 19:09:35 +00:00
|
|
|
if (_action.equals(_("Save Plugin Configuration"))) {
|
|
|
|
savePluginChanges();
|
|
|
|
return;
|
|
|
|
}
|
2010-02-06 20:25:13 +00:00
|
|
|
if (_action.equals(_("Install Plugin"))) {
|
|
|
|
installPlugin();
|
|
|
|
return;
|
|
|
|
}
|
2012-01-15 21:15:08 +00:00
|
|
|
if (_action.equals(_("Update All Installed Plugins"))) {
|
|
|
|
updateAllPlugins();
|
|
|
|
return;
|
|
|
|
}
|
2009-10-28 18:26:50 +00:00
|
|
|
// value
|
|
|
|
if (_action.startsWith("Start ")) {
|
2008-06-20 20:20:50 +00:00
|
|
|
String app = _action.substring(6);
|
|
|
|
int appnum = -1;
|
|
|
|
try {
|
|
|
|
appnum = Integer.parseInt(app);
|
|
|
|
} catch (NumberFormatException nfe) {}
|
2010-02-17 18:12:46 +00:00
|
|
|
if (appnum >= 0) {
|
2008-06-20 20:20:50 +00:00
|
|
|
startClient(appnum);
|
2010-02-17 18:12:46 +00:00
|
|
|
} else {
|
|
|
|
List<String> plugins = PluginStarter.getPlugins();
|
|
|
|
if (plugins.contains(app))
|
|
|
|
startPlugin(app);
|
|
|
|
else
|
|
|
|
startWebApp(app);
|
|
|
|
}
|
2009-10-28 18:26:50 +00:00
|
|
|
return;
|
|
|
|
}
|
2010-01-06 21:24:08 +00:00
|
|
|
|
|
|
|
// value
|
|
|
|
if (_action.startsWith("Delete ")) {
|
|
|
|
String app = _action.substring(7);
|
|
|
|
int appnum = -1;
|
|
|
|
try {
|
|
|
|
appnum = Integer.parseInt(app);
|
|
|
|
} catch (NumberFormatException nfe) {}
|
2010-02-10 19:09:35 +00:00
|
|
|
if (appnum >= 0) {
|
2010-01-06 21:24:08 +00:00
|
|
|
deleteClient(appnum);
|
2010-02-10 19:09:35 +00:00
|
|
|
} else {
|
|
|
|
try {
|
|
|
|
PluginStarter.stopPlugin(_context, app);
|
2012-03-19 01:46:47 +00:00
|
|
|
} catch (ClassNotFoundException cnfe) {
|
|
|
|
// don't complain here. Some plugins need to be ran to be deleted.
|
|
|
|
// I tried to check to see if the plugin was ran elsewhere,
|
|
|
|
// and it sait it was when it was not. -- Sponge
|
|
|
|
} catch (Throwable e) {
|
|
|
|
addFormError(_("Error stopping plugin {0}", app) + ": " + e);
|
|
|
|
_log.error("Error stopping plugin " + app, e);
|
|
|
|
}
|
|
|
|
try {
|
2010-02-11 19:18:26 +00:00
|
|
|
PluginStarter.deletePlugin(_context, app);
|
|
|
|
addFormNotice(_("Deleted plugin {0}", app));
|
2010-02-11 21:41:54 +00:00
|
|
|
} catch (Throwable e) {
|
2010-02-11 19:18:26 +00:00
|
|
|
addFormError(_("Error deleting plugin {0}", app) + ": " + e);
|
2010-02-11 21:41:54 +00:00
|
|
|
_log.error("Error deleting plugin " + app, e);
|
2010-02-11 19:18:26 +00:00
|
|
|
}
|
2010-02-10 19:09:35 +00:00
|
|
|
}
|
2010-01-06 21:24:08 +00:00
|
|
|
return;
|
|
|
|
}
|
2010-02-10 19:09:35 +00:00
|
|
|
|
|
|
|
// value
|
|
|
|
if (_action.startsWith("Stop ")) {
|
2011-06-01 03:59:12 +00:00
|
|
|
|
2010-02-10 19:09:35 +00:00
|
|
|
String app = _action.substring(5);
|
2011-06-01 03:59:12 +00:00
|
|
|
int appnum = -1;
|
2010-02-10 19:09:35 +00:00
|
|
|
try {
|
2011-06-01 03:59:12 +00:00
|
|
|
appnum = Integer.parseInt(app);
|
|
|
|
} catch (NumberFormatException nfe) {}
|
|
|
|
if (appnum >= 0) {
|
|
|
|
stopClient(appnum);
|
|
|
|
} else {
|
|
|
|
try {
|
|
|
|
PluginStarter.stopPlugin(_context, app);
|
|
|
|
addFormNotice(_("Stopped plugin {0}", app));
|
|
|
|
} catch (Throwable e) {
|
|
|
|
addFormError(_("Error stopping plugin {0}", app) + ": " + e);
|
2010-02-11 21:41:54 +00:00
|
|
|
_log.error("Error stopping plugin " + app, e);
|
2011-06-01 03:59:12 +00:00
|
|
|
}
|
2010-02-11 21:41:54 +00:00
|
|
|
}
|
2010-02-10 19:09:35 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// value
|
|
|
|
if (_action.startsWith("Update ")) {
|
|
|
|
String app = _action.substring(7);
|
|
|
|
updatePlugin(app);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// value
|
|
|
|
if (_action.startsWith("Check ")) {
|
|
|
|
String app = _action.substring(6);
|
|
|
|
checkPlugin(app);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2009-10-28 18:26:50 +00:00
|
|
|
// label (IE)
|
|
|
|
String xStart = _("Start");
|
2011-11-28 20:32:23 +00:00
|
|
|
if (_action.toLowerCase(Locale.US).startsWith(xStart + "<span class=hide> ") &&
|
|
|
|
_action.toLowerCase(Locale.US).endsWith("</span>")) {
|
2009-04-03 21:33:35 +00:00
|
|
|
// IE sucks
|
2009-10-28 18:26:50 +00:00
|
|
|
String app = _action.substring(xStart.length() + 18, _action.length() - 7);
|
2009-04-03 21:33:35 +00:00
|
|
|
int appnum = -1;
|
|
|
|
try {
|
|
|
|
appnum = Integer.parseInt(app);
|
|
|
|
} catch (NumberFormatException nfe) {}
|
2010-02-17 18:12:46 +00:00
|
|
|
if (appnum >= 0) {
|
2009-04-03 21:33:35 +00:00
|
|
|
startClient(appnum);
|
2010-02-17 18:12:46 +00:00
|
|
|
} else {
|
|
|
|
List<String> plugins = PluginStarter.getPlugins();
|
|
|
|
if (plugins.contains(app))
|
|
|
|
startPlugin(app);
|
|
|
|
else
|
|
|
|
startWebApp(app);
|
|
|
|
}
|
2008-06-16 12:31:14 +00:00
|
|
|
} else {
|
2009-10-28 18:26:50 +00:00
|
|
|
addFormError(_("Unsupported") + ' ' + _action + '.');
|
2008-06-16 12:31:14 +00:00
|
|
|
}
|
2010-02-10 19:09:35 +00:00
|
|
|
|
2008-06-16 12:31:14 +00:00
|
|
|
}
|
|
|
|
|
2008-06-17 13:48:41 +00:00
|
|
|
private void saveClientChanges() {
|
2010-01-06 21:24:08 +00:00
|
|
|
List<ClientAppConfig> clients = ClientAppConfig.getClientApps(_context);
|
2008-06-17 13:48:41 +00:00
|
|
|
for (int cur = 0; cur < clients.size(); cur++) {
|
2010-01-06 21:24:08 +00:00
|
|
|
ClientAppConfig ca = clients.get(cur);
|
2008-06-17 13:48:41 +00:00
|
|
|
Object val = _settings.get(cur + ".enabled");
|
2009-10-28 18:26:50 +00:00
|
|
|
if (! ("webConsole".equals(ca.clientName) || "Web console".equals(ca.clientName)))
|
2008-06-17 13:48:41 +00:00
|
|
|
ca.disabled = val == null;
|
2010-01-06 21:24:08 +00:00
|
|
|
// edit of an existing entry
|
2012-01-20 01:18:46 +00:00
|
|
|
String desc = getJettyString("desc" + cur);
|
2010-01-06 21:24:08 +00:00
|
|
|
if (desc != null) {
|
|
|
|
int spc = desc.indexOf(" ");
|
|
|
|
String clss = desc;
|
|
|
|
String args = null;
|
|
|
|
if (spc >= 0) {
|
|
|
|
clss = desc.substring(0, spc);
|
|
|
|
args = desc.substring(spc + 1);
|
|
|
|
}
|
|
|
|
ca.className = clss;
|
|
|
|
ca.args = args;
|
2010-03-05 14:44:50 +00:00
|
|
|
ca.clientName = getJettyString("name" + cur);
|
2010-01-06 21:24:08 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int newClient = clients.size();
|
2012-01-20 01:18:46 +00:00
|
|
|
String newDesc = getJettyString("desc" + newClient);
|
2010-01-18 14:51:39 +00:00
|
|
|
if (newDesc != null && newDesc.trim().length() > 0) {
|
2010-01-06 21:24:08 +00:00
|
|
|
// new entry
|
|
|
|
int spc = newDesc.indexOf(" ");
|
|
|
|
String clss = newDesc;
|
|
|
|
String args = null;
|
|
|
|
if (spc >= 0) {
|
|
|
|
clss = newDesc.substring(0, spc);
|
|
|
|
args = newDesc.substring(spc + 1);
|
|
|
|
}
|
2010-03-05 14:44:50 +00:00
|
|
|
String name = getJettyString("name" + newClient);
|
2010-01-18 14:51:39 +00:00
|
|
|
if (name == null || name.trim().length() <= 0) name = "new client";
|
2010-01-06 21:24:08 +00:00
|
|
|
ClientAppConfig ca = new ClientAppConfig(clss, name, args, 2*60*1000,
|
|
|
|
_settings.get(newClient + ".enabled") != null);
|
|
|
|
clients.add(ca);
|
|
|
|
addFormNotice(_("New client added") + ": " + name + " (" + clss + ").");
|
2008-06-17 13:48:41 +00:00
|
|
|
}
|
2010-01-06 21:24:08 +00:00
|
|
|
|
2008-06-17 13:48:41 +00:00
|
|
|
ClientAppConfig.writeClientAppConfig(_context, clients);
|
2012-10-13 21:20:16 +00:00
|
|
|
addFormNotice(_("Client configuration saved successfully"));
|
|
|
|
addFormNotice(_("Restart required to take effect"));
|
2010-01-06 21:24:08 +00:00
|
|
|
}
|
|
|
|
|
2011-06-01 03:59:12 +00:00
|
|
|
// STUB for stopClient, not completed yet.
|
|
|
|
private void stopClient(int i) {
|
|
|
|
List<ClientAppConfig> clients = ClientAppConfig.getClientApps(_context);
|
|
|
|
if (i >= clients.size()) {
|
|
|
|
addFormError(_("Bad client index."));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
ClientAppConfig ca = clients.get(i);
|
|
|
|
//
|
|
|
|
// What do we do here?
|
|
|
|
//
|
|
|
|
addFormNotice(_("Client") + ' ' + _(ca.clientName) + ' ' + _("stopped") + '.');
|
|
|
|
}
|
|
|
|
|
2008-06-20 20:20:50 +00:00
|
|
|
private void startClient(int i) {
|
2010-01-06 21:24:08 +00:00
|
|
|
List<ClientAppConfig> clients = ClientAppConfig.getClientApps(_context);
|
2008-06-20 20:20:50 +00:00
|
|
|
if (i >= clients.size()) {
|
2009-10-26 10:53:53 +00:00
|
|
|
addFormError(_("Bad client index."));
|
2008-06-20 20:20:50 +00:00
|
|
|
return;
|
|
|
|
}
|
2010-01-06 21:24:08 +00:00
|
|
|
ClientAppConfig ca = clients.get(i);
|
2012-10-13 12:51:24 +00:00
|
|
|
LoadClientAppsJob.runClient(ca.className, ca.clientName, LoadClientAppsJob.parseArgs(ca.args), _context, _log);
|
2009-10-28 18:26:50 +00:00
|
|
|
addFormNotice(_("Client") + ' ' + _(ca.clientName) + ' ' + _("started") + '.');
|
2008-06-20 20:20:50 +00:00
|
|
|
}
|
|
|
|
|
2010-01-06 21:24:08 +00:00
|
|
|
private void deleteClient(int i) {
|
|
|
|
List<ClientAppConfig> clients = ClientAppConfig.getClientApps(_context);
|
|
|
|
if (i < 0 || i >= clients.size()) {
|
|
|
|
addFormError(_("Bad client index."));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
ClientAppConfig ca = clients.remove(i);
|
|
|
|
ClientAppConfig.writeClientAppConfig(_context, clients);
|
|
|
|
addFormNotice(_("Client") + ' ' + _(ca.clientName) + ' ' + _("deleted") + '.');
|
|
|
|
}
|
|
|
|
|
2008-06-17 13:48:41 +00:00
|
|
|
private void saveWebAppChanges() {
|
2012-10-13 13:06:22 +00:00
|
|
|
Properties props = RouterConsoleRunner.webAppProperties(_context);
|
2008-06-17 13:48:41 +00:00
|
|
|
Set keys = props.keySet();
|
|
|
|
for (Iterator iter = keys.iterator(); iter.hasNext(); ) {
|
|
|
|
String name = (String)iter.next();
|
|
|
|
if (! (name.startsWith(RouterConsoleRunner.PREFIX) && name.endsWith(RouterConsoleRunner.ENABLED)))
|
|
|
|
continue;
|
|
|
|
String app = name.substring(RouterConsoleRunner.PREFIX.length(), name.lastIndexOf(RouterConsoleRunner.ENABLED));
|
|
|
|
Object val = _settings.get(app + ".enabled");
|
|
|
|
if (! RouterConsoleRunner.ROUTERCONSOLE.equals(app))
|
|
|
|
props.setProperty(name, "" + (val != null));
|
2008-06-16 12:31:14 +00:00
|
|
|
}
|
2012-10-13 13:06:22 +00:00
|
|
|
RouterConsoleRunner.storeWebAppProperties(_context, props);
|
2010-02-10 19:09:35 +00:00
|
|
|
addFormNotice(_("WebApp configuration saved."));
|
|
|
|
}
|
|
|
|
|
|
|
|
private void savePluginChanges() {
|
|
|
|
Properties props = PluginStarter.pluginProperties();
|
|
|
|
Set keys = props.keySet();
|
|
|
|
for (Iterator iter = keys.iterator(); iter.hasNext(); ) {
|
|
|
|
String name = (String)iter.next();
|
|
|
|
if (! (name.startsWith(PluginStarter.PREFIX) && name.endsWith(PluginStarter.ENABLED)))
|
|
|
|
continue;
|
|
|
|
String app = name.substring(PluginStarter.PREFIX.length(), name.lastIndexOf(PluginStarter.ENABLED));
|
|
|
|
Object val = _settings.get(app + ".enabled");
|
|
|
|
props.setProperty(name, "" + (val != null));
|
|
|
|
}
|
|
|
|
PluginStarter.storePluginProperties(props);
|
|
|
|
addFormNotice(_("Plugin configuration saved."));
|
2008-06-16 12:31:14 +00:00
|
|
|
}
|
2008-06-20 20:20:50 +00:00
|
|
|
|
2010-02-07 13:32:49 +00:00
|
|
|
/**
|
|
|
|
* Big hack for the moment, not using properties for directory and port
|
|
|
|
* Go through all the Jetty servers, find the one serving port 7657,
|
|
|
|
* requested and add the .war to that one
|
|
|
|
*/
|
2008-06-20 20:20:50 +00:00
|
|
|
private void startWebApp(String app) {
|
2011-12-23 00:56:48 +00:00
|
|
|
ContextHandlerCollection s = WebAppStarter.getConsoleServer();
|
2010-02-07 13:32:49 +00:00
|
|
|
if (s != null) {
|
2008-06-20 20:20:50 +00:00
|
|
|
try {
|
2009-06-15 15:32:27 +00:00
|
|
|
File path = new File(_context.getBaseDir(), "webapps");
|
|
|
|
path = new File(path, app + ".war");
|
2010-02-06 20:25:13 +00:00
|
|
|
WebAppStarter.startWebApp(_context, s, app, path.getAbsolutePath());
|
2009-10-28 18:26:50 +00:00
|
|
|
addFormNotice(_("WebApp") + " <a href=\"/" + app + "/\">" + _(app) + "</a> " + _("started") + '.');
|
2010-02-11 21:41:54 +00:00
|
|
|
} catch (Throwable e) {
|
|
|
|
addFormError(_("Failed to start") + ' ' + _(app) + " " + e + '.');
|
|
|
|
_log.error("Failed to start webapp " + app, e);
|
2008-06-20 20:20:50 +00:00
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
2009-10-26 10:53:53 +00:00
|
|
|
addFormError(_("Failed to find server."));
|
2008-06-20 20:20:50 +00:00
|
|
|
}
|
2010-02-06 20:25:13 +00:00
|
|
|
|
|
|
|
private void installPlugin() {
|
2010-03-05 14:44:50 +00:00
|
|
|
String url = getJettyString("pluginURL");
|
2010-02-06 20:25:13 +00:00
|
|
|
if (url == null || url.length() <= 0) {
|
|
|
|
addFormError(_("No plugin URL specified."));
|
|
|
|
return;
|
|
|
|
}
|
2012-10-21 17:14:54 +00:00
|
|
|
installPlugin(null, url);
|
2010-02-10 19:09:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
private void updatePlugin(String app) {
|
|
|
|
Properties props = PluginStarter.pluginProperties(_context, app);
|
|
|
|
String url = props.getProperty("updateURL");
|
|
|
|
if (url == null) {
|
|
|
|
addFormError(_("No update URL specified for {0}",app));
|
|
|
|
return;
|
|
|
|
}
|
2012-10-21 17:14:54 +00:00
|
|
|
installPlugin(app, url);
|
2010-02-10 19:09:35 +00:00
|
|
|
}
|
|
|
|
|
2012-01-15 21:15:08 +00:00
|
|
|
/** @since 0.8.13 */
|
|
|
|
private void updateAllPlugins() {
|
Big refactor of the router console update subsystem, in preparation for
implementing out-of-console updaters like i2psnark.
- Add new update interfaces in net.i2p.update
- All update implementations moved to routerconsole update/
- Implement an UpdateManager that registers with the RouterContext
- UpdateManager handles multiple types of things to update
(router, plugins, news, ...) and methods of updating (HTTP, ...)
- UpdateManager maintains list of installed, downloaded, and available versions of everything
- Define Updaters that can check for a new version and/or download an item
- Individual Updaters register with the UpdateManager obtained from
I2PAppContext, identifying the type of update item and
update method they can handle.
- Updaters need only core libs, no router.jar or routerconsole access required.
- All checks and updates are initiated via the UpdateManager.
- All status on checks and updates in-progress or completed are
obtained from the UpdateManager. No more use of System properties
to broadcast update state.
- All update and checker tasks are intantiated on demand and threaded;
no more static references left over.
- Split out the Runners and Checkers from the Handlers and make the inheritance more sane.
- No more permanent NewsFetcher thread; run on the SimpleScheduler queue
and thread a checker task only to fetch the news.
- No more static NewsFetcher instance in routerconsole.
All helper methods that are still required are moved to NewsHelper.
The UpdateManager implements the policy for when to check and download.
All requests go through the UpdateManager.
For each update type, there's several parts:
- The xxxUpdateHandler implements the Updater
- The xxxUpdateChecker implements the UpdateTask for checking
- The xxxUpdateRunner implements the UpdateTask for downloading
New and moved classes:
web/ update/
---- -------
new ConsoleUpdateManager.java
new PluginUpdateChecker.java from PluginUpdateChecker
PluginUpdateChecker -> PluginUpdateHandler.java
PluginUpdateHandler.java -> PluginUpdateRunner
new UnsignedUpdateHandler.java
UnsignedUpdateHandler -> UnsignedUpdateRunner.java
new UnsignedUpdateChecker from NewsFetcher
UpdateHandler.java remains
new UpdateHandler.java
new UpdateRunner.java from UpdateHandler
move NewsHandler from NewsFetcher
new NewsFetcher
new NewsTimerTask
new DummyHandler
Initial checkin. Unfinished, untested, unpolished.
2012-06-18 22:09:45 +00:00
|
|
|
if (NewsHelper.isAnyUpdateInProgress()) {
|
2012-01-18 01:55:53 +00:00
|
|
|
addFormError(_("Plugin or update download already in progress."));
|
|
|
|
return;
|
|
|
|
}
|
2012-01-15 21:15:08 +00:00
|
|
|
addFormNotice(_("Updating all plugins"));
|
|
|
|
PluginStarter.updateAll(_context);
|
|
|
|
// So that update() will post a status to the summary bar before we reload
|
|
|
|
try {
|
|
|
|
Thread.sleep(1000);
|
|
|
|
} catch (InterruptedException ie) {}
|
|
|
|
}
|
|
|
|
|
2012-10-21 17:14:54 +00:00
|
|
|
/**
|
|
|
|
* @param app null for a new install
|
|
|
|
*/
|
|
|
|
private void installPlugin(String app, String url) {
|
Big refactor of the router console update subsystem, in preparation for
implementing out-of-console updaters like i2psnark.
- Add new update interfaces in net.i2p.update
- All update implementations moved to routerconsole update/
- Implement an UpdateManager that registers with the RouterContext
- UpdateManager handles multiple types of things to update
(router, plugins, news, ...) and methods of updating (HTTP, ...)
- UpdateManager maintains list of installed, downloaded, and available versions of everything
- Define Updaters that can check for a new version and/or download an item
- Individual Updaters register with the UpdateManager obtained from
I2PAppContext, identifying the type of update item and
update method they can handle.
- Updaters need only core libs, no router.jar or routerconsole access required.
- All checks and updates are initiated via the UpdateManager.
- All status on checks and updates in-progress or completed are
obtained from the UpdateManager. No more use of System properties
to broadcast update state.
- All update and checker tasks are intantiated on demand and threaded;
no more static references left over.
- Split out the Runners and Checkers from the Handlers and make the inheritance more sane.
- No more permanent NewsFetcher thread; run on the SimpleScheduler queue
and thread a checker task only to fetch the news.
- No more static NewsFetcher instance in routerconsole.
All helper methods that are still required are moved to NewsHelper.
The UpdateManager implements the policy for when to check and download.
All requests go through the UpdateManager.
For each update type, there's several parts:
- The xxxUpdateHandler implements the Updater
- The xxxUpdateChecker implements the UpdateTask for checking
- The xxxUpdateRunner implements the UpdateTask for downloading
New and moved classes:
web/ update/
---- -------
new ConsoleUpdateManager.java
new PluginUpdateChecker.java from PluginUpdateChecker
PluginUpdateChecker -> PluginUpdateHandler.java
PluginUpdateHandler.java -> PluginUpdateRunner
new UnsignedUpdateHandler.java
UnsignedUpdateHandler -> UnsignedUpdateRunner.java
new UnsignedUpdateChecker from NewsFetcher
UpdateHandler.java remains
new UpdateHandler.java
new UpdateRunner.java from UpdateHandler
move NewsHandler from NewsFetcher
new NewsFetcher
new NewsTimerTask
new DummyHandler
Initial checkin. Unfinished, untested, unpolished.
2012-06-18 22:09:45 +00:00
|
|
|
ConsoleUpdateManager mgr = (ConsoleUpdateManager) _context.updateManager();
|
|
|
|
if (mgr == null) {
|
|
|
|
addFormError("Update manager not registered, cannot install");
|
2010-02-06 20:25:13 +00:00
|
|
|
return;
|
|
|
|
}
|
Big refactor of the router console update subsystem, in preparation for
implementing out-of-console updaters like i2psnark.
- Add new update interfaces in net.i2p.update
- All update implementations moved to routerconsole update/
- Implement an UpdateManager that registers with the RouterContext
- UpdateManager handles multiple types of things to update
(router, plugins, news, ...) and methods of updating (HTTP, ...)
- UpdateManager maintains list of installed, downloaded, and available versions of everything
- Define Updaters that can check for a new version and/or download an item
- Individual Updaters register with the UpdateManager obtained from
I2PAppContext, identifying the type of update item and
update method they can handle.
- Updaters need only core libs, no router.jar or routerconsole access required.
- All checks and updates are initiated via the UpdateManager.
- All status on checks and updates in-progress or completed are
obtained from the UpdateManager. No more use of System properties
to broadcast update state.
- All update and checker tasks are intantiated on demand and threaded;
no more static references left over.
- Split out the Runners and Checkers from the Handlers and make the inheritance more sane.
- No more permanent NewsFetcher thread; run on the SimpleScheduler queue
and thread a checker task only to fetch the news.
- No more static NewsFetcher instance in routerconsole.
All helper methods that are still required are moved to NewsHelper.
The UpdateManager implements the policy for when to check and download.
All requests go through the UpdateManager.
For each update type, there's several parts:
- The xxxUpdateHandler implements the Updater
- The xxxUpdateChecker implements the UpdateTask for checking
- The xxxUpdateRunner implements the UpdateTask for downloading
New and moved classes:
web/ update/
---- -------
new ConsoleUpdateManager.java
new PluginUpdateChecker.java from PluginUpdateChecker
PluginUpdateChecker -> PluginUpdateHandler.java
PluginUpdateHandler.java -> PluginUpdateRunner
new UnsignedUpdateHandler.java
UnsignedUpdateHandler -> UnsignedUpdateRunner.java
new UnsignedUpdateChecker from NewsFetcher
UpdateHandler.java remains
new UpdateHandler.java
new UpdateRunner.java from UpdateHandler
move NewsHandler from NewsFetcher
new NewsFetcher
new NewsTimerTask
new DummyHandler
Initial checkin. Unfinished, untested, unpolished.
2012-06-18 22:09:45 +00:00
|
|
|
if (mgr.isUpdateInProgress()) {
|
2010-02-06 20:25:13 +00:00
|
|
|
addFormError(_("Plugin or update download already in progress."));
|
|
|
|
return;
|
|
|
|
}
|
Big refactor of the router console update subsystem, in preparation for
implementing out-of-console updaters like i2psnark.
- Add new update interfaces in net.i2p.update
- All update implementations moved to routerconsole update/
- Implement an UpdateManager that registers with the RouterContext
- UpdateManager handles multiple types of things to update
(router, plugins, news, ...) and methods of updating (HTTP, ...)
- UpdateManager maintains list of installed, downloaded, and available versions of everything
- Define Updaters that can check for a new version and/or download an item
- Individual Updaters register with the UpdateManager obtained from
I2PAppContext, identifying the type of update item and
update method they can handle.
- Updaters need only core libs, no router.jar or routerconsole access required.
- All checks and updates are initiated via the UpdateManager.
- All status on checks and updates in-progress or completed are
obtained from the UpdateManager. No more use of System properties
to broadcast update state.
- All update and checker tasks are intantiated on demand and threaded;
no more static references left over.
- Split out the Runners and Checkers from the Handlers and make the inheritance more sane.
- No more permanent NewsFetcher thread; run on the SimpleScheduler queue
and thread a checker task only to fetch the news.
- No more static NewsFetcher instance in routerconsole.
All helper methods that are still required are moved to NewsHelper.
The UpdateManager implements the policy for when to check and download.
All requests go through the UpdateManager.
For each update type, there's several parts:
- The xxxUpdateHandler implements the Updater
- The xxxUpdateChecker implements the UpdateTask for checking
- The xxxUpdateRunner implements the UpdateTask for downloading
New and moved classes:
web/ update/
---- -------
new ConsoleUpdateManager.java
new PluginUpdateChecker.java from PluginUpdateChecker
PluginUpdateChecker -> PluginUpdateHandler.java
PluginUpdateHandler.java -> PluginUpdateRunner
new UnsignedUpdateHandler.java
UnsignedUpdateHandler -> UnsignedUpdateRunner.java
new UnsignedUpdateChecker from NewsFetcher
UpdateHandler.java remains
new UpdateHandler.java
new UpdateRunner.java from UpdateHandler
move NewsHandler from NewsFetcher
new NewsFetcher
new NewsTimerTask
new DummyHandler
Initial checkin. Unfinished, untested, unpolished.
2012-06-18 22:09:45 +00:00
|
|
|
URI uri;
|
|
|
|
try {
|
|
|
|
uri = new URI(url);
|
|
|
|
} catch (URISyntaxException use) {
|
|
|
|
addFormError(_("Bad URL {0}", url));
|
|
|
|
return;
|
|
|
|
}
|
2012-10-21 17:14:54 +00:00
|
|
|
if (mgr.installPlugin(app, uri))
|
Big refactor of the router console update subsystem, in preparation for
implementing out-of-console updaters like i2psnark.
- Add new update interfaces in net.i2p.update
- All update implementations moved to routerconsole update/
- Implement an UpdateManager that registers with the RouterContext
- UpdateManager handles multiple types of things to update
(router, plugins, news, ...) and methods of updating (HTTP, ...)
- UpdateManager maintains list of installed, downloaded, and available versions of everything
- Define Updaters that can check for a new version and/or download an item
- Individual Updaters register with the UpdateManager obtained from
I2PAppContext, identifying the type of update item and
update method they can handle.
- Updaters need only core libs, no router.jar or routerconsole access required.
- All checks and updates are initiated via the UpdateManager.
- All status on checks and updates in-progress or completed are
obtained from the UpdateManager. No more use of System properties
to broadcast update state.
- All update and checker tasks are intantiated on demand and threaded;
no more static references left over.
- Split out the Runners and Checkers from the Handlers and make the inheritance more sane.
- No more permanent NewsFetcher thread; run on the SimpleScheduler queue
and thread a checker task only to fetch the news.
- No more static NewsFetcher instance in routerconsole.
All helper methods that are still required are moved to NewsHelper.
The UpdateManager implements the policy for when to check and download.
All requests go through the UpdateManager.
For each update type, there's several parts:
- The xxxUpdateHandler implements the Updater
- The xxxUpdateChecker implements the UpdateTask for checking
- The xxxUpdateRunner implements the UpdateTask for downloading
New and moved classes:
web/ update/
---- -------
new ConsoleUpdateManager.java
new PluginUpdateChecker.java from PluginUpdateChecker
PluginUpdateChecker -> PluginUpdateHandler.java
PluginUpdateHandler.java -> PluginUpdateRunner
new UnsignedUpdateHandler.java
UnsignedUpdateHandler -> UnsignedUpdateRunner.java
new UnsignedUpdateChecker from NewsFetcher
UpdateHandler.java remains
new UpdateHandler.java
new UpdateRunner.java from UpdateHandler
move NewsHandler from NewsFetcher
new NewsFetcher
new NewsTimerTask
new DummyHandler
Initial checkin. Unfinished, untested, unpolished.
2012-06-18 22:09:45 +00:00
|
|
|
addFormNotice(_("Downloading plugin from {0}", url));
|
|
|
|
else
|
|
|
|
addFormError("Cannot install, check logs");
|
2010-02-06 20:25:13 +00:00
|
|
|
// So that update() will post a status to the summary bar before we reload
|
|
|
|
try {
|
|
|
|
Thread.sleep(1000);
|
|
|
|
} catch (InterruptedException ie) {}
|
|
|
|
}
|
2010-02-10 19:09:35 +00:00
|
|
|
|
|
|
|
private void checkPlugin(String app) {
|
Big refactor of the router console update subsystem, in preparation for
implementing out-of-console updaters like i2psnark.
- Add new update interfaces in net.i2p.update
- All update implementations moved to routerconsole update/
- Implement an UpdateManager that registers with the RouterContext
- UpdateManager handles multiple types of things to update
(router, plugins, news, ...) and methods of updating (HTTP, ...)
- UpdateManager maintains list of installed, downloaded, and available versions of everything
- Define Updaters that can check for a new version and/or download an item
- Individual Updaters register with the UpdateManager obtained from
I2PAppContext, identifying the type of update item and
update method they can handle.
- Updaters need only core libs, no router.jar or routerconsole access required.
- All checks and updates are initiated via the UpdateManager.
- All status on checks and updates in-progress or completed are
obtained from the UpdateManager. No more use of System properties
to broadcast update state.
- All update and checker tasks are intantiated on demand and threaded;
no more static references left over.
- Split out the Runners and Checkers from the Handlers and make the inheritance more sane.
- No more permanent NewsFetcher thread; run on the SimpleScheduler queue
and thread a checker task only to fetch the news.
- No more static NewsFetcher instance in routerconsole.
All helper methods that are still required are moved to NewsHelper.
The UpdateManager implements the policy for when to check and download.
All requests go through the UpdateManager.
For each update type, there's several parts:
- The xxxUpdateHandler implements the Updater
- The xxxUpdateChecker implements the UpdateTask for checking
- The xxxUpdateRunner implements the UpdateTask for downloading
New and moved classes:
web/ update/
---- -------
new ConsoleUpdateManager.java
new PluginUpdateChecker.java from PluginUpdateChecker
PluginUpdateChecker -> PluginUpdateHandler.java
PluginUpdateHandler.java -> PluginUpdateRunner
new UnsignedUpdateHandler.java
UnsignedUpdateHandler -> UnsignedUpdateRunner.java
new UnsignedUpdateChecker from NewsFetcher
UpdateHandler.java remains
new UpdateHandler.java
new UpdateRunner.java from UpdateHandler
move NewsHandler from NewsFetcher
new NewsFetcher
new NewsTimerTask
new DummyHandler
Initial checkin. Unfinished, untested, unpolished.
2012-06-18 22:09:45 +00:00
|
|
|
ConsoleUpdateManager mgr = (ConsoleUpdateManager) _context.updateManager();
|
|
|
|
if (mgr == null) {
|
|
|
|
addFormError("Update manager not registered, cannot check");
|
2010-02-10 19:09:35 +00:00
|
|
|
return;
|
|
|
|
}
|
Big refactor of the router console update subsystem, in preparation for
implementing out-of-console updaters like i2psnark.
- Add new update interfaces in net.i2p.update
- All update implementations moved to routerconsole update/
- Implement an UpdateManager that registers with the RouterContext
- UpdateManager handles multiple types of things to update
(router, plugins, news, ...) and methods of updating (HTTP, ...)
- UpdateManager maintains list of installed, downloaded, and available versions of everything
- Define Updaters that can check for a new version and/or download an item
- Individual Updaters register with the UpdateManager obtained from
I2PAppContext, identifying the type of update item and
update method they can handle.
- Updaters need only core libs, no router.jar or routerconsole access required.
- All checks and updates are initiated via the UpdateManager.
- All status on checks and updates in-progress or completed are
obtained from the UpdateManager. No more use of System properties
to broadcast update state.
- All update and checker tasks are intantiated on demand and threaded;
no more static references left over.
- Split out the Runners and Checkers from the Handlers and make the inheritance more sane.
- No more permanent NewsFetcher thread; run on the SimpleScheduler queue
and thread a checker task only to fetch the news.
- No more static NewsFetcher instance in routerconsole.
All helper methods that are still required are moved to NewsHelper.
The UpdateManager implements the policy for when to check and download.
All requests go through the UpdateManager.
For each update type, there's several parts:
- The xxxUpdateHandler implements the Updater
- The xxxUpdateChecker implements the UpdateTask for checking
- The xxxUpdateRunner implements the UpdateTask for downloading
New and moved classes:
web/ update/
---- -------
new ConsoleUpdateManager.java
new PluginUpdateChecker.java from PluginUpdateChecker
PluginUpdateChecker -> PluginUpdateHandler.java
PluginUpdateHandler.java -> PluginUpdateRunner
new UnsignedUpdateHandler.java
UnsignedUpdateHandler -> UnsignedUpdateRunner.java
new UnsignedUpdateChecker from NewsFetcher
UpdateHandler.java remains
new UpdateHandler.java
new UpdateRunner.java from UpdateHandler
move NewsHandler from NewsFetcher
new NewsFetcher
new NewsTimerTask
new DummyHandler
Initial checkin. Unfinished, untested, unpolished.
2012-06-18 22:09:45 +00:00
|
|
|
mgr.check(PLUGIN, app);
|
2010-02-10 19:09:35 +00:00
|
|
|
addFormNotice(_("Checking plugin {0} for updates", app));
|
|
|
|
// So that update() will post a status to the summary bar before we reload
|
|
|
|
try {
|
|
|
|
Thread.sleep(1000);
|
|
|
|
} catch (InterruptedException ie) {}
|
|
|
|
}
|
|
|
|
|
2010-02-17 18:12:46 +00:00
|
|
|
private void startPlugin(String app) {
|
|
|
|
try {
|
|
|
|
PluginStarter.startPlugin(_context, app);
|
|
|
|
addFormNotice(_("Started plugin {0}", app));
|
|
|
|
} catch (Throwable e) {
|
|
|
|
addFormError(_("Error starting plugin {0}", app) + ": " + e);
|
|
|
|
_log.error("Error starting plugin " + app, e);
|
|
|
|
}
|
|
|
|
}
|
2010-12-24 16:52:23 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Handle interface form
|
|
|
|
* @since 0.8.3
|
|
|
|
*/
|
|
|
|
private void saveInterfaceChanges() {
|
2012-01-18 01:55:53 +00:00
|
|
|
Map<String, String> changes = new HashMap();
|
2010-12-24 16:52:23 +00:00
|
|
|
String port = getJettyString("port");
|
|
|
|
if (port != null)
|
2012-01-18 01:55:53 +00:00
|
|
|
changes.put(ClientManagerFacadeImpl.PROP_CLIENT_PORT, port);
|
2010-12-24 16:52:23 +00:00
|
|
|
String intfc = getJettyString("interface");
|
|
|
|
if (intfc != null)
|
2012-01-18 01:55:53 +00:00
|
|
|
changes.put(ClientManagerFacadeImpl.PROP_CLIENT_HOST, intfc);
|
2010-12-24 16:52:23 +00:00
|
|
|
String user = getJettyString("user");
|
|
|
|
String pw = getJettyString("pw");
|
2012-10-13 22:42:26 +00:00
|
|
|
if (user != null && pw != null && user.length() > 0 && pw.length() > 0) {
|
|
|
|
ConsolePasswordManager mgr = new ConsolePasswordManager(_context);
|
|
|
|
mgr.saveHash(ConfigClientsHelper.PROP_AUTH, user, pw);
|
|
|
|
addFormNotice(_("Added user {0}", user));
|
|
|
|
}
|
2010-12-24 16:52:23 +00:00
|
|
|
String mode = getJettyString("mode");
|
|
|
|
boolean disabled = "0".equals(mode);
|
|
|
|
boolean ssl = "2".equals(mode);
|
2012-01-18 01:55:53 +00:00
|
|
|
changes.put(ConfigClientsHelper.PROP_DISABLE_EXTERNAL,
|
2010-12-24 16:52:23 +00:00
|
|
|
Boolean.toString(disabled));
|
2012-01-18 01:55:53 +00:00
|
|
|
changes.put(ConfigClientsHelper.PROP_ENABLE_SSL,
|
2010-12-24 16:52:23 +00:00
|
|
|
Boolean.toString(ssl));
|
2012-01-18 01:55:53 +00:00
|
|
|
changes.put(ConfigClientsHelper.PROP_AUTH,
|
2010-12-24 16:52:23 +00:00
|
|
|
Boolean.toString((_settings.get("auth") != null)));
|
|
|
|
boolean all = "0.0.0.0".equals(intfc) || "0:0:0:0:0:0:0:0".equals(intfc) ||
|
|
|
|
"::".equals(intfc);
|
2012-01-18 01:55:53 +00:00
|
|
|
changes.put(ConfigClientsHelper.BIND_ALL_INTERFACES, Boolean.toString(all));
|
2012-10-13 21:20:16 +00:00
|
|
|
if (_context.router().saveConfig(changes, null)) {
|
|
|
|
addFormNotice(_("Interface configuration saved"));
|
|
|
|
addFormNotice(_("Restart required to take effect"));
|
|
|
|
} else
|
2012-01-18 01:55:53 +00:00
|
|
|
addFormError(_("Error saving the configuration (applied but not saved) - please see the error logs"));
|
2010-12-24 16:52:23 +00:00
|
|
|
}
|
2008-06-16 12:31:14 +00:00
|
|
|
}
|