Ejemplo n.º 1
0
 /**
  *  Parse the installed (not the temp) news file for the latest version.
  *  TODO: Real XML parsing
  *  TODO: Check minVersion, use backup URLs specified
  */
 void checkForUpdates() {
     FileInputStream in = null;
     try {
         in = new FileInputStream(_newsFile);
         StringBuilder buf = new StringBuilder(128);
         while (DataHelper.readLine(in, buf)) {
             int index = buf.indexOf(VERSION_PREFIX);
             if (index >= 0) {
                 Map<String, String> args = parseArgs(buf.substring(index+VERSION_PREFIX.length()));
                 String ver = args.get(VERSION_KEY);
                 if (ver != null) {
                     if (_log.shouldLog(Log.DEBUG))
                         _log.debug("Found version: [" + ver + "]");
                     if (TrustedUpdate.needsUpdate(RouterVersion.VERSION, ver)) {
                         if (NewsHelper.isUpdateDisabled(_context)) {
                             String msg = _mgr._("In-network updates disabled. Check package manager.");
                             _log.logAlways(Log.WARN, "Cannot update to version " + ver + ": " + msg);
                             _mgr.notifyVersionConstraint(this, _currentURI, ROUTER_SIGNED, "", ver, msg);
                             return;
                         }
                         if (NewsHelper.isBaseReadonly(_context)) {
                             String msg = _mgr._("No write permission for I2P install directory.");
                             _log.logAlways(Log.WARN, "Cannot update to version " + ver + ": " + msg);
                             _mgr.notifyVersionConstraint(this, _currentURI, ROUTER_SIGNED, "", ver, msg);
                             return;
                         }
                         String minRouter = args.get(MIN_VERSION_KEY);
                         if (minRouter != null) {
                             if (VersionComparator.comp(RouterVersion.VERSION, minRouter) < 0) {
                                 String msg = _mgr._("You must first update to version {0}", minRouter);
                                 _log.logAlways(Log.WARN, "Cannot update to version " + ver + ": " + msg);
                                 _mgr.notifyVersionConstraint(this, _currentURI, ROUTER_SIGNED, "", ver, msg);
                                 return;
                             }
                         }
                         String minJava = args.get(MIN_JAVA_VERSION_KEY);
                         if (minJava != null) {
                             String ourJava = System.getProperty("java.version");
                             if (VersionComparator.comp(ourJava, minJava) < 0) {
                                 String msg = _mgr._("Requires Java version {0} but installed Java version is {1}", minJava, ourJava);
                                 _log.logAlways(Log.WARN, "Cannot update to version " + ver + ": " + msg);
                                 _mgr.notifyVersionConstraint(this, _currentURI, ROUTER_SIGNED, "", ver, msg);
                                 return;
                             }
                         }
                         if (_log.shouldLog(Log.DEBUG))
                             _log.debug("Our version is out of date, update!");
                         // TODO if minversion > our version, continue
                         // and look for a second entry with clearnet URLs
                         // TODO clearnet URLs, notify with HTTP_CLEARNET and/or HTTPS_CLEARNET
                         Map<UpdateMethod, List<URI>> sourceMap = new HashMap<UpdateMethod, List<URI>>(4);
                         // Must do su3 first
                         if (ConfigUpdateHandler.USE_SU3_UPDATE) {
                             sourceMap.put(HTTP, _mgr.getUpdateURLs(ROUTER_SIGNED_SU3, "", HTTP));
                             addMethod(TORRENT, args.get(SU3_KEY), sourceMap);
                             addMethod(HTTP_CLEARNET, args.get(CLEARNET_HTTP_SU3_KEY), sourceMap);
                             addMethod(HTTPS_CLEARNET, args.get(CLEARNET_HTTPS_SU3_KEY), sourceMap);
                             // notify about all sources at once
                             _mgr.notifyVersionAvailable(this, _currentURI, ROUTER_SIGNED_SU3,
                                                         "", sourceMap, ver, "");
                             sourceMap.clear();
                         }
                         // now do sud/su2
                         sourceMap.put(HTTP, _mgr.getUpdateURLs(ROUTER_SIGNED, "", HTTP));
                         String key = FileUtil.isPack200Supported() ? SU2_KEY : SUD_KEY;
                         addMethod(TORRENT, args.get(key), sourceMap);
                         // notify about all sources at once
                         _mgr.notifyVersionAvailable(this, _currentURI, ROUTER_SIGNED,
                                                     "", sourceMap, ver, "");
                     } else {
                         if (_log.shouldLog(Log.DEBUG))
                             _log.debug("Our version is current");
                     }
                     return;
                 } else {
                     if (_log.shouldLog(Log.WARN))
                         _log.warn("No version in " + buf.toString());
                 }
             } else {
                 if (_log.shouldLog(Log.DEBUG))
                     _log.debug("No match in " + buf.toString());
             }
             buf.setLength(0);
         }
     } catch (IOException ioe) {
         if (_log.shouldLog(Log.WARN))
             _log.warn("Error checking the news for an update", ioe);
         return;
     } finally {
         if (in != null) try { in.close(); } catch (IOException ioe) {}
     }
     
     if (_log.shouldLog(Log.WARN))
         _log.warn("No version found in news.xml file");
 }