Improve initialisation
authorMathieu Baudier <mbaudier@argeo.org>
Sat, 9 Dec 2023 08:40:19 +0000 (09:40 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Sat, 9 Dec 2023 08:40:19 +0000 (09:40 +0100)
org.argeo.cms.jshell/src/org/argeo/cms/jshell/CmsJShell.java
org.argeo.cms.lib.sshd/src/org/argeo/cms/ssh/CmsSshServer.java
org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsContextImpl.java
org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsDeploymentImpl.java

index d84ce7212ebcbcacd387618c83ca72e7601bb4ec..d9d7d799523fec81658e4c0fb71ca701adff5b3e 100644 (file)
@@ -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);
index 8a6def33ac631c2c88eaf8f8daa308c27394d4a4..98bb045441b51a306988f95346127998ba08e50c 100644 (file)
@@ -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;
                }
 
index bd54b20594b5e7200d0a3e04f975e8cfc13ab354..01d285b8cfd2767b8d4252b5cb93cb30861950a9 100644 (file)
@@ -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<UUID, CmsSessionImpl> cmsSessionsByUuid = new HashMap<>();
        private Map<String, CmsSessionImpl> 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) {
                                }
                        }
index f9a1dc36832dab593fb28d53017679f8db5f400c..e1c420b8287469bb698af791d04b9d87638563d9 100644 (file)
@@ -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;
        }