diff --git a/openvidu-server/src/main/java/io/openvidu/server/config/OpenviduConfig.java b/openvidu-server/src/main/java/io/openvidu/server/config/OpenviduConfig.java index 9d78cdfc..1431e541 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/config/OpenviduConfig.java +++ b/openvidu-server/src/main/java/io/openvidu/server/config/OpenviduConfig.java @@ -394,8 +394,13 @@ public class OpenviduConfig { Gson gson = new Gson(); JsonArray kmsUrisArray = gson.fromJson(kmsUris, JsonArray.class); this.kmsUrisList = JsonUtils.toStringList(kmsUrisArray); - for (String uri : kmsUrisList) { - this.checkWebsocketUri(uri); + if (kmsUrisList.size() == 1 && kmsUrisList.get(0).isEmpty()) { + log.warn("Array kms.uris is empty"); + this.kmsUrisList = new ArrayList<>(); + } else { + for (String uri : kmsUrisList) { + this.checkWebsocketUri(uri); + } } } diff --git a/openvidu-server/src/main/java/io/openvidu/server/kurento/kms/FixedOneKmsManager.java b/openvidu-server/src/main/java/io/openvidu/server/kurento/kms/FixedOneKmsManager.java index 5adba598..cc6c89b1 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/kurento/kms/FixedOneKmsManager.java +++ b/openvidu-server/src/main/java/io/openvidu/server/kurento/kms/FixedOneKmsManager.java @@ -26,7 +26,7 @@ import org.kurento.commons.exception.KurentoException; public class FixedOneKmsManager extends KmsManager { @Override - public List initializeKurentoClients(List kmsUris) throws Exception { + public List initializeKurentoClients(List kmsUris, boolean disconnectUponFailure) throws Exception { final String kmsUri = kmsUris.get(0); KurentoClient kClient = null; Kms kms = new Kms(kmsUri, loadManager); @@ -35,6 +35,9 @@ public class FixedOneKmsManager extends KmsManager { kClient = KurentoClient.create(kmsUri, this.generateKurentoConnectionListener(kms.getId())); } catch (KurentoException e) { log.error("KMS in {} is not reachable by OpenVidu Server", kmsUri); + if (kClient != null) { + kClient.destroy(); + } throw new Exception(); } diff --git a/openvidu-server/src/main/java/io/openvidu/server/kurento/kms/KmsManager.java b/openvidu-server/src/main/java/io/openvidu/server/kurento/kms/KmsManager.java index dfd6a177..634df2c5 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/kurento/kms/KmsManager.java +++ b/openvidu-server/src/main/java/io/openvidu/server/kurento/kms/KmsManager.java @@ -183,12 +183,13 @@ public abstract class KmsManager { }; } - public abstract List initializeKurentoClients(List kmsUris) throws Exception; + public abstract List initializeKurentoClients(List kmsUris, boolean disconnectUponFailure) + throws Exception; @PostConstruct private void postConstruct() { try { - this.initializeKurentoClients(this.openviduConfig.getKmsUris()); + this.initializeKurentoClients(this.openviduConfig.getKmsUris(), true); } catch (Exception e) { // Some KMS wasn't reachable log.error("Shutting down OpenVidu Server"); diff --git a/openvidu-server/src/main/java/io/openvidu/server/recording/service/RecordingManager.java b/openvidu-server/src/main/java/io/openvidu/server/recording/service/RecordingManager.java index 5419feb5..427ce76c 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/recording/service/RecordingManager.java +++ b/openvidu-server/src/main/java/io/openvidu/server/recording/service/RecordingManager.java @@ -428,8 +428,8 @@ public class RecordingManager { } public String getRecordingUrl(Recording recording) { - return openviduConfig.getFinalUrl() + "recordings/" + recording.getId() + "/" - + recording.getName() + "." + this.getExtensionFromRecording(recording); + return openviduConfig.getFinalUrl() + "recordings/" + recording.getId() + "/" + recording.getName() + "." + + this.getExtensionFromRecording(recording); } private String getExtensionFromRecording(Recording recording) { @@ -574,56 +574,62 @@ public class RecordingManager { final String testFilePath = testFolderPath + "/TEST_RECORDING_PATH.webm"; // Check Kurento Media Server write permissions in recording path - MediaPipeline pipeline = this.kmsManager.getLessLoadedKms().getKurentoClient().createMediaPipeline(); - RecorderEndpoint recorder = new RecorderEndpoint.Builder(pipeline, "file://" + testFilePath).build(); + if (this.openviduConfig.getKmsUris().isEmpty()) { + log.warn("No KMSs were defined in kms.uris array. Recording path check aborted"); + } else { - final AtomicBoolean kurentoRecorderError = new AtomicBoolean(false); + MediaPipeline pipeline = this.kmsManager.getLessLoadedKms().getKurentoClient().createMediaPipeline(); + RecorderEndpoint recorder = new RecorderEndpoint.Builder(pipeline, "file://" + testFilePath).build(); - recorder.addErrorListener(new EventListener() { - @Override - public void onEvent(ErrorEvent event) { - if (event.getErrorCode() == 6) { - // KMS write permissions error - kurentoRecorderError.compareAndSet(false, true); + final AtomicBoolean kurentoRecorderError = new AtomicBoolean(false); + + recorder.addErrorListener(new EventListener() { + @Override + public void onEvent(ErrorEvent event) { + if (event.getErrorCode() == 6) { + // KMS write permissions error + kurentoRecorderError.compareAndSet(false, true); + } } + }); + + recorder.record(); + + try { + // Give the error event some time to trigger if necessary + Thread.sleep(500); + } catch (InterruptedException e1) { + e1.printStackTrace(); } - }); - recorder.record(); + if (kurentoRecorderError.get()) { + String errorMessage = "The recording path \"" + openviduRecordingPath + + "\" is not valid. Reason: Kurento Media Server needs write permissions. Try running command \"sudo chmod 777 " + + openviduRecordingPath + "\""; + log.error(errorMessage); + throw new OpenViduException(Code.RECORDING_PATH_NOT_VALID, errorMessage); + } - try { - // Give the error event some time to trigger if necessary - Thread.sleep(500); - } catch (InterruptedException e1) { - e1.printStackTrace(); - } + recorder.stop(); + recorder.release(); + pipeline.release(); - if (kurentoRecorderError.get()) { - String errorMessage = "The recording path \"" + openviduRecordingPath - + "\" is not valid. Reason: Kurento Media Server needs write permissions. Try running command \"sudo chmod 777 " - + openviduRecordingPath + "\""; - log.error(errorMessage); - throw new OpenViduException(Code.RECORDING_PATH_NOT_VALID, errorMessage); - } + log.info("Kurento Media Server has write permissions on recording path: {}", openviduRecordingPath); - recorder.stop(); - recorder.release(); - pipeline.release(); - - log.info("Kurento Media Server has write permissions on recording path: {}", openviduRecordingPath); - - try { - new CustomFileManager().deleteFolder(testFolderPath); - log.info("OpenVidu Server has write permissions over files created by Kurento Media Server"); - } catch (IOException e) { - String errorMessage = "The recording path \"" + openviduRecordingPath - + "\" is not valid. Reason: OpenVidu Server does not have write permissions over files created by Kurento Media Server. " - + "Try running Kurento Media Server as user \"" + System.getProperty("user.name") - + "\" or run OpenVidu Server as superuser"; - log.error(errorMessage); - log.error("Be aware that a folder \"{}\" was created and should be manually deleted (\"sudo rm -rf {}\")", - testFolderPath, testFolderPath); - throw new OpenViduException(Code.RECORDING_PATH_NOT_VALID, errorMessage); + try { + new CustomFileManager().deleteFolder(testFolderPath); + log.info("OpenVidu Server has write permissions over files created by Kurento Media Server"); + } catch (IOException e) { + String errorMessage = "The recording path \"" + openviduRecordingPath + + "\" is not valid. Reason: OpenVidu Server does not have write permissions over files created by Kurento Media Server. " + + "Try running Kurento Media Server as user \"" + System.getProperty("user.name") + + "\" or run OpenVidu Server as superuser"; + log.error(errorMessage); + log.error( + "Be aware that a folder \"{}\" was created and should be manually deleted (\"sudo rm -rf {}\")", + testFolderPath, testFolderPath); + throw new OpenViduException(Code.RECORDING_PATH_NOT_VALID, errorMessage); + } } if (openviduConfig.openviduRecordingCustomLayoutChanged(openviduRecordingCustomLayout)) { diff --git a/openvidu-server/src/main/java/io/openvidu/server/utils/DockerManager.java b/openvidu-server/src/main/java/io/openvidu/server/utils/DockerManager.java index 3f8cb237..3423ec87 100644 --- a/openvidu-server/src/main/java/io/openvidu/server/utils/DockerManager.java +++ b/openvidu-server/src/main/java/io/openvidu/server/utils/DockerManager.java @@ -208,6 +208,17 @@ public class DockerManager { } } + public List getRunningContainers(String fullImageName) { + List containerIds = new ArrayList<>(); + List existingContainers = this.dockerClient.listContainersCmd().exec(); + for (Container container : existingContainers) { + if (container.getImage().startsWith(fullImageName)) { + containerIds.add(container.getId()); + } + } + return containerIds; + } + static public String getDockerGatewayIp() { try { return CommandExecutor.execCommand("/bin/sh", "-c",