diff --git a/photon-core/src/main/java/org/photonvision/common/networking/NetworkUtils.java b/photon-core/src/main/java/org/photonvision/common/networking/NetworkUtils.java index ac3e29326..584c4be5e 100644 --- a/photon-core/src/main/java/org/photonvision/common/networking/NetworkUtils.java +++ b/photon-core/src/main/java/org/photonvision/common/networking/NetworkUtils.java @@ -82,23 +82,48 @@ public class NetworkUtils { private static List allInterfaces = null; private static long lastReadTimestamp = 0; + private static long timeout = 5000; // milliseconds + private static long retry = 500; // milliseconds - public static List getAllInterfaces() { - long now = System.currentTimeMillis(); - if (now - lastReadTimestamp < 5000) return allInterfaces; - else lastReadTimestamp = now; - + public static synchronized List getAllInterfaces() { + var start = System.currentTimeMillis(); + if (start - lastReadTimestamp < 5000) { + return allInterfaces; + } var ret = new ArrayList(); if (Platform.isLinux()) { String out = null; try { var shell = new ShellExec(true, false); - shell.executeBashCommand( - "nmcli -t -f GENERAL.CONNECTION,GENERAL.DEVICE,GENERAL.TYPE device show", true, false); - out = shell.getOutput(); + boolean networkManagerRunning = false; + boolean tryagain = true; + + do { + shell.executeBashCommand( + "nmcli -t -f GENERAL.CONNECTION,GENERAL.DEVICE,GENERAL.TYPE device show", true, true); + // nmcli returns an error of 8 if NetworkManager isn't running + networkManagerRunning = shell.getExitCode() != 8; + tryagain = System.currentTimeMillis() - start < timeout; + if (!networkManagerRunning && tryagain) { + logger.debug("NetworkManager not running, retrying in " + (retry) + " milliseconds"); + Thread.sleep(retry); + } + } while (!networkManagerRunning && tryagain); + + timeout = 0; // only try once after the first time + + if (networkManagerRunning) { + out = shell.getOutput(); + } else { + logger.error( + "Timed out trying to reach NetworkManager, may not be able to configure networking"); + } + } catch (IOException e) { logger.error("IO Exception occured when calling nmcli to get network interfaces!", e); + } catch (InterruptedException e) { + logger.error("Interrupted while waiting for NetworkManager", e); } if (out != null) { Pattern pattern = @@ -120,6 +145,8 @@ public class NetworkUtils { } allInterfaces = ret; } + lastReadTimestamp = System.currentTimeMillis(); + return ret; } diff --git a/photon-server/src/main/java/org/photonvision/Main.java b/photon-server/src/main/java/org/photonvision/Main.java index c11bc0203..6191fa501 100644 --- a/photon-server/src/main/java/org/photonvision/Main.java +++ b/photon-server/src/main/java/org/photonvision/Main.java @@ -276,10 +276,6 @@ public class Main { ConfigManager.getInstance().load(); // init config manager ConfigManager.getInstance().requestSave(); - logger.debug("Loading HardwareManager..."); - // Force load the hardware manager - HardwareManager.getInstance(); - logger.info("Loading ML models..."); var modelManager = NeuralNetworkModelManager.getInstance(); modelManager.extractModels(); @@ -293,6 +289,10 @@ public class Main { .setConfig(ConfigManager.getInstance().getConfig().getNetworkConfig()); NetworkTablesManager.getInstance().registerTimedTasks(); + logger.debug("Loading HardwareManager..."); + // Force load the hardware manager + HardwareManager.getInstance(); + if (isSmoketest) { logger.info("PhotonVision base functionality loaded -- smoketest complete"); System.exit(0);