package net.i2p.router.update; import java.io.ByteArrayInputStream; import java.io.File; import java.net.URI; import java.util.List; import net.i2p.crypto.TrustedUpdate; import net.i2p.router.RouterContext; import net.i2p.router.RouterVersion; import net.i2p.router.web.ConfigUpdateHandler; import net.i2p.update.*; import net.i2p.util.Log; import net.i2p.util.PartialEepGet; import net.i2p.util.PortMapper; import net.i2p.util.SystemVersion; import net.i2p.util.VersionComparator; /** * Check for an updated su3 version. * * Take the update URL * then fetch the first 56 bytes of the URL, extract the version, * and compare to current full router version. * * @since 0.9.20 from PluginUpdateChecker */ class DevSU3UpdateChecker extends UpdateRunner { public DevSU3UpdateChecker(RouterContext ctx, ConsoleUpdateManager mgr, List<URI> uris) { super(ctx, mgr, UpdateType.ROUTER_DEV_SU3, uris, RouterVersion.FULL_VERSION); if (!uris.isEmpty()) _currentURI = uris.get(0); } @Override protected void update() { // must be set for super _isPartial = true; // use the same settings as for updater // always proxy, or else FIXME //boolean shouldProxy = Boolean.valueOf(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY)).booleanValue(); String proxyHost = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_HOST, ConfigUpdateHandler.DEFAULT_PROXY_HOST); int proxyPort = ConfigUpdateHandler.proxyPort(_context); if (proxyPort == ConfigUpdateHandler.DEFAULT_PROXY_PORT_INT && proxyHost.equals(ConfigUpdateHandler.DEFAULT_PROXY_HOST) && _context.portMapper().getPort(PortMapper.SVC_HTTP_PROXY) < 0) { String msg = _t("HTTP client proxy tunnel must be running"); if (_log.shouldWarn()) _log.warn(msg); updateStatus("<b>" + msg + "</b>"); _mgr.notifyCheckComplete(this, false, false); return; } //updateStatus("<b>" + _t("Checking for development build update") + "</b>"); _baos.reset(); try { _get = new PartialEepGet(_context, proxyHost, proxyPort, _baos, _currentURI.toString(), TrustedUpdate.HEADER_BYTES); _get.addStatusListener(this); _get.fetch(CONNECT_TIMEOUT); } catch (Throwable t) { _log.error("Error fetching the update", t); } } @Override public void bytesTransferred(long alreadyTransferred, int currentWrite, long bytesTransferred, long bytesRemaining, String url) { } @Override public void transferComplete(long alreadyTransferred, long bytesTransferred, long bytesRemaining, String url, String outputFile, boolean notModified) { String newVersion = TrustedUpdate.getVersionString(new ByteArrayInputStream(_baos.toByteArray())); boolean newer = VersionComparator.comp(newVersion, RouterVersion.FULL_VERSION) > 0; if (newer) { if (SystemVersion.isJava7()) { _mgr.notifyVersionAvailable(this, _currentURI, UpdateType.ROUTER_DEV_SU3, "", UpdateMethod.HTTP, _urls, newVersion, RouterVersion.FULL_VERSION); } else { String ourJava = System.getProperty("java.version"); String msg = _mgr._t("Requires Java version {0} but installed Java version is {1}", "1.7", ourJava); _log.logAlways(Log.WARN, "Cannot update to version " + newVersion + ": " + msg); _mgr.notifyVersionConstraint(this, _currentURI, UpdateType.ROUTER_DEV_SU3, "", newVersion, msg); } } else { //updateStatus("<b>" + _t("No new version found at {0}", linkify(url)) + "</b>"); if (_log.shouldWarn()) _log.warn("Found old version \"" + newVersion + "\" at " + url); } _mgr.notifyCheckComplete(this, newer, true); } @Override public void transferFailed(String url, long bytesTransferred, long bytesRemaining, int currentAttempt) { File f = new File(_updateFile); f.delete(); _mgr.notifyCheckComplete(this, false, false); } }