From 595e43b8a4cecc6f2cd8204e5a7782da1210eba4 Mon Sep 17 00:00:00 2001 From: hankhill19580 Date: Sat, 13 Jul 2019 06:10:30 +0000 Subject: [PATCH] fix the bug where it tries to migrate an already migrated config file, pass around files instead of strings, use the FileSuffixFilter, eliminate irrelevant code --- .../i2p/i2ptunnel/TunnelControllerGroup.java | 137 +++++++++--------- 1 file changed, 65 insertions(+), 72 deletions(-) diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java index 4c0f434b40..c330eeacf4 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java @@ -172,8 +172,7 @@ public class TunnelControllerGroup implements ClientApp { */ public void startup() { List fileList = listFiles(); - for (File afile : fileList) { - String configFile = afile.toString(); + for (File configFile : fileList) { try { _log.logAlways(Log.WARN, "Configuring a tunnel " + configFile); loadControllers(configFile); @@ -278,27 +277,6 @@ public class TunnelControllerGroup implements ClientApp { changeState(STOPPED); } - /** - * Load up all of the tunnels configured in the given file. - * Prior to 0.9.20, also started the tunnels. - * As of 0.9.20, does not start the tunnels, you must call startup() - * or getInstance() instead of loadControllers(). - * - * DEPRECATED for use outside this class. Use startup() or getInstance(). - * - * @throws IllegalArgumentException if unable to load from file - */ - public synchronized void loadControllers(String configFile) { - if (_controllersLoaded) - return; - try { - boolean shouldMigrate = _context.isRouterContext() && !SystemVersion.isAndroid() && !_context.getConfigDir().getCanonicalPath().equals(_context.getBaseDir().getCanonicalPath()); - loadControllers(configFile, shouldMigrate()); - } catch (IOException ioe){ - loadControllers(configFile, false); - } - } - /** * Detects whether a migration to split configuration files should/will/has * happened based on the platform and installation type. Does not tell @@ -321,27 +299,42 @@ public class TunnelControllerGroup implements ClientApp { return false; } + /** + * Load up all of the tunnels configured in the given file. + * Prior to 0.9.20, also started the tunnels. + * As of 0.9.20, does not start the tunnels, you must call startup() + * or getInstance() instead of loadControllers(). + * + * DEPRECATED for use outside this class. Use startup() or getInstance(). + * + * @throws IllegalArgumentException if unable to load from file + */ + public synchronized void loadControllers(File cfgFile) { + if (_controllersLoaded) + return; + + loadControllers(cfgFile, shouldMigrate()); + } + /** * @param shouldMigrate migrate to, and load from, i2ptunnel.config.d * @since 0.9.34 * @throws IllegalArgumentException if unable to load from file */ - private synchronized void loadControllers(String configFile, boolean shouldMigrate) { - File cfgFile = new File(configFile); - if (!cfgFile.isAbsolute()) - cfgFile = new File(_context.getConfigDir(), configFile); + private synchronized void loadControllers(File cfgFile, boolean shouldMigrate) { File dir = new SecureDirectory(cfgFile.getParent(), CONFIG_DIR); List props = null; if (cfgFile.exists()) { try { props = loadConfig(cfgFile); - if (shouldMigrate) { + if (shouldMigrate && !dir.exists()) { boolean ok = migrate(props, cfgFile, dir); if (!ok) shouldMigrate = false; } } catch (IOException ioe) { - _log.error("Unable to load the controllers from " + cfgFile.getAbsolutePath()); + if (_log.shouldLog(Log.ERROR)) + _log.error("Unable to load the controllers from " + cfgFile.getAbsolutePath()); throw new IllegalArgumentException("Unable to load the controllers from " + cfgFile, ioe); } } else if (!shouldMigrate) { @@ -352,29 +345,24 @@ public class TunnelControllerGroup implements ClientApp { try { if (shouldMigrate && dir.isDirectory()) { List fileList = listFiles(); - if (fileList != null && fileList.size() > 0) { - // sort so the returned order is consistent - Collections.sort(fileList); - for (File f : fileList) { - try { - props = loadConfig(f); - if (!props.isEmpty()) { - for (Properties cfg : props) { - String type = cfg.getProperty("type"); - if (type == null) - continue; - TunnelController controller = new TunnelController(cfg, ""); - _controllers.add(controller); - //i++; - } - } else { - _log.error("Error loading the client app properties from " + f); - System.out.println("Error loading the client app properties from " + f); + for (File f : fileList) { + try { + props = loadConfig(f); + if (!props.isEmpty()) { + for (Properties cfg : props) { + String type = cfg.getProperty("type"); + if (type == null) + continue; + TunnelController controller = new TunnelController(cfg, ""); + _controllers.add(controller); } - } catch (IOException ioe) { - _log.error("Error loading the client app properties from " + f + ' '+ ioe); - System.out.println("Error loading the client app properties from " + f + ' ' + ioe); + } else { + if (_log.shouldLog(Log.ERROR)) + _log.error("Error loading the client app properties from " + f); } + } catch (IOException ioe) { + if (_log.shouldLog(Log.ERROR)) + _log.error("Error loading the client app properties from " + f + ' '+ ioe); } } } else { @@ -396,7 +384,7 @@ public class TunnelControllerGroup implements ClientApp { if (i > 0) { _controllersLoaded = true; if (_log.shouldLog(Log.INFO)) - _log.info(i + " controllers loaded from " + configFile); + _log.info(i + " controllers loaded from " + cfgFile); } else { _log.logAlways(Log.WARN, "No i2ptunnel configurations found in " + cfgFile + " or " + dir); } @@ -431,8 +419,8 @@ public class TunnelControllerGroup implements ClientApp { try { DataHelper.storeProps(save, f); } catch (IOException ioe) { - _log.error("Error migrating the i2ptunnel configuration to " + f, ioe); - System.out.println("Error migrating the i2ptunnel configuration to " + f + ' ' + ioe.toString()); + if (_log.shouldLog(Log.ERROR)) + _log.error("Error migrating the i2ptunnel configuration to " + f, ioe); ok = false; } } @@ -482,9 +470,11 @@ public class TunnelControllerGroup implements ClientApp { * @throws IllegalArgumentException if unable to reload config file */ public synchronized void reloadControllers() { - List fileList = listFiles(); unloadControllers(); - loadControllers(_configFile); + File cfgFile = new File(_configFile); + if (!cfgFile.isAbsolute()) + cfgFile = new File(_context.getConfigDir(), _configFile); + loadControllers(cfgFile); startControllers(); } @@ -787,14 +777,10 @@ public class TunnelControllerGroup implements ClientApp { File folder = new File(_configDirectory); if (!folder.isAbsolute()) folder = new File(_context.getConfigDir(), _configDirectory); - File[] listOfFiles = folder.listFiles(); + File[] listOfFiles = folder.listFiles(new FileSuffixFilter(".config")); List files = new ArrayList(); - if (listOfFiles != null && listOfFiles.length > 0) { - for (File afile : listOfFiles) { - if (afile.isFile() && afile.exists() && afile.getName().endsWith(".config")) { - files.add(afile); - } - } + for (File afile : listOfFiles) { + files.add(afile); } Collections.sort(files); return files; @@ -882,24 +868,30 @@ public class TunnelControllerGroup implements ClientApp { * @return list of TunnelController objects * @throws IllegalArgumentException if unable to load config from file */ - public List getControllers() { + public List getControllers() { List _tempControllers = new ArrayList(); - _tempControllers.addAll(getControllers(_configFile)); + File cfgFile = new File(_configFile); + if (!cfgFile.isAbsolute()) + cfgFile = new File(_context.getConfigDir(), _configFile); + _tempControllers.addAll(getControllers(cfgFile)); return _tempControllers; } - /** + * Retrieve a list of tunnels known. * + * Side effect: if the tunnels have not been loaded from config yet, they + * will be. * - * - * - */ - public List getControllers(String configFile) { - _log.logAlways(Log.WARN, "Getting controllers from config file " + configFile); + * @return list of TunnelController objects + * @throws IllegalArgumentException if unable to load config from file + */ + public List getControllers(File cfgFile) { + _log.logAlways(Log.WARN, "Getting controllers from config file " + cfgFile); + synchronized (this) { if (!_controllersLoaded) - loadControllers(configFile); + loadControllers(cfgFile); } _controllersLock.readLock().lock(); @@ -965,7 +957,8 @@ public class TunnelControllerGroup implements ClientApp { if (_log.shouldLog(Log.INFO)) _log.info("Session destroyed: " + session); } catch (I2PSessionException ise) { - _log.error("Error closing the client session", ise); + if (_log.shouldLog(Log.ERROR)) + _log.error("Error closing the client session", ise); } } }