From 091d43fef5f8e88c7081340138eb1bb33c5862a2 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sat, 9 Dec 2023 09:40:19 +0100 Subject: [PATCH] Improve initialisation --- .../src/org/argeo/cms/jshell/CmsJShell.java | 23 +++++++++++++++++-- .../src/org/argeo/cms/ssh/CmsSshServer.java | 5 +++- .../cms/internal/runtime/CmsContextImpl.java | 14 +++++++++-- .../internal/runtime/CmsDeploymentImpl.java | 8 +++---- 4 files changed, 41 insertions(+), 9 deletions(-) diff --git a/org.argeo.cms.jshell/src/org/argeo/cms/jshell/CmsJShell.java b/org.argeo.cms.jshell/src/org/argeo/cms/jshell/CmsJShell.java index d84ce7212..d9d7d7995 100644 --- a/org.argeo.cms.jshell/src/org/argeo/cms/jshell/CmsJShell.java +++ b/org.argeo.cms.jshell/src/org/argeo/cms/jshell/CmsJShell.java @@ -51,13 +51,32 @@ public class CmsJShell { // TODO centralise state run dir stateRunDir = OS.getRunDir().resolve(applicationID); + // TODO factorise create/delete pattern jshBase = stateRunDir.resolve(JShellClient.JSH); + if (Files.exists(jshBase)) { + log.warn(jshBase + " already exists, deleting it..."); + FsUtils.delete(jshBase); + } Files.createDirectories(jshBase); - jshLinkedDir = Files.createSymbolicLink(cmsState.getStatePath(JShellClient.JSH), jshBase); + jshLinkedDir = cmsState.getStatePath(JShellClient.JSH); + if (Files.exists(jshLinkedDir)) { + log.warn(jshLinkedDir + " already exists, deleting it..."); + FsUtils.delete(jshLinkedDir); + } + Files.createSymbolicLink(jshLinkedDir, jshBase); jtermBase = stateRunDir.resolve(JShellClient.JTERM); + if (Files.exists(jtermBase)) { + log.warn(jtermBase + " already exists, deleting it..."); + FsUtils.delete(jtermBase); + } Files.createDirectories(jtermBase); - jtermLinkedDir = Files.createSymbolicLink(cmsState.getStatePath(JShellClient.JTERM), jtermBase); + jtermLinkedDir = cmsState.getStatePath(JShellClient.JTERM); + if (Files.exists(jtermLinkedDir)) { + log.warn(jtermLinkedDir + " already exists, deleting it..."); + FsUtils.delete(jtermLinkedDir); + } + Files.createSymbolicLink(jtermLinkedDir, jtermBase); log.info("Local JShell on " + jshBase + ", linked to " + jshLinkedDir); log.info("Local JTerm on " + jtermBase + ", linked to " + jtermLinkedDir); diff --git a/org.argeo.cms.lib.sshd/src/org/argeo/cms/ssh/CmsSshServer.java b/org.argeo.cms.lib.sshd/src/org/argeo/cms/ssh/CmsSshServer.java index 8a6def33a..98bb04544 100644 --- a/org.argeo.cms.lib.sshd/src/org/argeo/cms/ssh/CmsSshServer.java +++ b/org.argeo.cms.lib.sshd/src/org/argeo/cms/ssh/CmsSshServer.java @@ -206,7 +206,10 @@ public class CmsSshServer implements CmsSshd { (PrivateKey) store.getKey(CmsConstants.NODE, keyStorePassword)); } catch (IOException | KeyStoreException | NoSuchProviderException | NoSuchAlgorithmException | CertificateException | IllegalArgumentException | UnrecoverableKeyException e) { - log.error("Cannot add node public key to SSH authorized keys", e); + if (log.isTraceEnabled()) + log.error("Cannot add node public key to SSH authorized keys", e); + else + log.error("Cannot add node public key to SSH authorized keys: " + e.getMessage()); return null; } diff --git a/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsContextImpl.java b/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsContextImpl.java index bd54b2059..01d285b8c 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsContextImpl.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsContextImpl.java @@ -44,6 +44,9 @@ public class CmsContextImpl implements CmsContext { private Long availableSince; + // time in ms to wait for CMS to be ready + private final long readynessTimeout = 30 * 1000; + // CMS sessions private Map cmsSessionsByUuid = new HashMap<>(); private Map cmsSessionsByLocalId = new HashMap<>(); @@ -56,9 +59,16 @@ public class CmsContextImpl implements CmsContext { defaultLocale = locales.get(0); new Thread(() -> { - while (!checkReadiness()) { + long begin = System.currentTimeMillis(); + long duration = 0; + readyness: while (!checkReadiness()) { + duration = System.currentTimeMillis() - begin; + if (duration > readynessTimeout) { + log.error("## CMS not ready after " + duration + " ms. Giving up checking."); + break readyness; + } try { - Thread.sleep(500); + Thread.sleep(100); } catch (InterruptedException e) { } } diff --git a/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsDeploymentImpl.java b/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsDeploymentImpl.java index f9a1dc368..e1c420b82 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsDeploymentImpl.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsDeploymentImpl.java @@ -82,7 +82,7 @@ public class CmsDeploymentImpl implements CmsDeployment { CmsAuthenticator authenticator = isPublic ? new PublicCmsAuthenticator() : new CmsAuthenticator(); httpHandlers.put(contextPath, httpHandler); httpAuthenticators.put(contextPath, authenticator); - if (httpServer == null) { + if (httpServer.join() == null) { return; } else { createHttpContext(contextPath, httpHandler, authenticator); @@ -107,16 +107,16 @@ public class CmsDeploymentImpl implements CmsDeployment { if (contextPath == null) return; // ignore silently httpHandlers.remove(contextPath); - if (httpServer == null) + if (httpServer.join() == null) return; httpServer.join().removeContext(contextPath); log.debug(() -> "Removed handler " + contextPath + " : " + httpHandler.getClass().getName()); } public boolean allExpectedServicesAvailable() { - if (httpExpected && httpServer == null) + if (httpExpected && !httpServer.isDone()) return false; - if (sshdExpected && cmsSshd == null) + if (sshdExpected && !cmsSshd.isDone()) return false; return true; } -- 2.30.2