From: Mathieu Baudier Date: Fri, 8 Dec 2023 16:21:54 +0000 (+0100) Subject: Improve FREEd PID1 X-Git-Tag: v2.3.5~4 X-Git-Url: https://git.argeo.org/?p=gpl%2Fargeo-freed.git;a=commitdiff_plain;h=f6c6ea30d2c8b66dd9ba534622bd87763c2c5679 Improve FREEd PID1 --- diff --git a/etc/freed/init/config.ini b/etc/freed/init/config.ini deleted file mode 100644 index bdb2a9a..0000000 --- a/etc/freed/init/config.ini +++ /dev/null @@ -1,28 +0,0 @@ -osgi.clean=true -osgi.console=true - -argeo.osgi.start.2=\ -org.eclipse.equinox.http.servlet,\ -org.apache.felix.scr,\ -org.eclipse.rap.rwt.osgi,\ -org.apache.tika.parsers,\ -org.argeo.init - -argeo.osgi.start.3=\ -org.argeo.cms,\ -org.argeo.cms.swt.rap,\ -org.argeo.cms.swt.rcp,\ -org.argeo.cms.ee,\ -org.argeo.cms.lib.sshd,\ -org.argeo.cms.lib.equinox,\ -org.argeo.cms.lib.jetty,\ -org.argeo.cms.jshell,\ - -argeo.http.port=80 -argeo.sshd.port=22 - -argeo.osgi.sources=\ -a2:///?\ -osgi=equinox&\ -log=syslogger&\ -crypto=fips&\ diff --git a/etc/freed/init/jvm.args b/etc/freed/init/jvm.args deleted file mode 100644 index 6e7d6a6..0000000 --- a/etc/freed/init/jvm.args +++ /dev/null @@ -1,10 +0,0 @@ --Dosgi.configuration.cascaded=true --Dosgi.sharedConfiguration.area=/etc/freed/init --Dosgi.sharedConfiguration.area.readOnly=true --Dosgi.configuration.area=/var/lib/freed/init/state/ --Dosgi.instance.area=/var/lib/freed/init/data/ - --Dorg.osgi.framework.system.packages.extra=sun.security.internal.spec,sun.security.provider,com.sun.net.httpserver,com.sun.jndi.ldap,com.sun.jndi.ldap.sasl,com.sun.jndi.dns,com.sun.security.jgss,com.sun.nio.file,com.sun.nio.sctp --Dorg.eclipse.equinox.http.jetty.autostart=false - --cp /usr/local/share/a2/osgi/equinox/org.argeo.tp.osgi/org.eclipse.osgi.3.18.jar:/usr/local/share/a2/org.argeo.cms/org.argeo.init.2.3.jar \ No newline at end of file diff --git a/etc/freed/init/system.properties b/etc/freed/init/system.properties deleted file mode 100644 index 5ee8524..0000000 --- a/etc/freed/init/system.properties +++ /dev/null @@ -1 +0,0 @@ -log.org.argeo=DEBUG \ No newline at end of file diff --git a/etc/freed/pid1/config.ini b/etc/freed/pid1/config.ini new file mode 100644 index 0000000..ecc9502 --- /dev/null +++ b/etc/freed/pid1/config.ini @@ -0,0 +1,28 @@ +osgi.clean=true +#osgi.console=true + +argeo.osgi.start.2=\ +org.eclipse.equinox.http.servlet,\ +org.apache.felix.scr,\ +org.eclipse.rap.rwt.osgi,\ +org.apache.tika.parsers,\ +org.argeo.init + +argeo.osgi.start.3=\ +org.argeo.cms,\ +org.argeo.cms.swt.rap,\ +org.argeo.cms.swt.rcp,\ +org.argeo.cms.ee,\ +org.argeo.cms.lib.sshd,\ +org.argeo.cms.lib.equinox,\ +org.argeo.cms.lib.jetty,\ +org.argeo.cms.jshell,\ + +argeo.http.port=8080 +#argeo.sshd.port=22 + +argeo.osgi.sources=\ +a2:///?\ +osgi=equinox&\ +log=syslogger&\ +crypto=fips&\ diff --git a/etc/freed/pid1/jvm.args b/etc/freed/pid1/jvm.args new file mode 100644 index 0000000..2a6402a --- /dev/null +++ b/etc/freed/pid1/jvm.args @@ -0,0 +1,16 @@ +-Dosgi.configuration.cascaded=true +-Dosgi.sharedConfiguration.area=/usr/local/etc/freed/pid1 +-Dosgi.sharedConfiguration.area.readOnly=true +-Dosgi.configuration.area=/var/lib/freed/pid1/state/ +-Dosgi.instance.area=/var/lib/freed/pid1/data/ + +-Dorg.osgi.framework.system.packages.extra=sun.security.utils,sun.security.internal.spec,sun.security.provider,com.sun.net.httpserver,com.sun.jndi.ldap,com.sun.jndi.ldap.sasl,com.sun.jndi.dns,com.sun.security.jgss,com.sun.nio.file,com.sun.nio.sctp +-Dorg.eclipse.equinox.http.jetty.autostart=false + +-Dfile.encoding=UTF-8 +-Dnative.encoding=UTF-8 +-Dsun.stdout.encoding=UTF-8 +-Dsun.stderr.encoding=UTF-8 +-Dsun.jnu.encoding=UTF-8 + +-cp /usr/local/share/a2/osgi/equinox/org.argeo.tp.osgi/org.eclipse.osgi.3.18.jar:/usr/local/share/a2/org.argeo.cms/org.argeo.init.2.3.jar \ No newline at end of file diff --git a/etc/freed/pid1/system.properties b/etc/freed/pid1/system.properties new file mode 100644 index 0000000..5ee8524 --- /dev/null +++ b/etc/freed/pid1/system.properties @@ -0,0 +1 @@ +log.org.argeo=DEBUG \ No newline at end of file diff --git a/local.mk b/local.mk new file mode 100644 index 0000000..531f8ab --- /dev/null +++ b/local.mk @@ -0,0 +1,26 @@ +# GNU coding standards +prefix ?= /usr/local +exec_prefix ?= $(prefix) +bindir ?= $(exec_prefix)/bin +sbindir ?= $(exec_prefix)/sbin +libdir ?= $(exec_prefix)/lib +libexecdir ?= $(exec_prefix)/libexec +sysconfdir = $(prefix)/etc +srcdir ?= src +datarootdir ?= $(prefix)/share + +COPY=cp --reflink=auto + +all: + $(MAKE) -C sjbin all + +clean: + $(MAKE) -C sjbin clean + +install: + $(COPY) -r etc/* $(DESTDIR)$(sysconfdir) + $(COPY) -r usr/bin/* $(DESTDIR)$(bindir) + $(COPY) -r usr/share/* $(DESTDIR)$(datarootdir) + $(COPY) -r usr/lib/* $(DESTDIR)$(libdir) + $(COPY) -r usr/libexec/* $(DESTDIR)$(libexec) + $(MAKE) -C sjbin install diff --git a/sjbin/.classpath b/sjbin/.classpath new file mode 100644 index 0000000..81fe078 --- /dev/null +++ b/sjbin/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/sjbin/.gitignore b/sjbin/.gitignore new file mode 100644 index 0000000..01c3b51 --- /dev/null +++ b/sjbin/.gitignore @@ -0,0 +1,4 @@ +/bin/ +/src/* +!/src/*.java +/freed-pid1 diff --git a/sjbin/.project b/sjbin/.project new file mode 100644 index 0000000..295adf7 --- /dev/null +++ b/sjbin/.project @@ -0,0 +1,28 @@ + + + freed-sjbin + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/sjbin/META-INF/MANIFEST.MF b/sjbin/META-INF/MANIFEST.MF new file mode 100644 index 0000000..8b35d9a --- /dev/null +++ b/sjbin/META-INF/MANIFEST.MF @@ -0,0 +1,7 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Freed-jbin +Bundle-SymbolicName: freed-jbin +Bundle-Version: 1.0.0.qualifier +Automatic-Module-Name: freed.jbin +Bundle-RequiredExecutionEnvironment: JavaSE-17 diff --git a/sjbin/Makefile b/sjbin/Makefile new file mode 100644 index 0000000..959f751 --- /dev/null +++ b/sjbin/Makefile @@ -0,0 +1,25 @@ +# GNU coding standards +prefix ?= /usr/local +exec_prefix ?= $(prefix) +sbindir ?= $(exec_prefix)/sbin +sysconfdir = $(prefix)/etc +srcdir ?= src + +EXECUTABLES=$(notdir $(patsubst %.java,%,$(wildcard $(srcdir)/*.java))) + +all: $(EXECUTABLES) + +%: $(srcdir)/%.java + cp $< $@ + sed -i '1!b;s|//#!|#!|' $@ + chmod a+x $@ + +clean: + $(RM) $(EXECUTABLES) + +install: +# TODO generalise + cp -v --preserve=mode freed-pid1 $(DESTDIR)$(sbindir) + sed -i 's|/usr/local|$(prefix)|' $(DESTDIR)$(sbindir)/freed-pid1 + sed -i 's|/usr/local|$(prefix)|' $(DESTDIR)$(sysconfdir)/freed/pid1/jvm.args +# cp -v ../../etc/freed/init/* $(DESTDIR)$(sysconfdir)/freed/init diff --git a/sjbin/build.properties b/sjbin/build.properties new file mode 100644 index 0000000..5d082ea --- /dev/null +++ b/sjbin/build.properties @@ -0,0 +1,5 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . +additional.bundles = org.argeo.init diff --git a/sjbin/src/freed-pid1.java b/sjbin/src/freed-pid1.java new file mode 100644 index 0000000..0239cb7 --- /dev/null +++ b/sjbin/src/freed-pid1.java @@ -0,0 +1,116 @@ +//#! /usr/bin/java --source 17 @/usr/local/etc/freed/pid1/jvm.args + +import java.io.IOException; +import java.lang.management.ManagementFactory; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.TreeMap; + +import org.argeo.init.Service; + +import jdk.jshell.tool.JavaShellToolBuilder; +import sun.misc.Signal; + +class FreedPid1 { + public static void main(String... args) { + final long pid = ProcessHandle.current().pid(); + System.out.println("FREEd Init daemon starting with pid " + pid + "..."); +// System.out.println(System.getProperty("user.dir")); +// System.out.println(System.getProperty("user.name")); +// System.out.println(System.getProperty("user.home")); + + // System.setProperty("user.dir", "/tmp"); + for (Object key : new TreeMap<>(System.getProperties()).keySet()) { + System.out.println(key + "=" + System.getProperty(key.toString())); + } + + System.out.flush(); + + Signal.handle(new Signal("TERM"), (signal) -> { + System.out.println("SIGTERM caught"); + System.exit(0); + }); + Signal.handle(new Signal("INT"), (signal) -> { + System.out.println("SIGINT caught"); + System.exit(0); + }); + Signal.handle(new Signal("HUP"), (signal) -> { + System.out.println("SIGHUP caught"); + System.exit(0); + }); + + if (args.length > 0 && ("1".equals(args[0]) // + || "single".equals(args[0]) // + || "emergency".equals(args[0]))) { + // TODO check if we can remove dependency to management + String classpath = ManagementFactory.getRuntimeMXBean().getClassPath(); + String feedbackMode = "concise"; + // TODO --startup script + JavaShellToolBuilder builder = JavaShellToolBuilder.builder(); + try { + builder.start("--execution", "direct", "--class-path", classpath, "--feedback", feedbackMode); + } catch (Exception e) { + e.printStackTrace(); + System.err.flush(); + System.exit(1); + return; + } + + } else { + // init Linux services + initSysctl(); + startInitDService("networking"); + startInitDService("nslcd"); + + waitForNetwork(); + + // init Argeo CMS + Service.main(args); + } + } + + static void initSysctl() { + try { + Path sysctlD = Paths.get("/etc/sysctl.d/"); + for (Path conf : Files.newDirectoryStream(sysctlD, "*.conf")) { + try { + new ProcessBuilder("/usr/sbin/sysctl", "-p", conf.toString()).start(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + static void startInitDService(String serviceName) { + Path serviceInit = Paths.get("/etc/init.d/", serviceName); + if (Files.exists(serviceInit)) + try { + new ProcessBuilder(serviceInit.toString(), "start").start().waitFor(); + System.out.println("Service " + serviceName + " started"); + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + try { + new ProcessBuilder(serviceInit.toString(), "stop").start().waitFor(); + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } + }, "Stop service " + serviceName)); + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } + else + System.out.println("Service " + serviceName + " not found and therefore not started"); + } + + static void waitForNetwork() { + // TODO Do it properly + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} diff --git a/usr/jbin/.classpath b/usr/jbin/.classpath deleted file mode 100644 index 81fe078..0000000 --- a/usr/jbin/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/usr/jbin/.gitignore b/usr/jbin/.gitignore deleted file mode 100644 index 8c068ec..0000000 --- a/usr/jbin/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/bin/ -/src/* -!/src/*.java -/freed-init diff --git a/usr/jbin/.project b/usr/jbin/.project deleted file mode 100644 index dfb0678..0000000 --- a/usr/jbin/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - freed-jbin - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - diff --git a/usr/jbin/META-INF/MANIFEST.MF b/usr/jbin/META-INF/MANIFEST.MF deleted file mode 100644 index 8b35d9a..0000000 --- a/usr/jbin/META-INF/MANIFEST.MF +++ /dev/null @@ -1,7 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: Freed-jbin -Bundle-SymbolicName: freed-jbin -Bundle-Version: 1.0.0.qualifier -Automatic-Module-Name: freed.jbin -Bundle-RequiredExecutionEnvironment: JavaSE-17 diff --git a/usr/jbin/Makefile b/usr/jbin/Makefile deleted file mode 100644 index 94f73a1..0000000 --- a/usr/jbin/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -# GNU coding standards -prefix ?= /usr/local -exec_prefix ?= $(prefix) -sbindir ?= $(exec_prefix)/sbin -sysconfdir = $(prefix)/etc -srcdir ?= src - -EXECUTABLES=$(notdir $(patsubst %.java,%,$(wildcard $(srcdir)/*.java))) -#EXECUTABLES=$(FILE:src/%.java=%) - -all: $(EXECUTABLES) - -%: $(srcdir)/%.java - cp $< $@ - sed -i '1!b;s|//#!|#!|' $@ - chmod a+x $@ - -clean: - $(RM) $(EXECUTABLES) - -install: - cp -v --preserve=mode freed-init $(DESTDIR)$(sbindir) - cp -v ../../etc/freed/init/* $(DESTDIR)$(sysconfdir)/freed/init diff --git a/usr/jbin/build.properties b/usr/jbin/build.properties deleted file mode 100644 index 5d082ea..0000000 --- a/usr/jbin/build.properties +++ /dev/null @@ -1,5 +0,0 @@ -source.. = src/ -output.. = bin/ -bin.includes = META-INF/,\ - . -additional.bundles = org.argeo.init diff --git a/usr/jbin/src/freed-init.java b/usr/jbin/src/freed-init.java deleted file mode 100644 index f9e9cb8..0000000 --- a/usr/jbin/src/freed-init.java +++ /dev/null @@ -1,60 +0,0 @@ -//#! /usr/bin/java --source 17 @/etc/freed/init/jvm.args - -import java.lang.management.ManagementFactory; -import java.util.TreeMap; - -import org.argeo.init.Service; - -import jdk.jshell.tool.JavaShellToolBuilder; -import sun.misc.Signal; - -class FreedInit { - public static void main(String... args) { - final long pid = ProcessHandle.current().pid(); - System.out.println("FREEd Init daemon starting with pid " + pid + "..."); -// System.out.println(System.getProperty("user.dir")); -// System.out.println(System.getProperty("user.name")); -// System.out.println(System.getProperty("user.home")); - - // System.setProperty("user.dir", "/tmp"); - for (Object key : new TreeMap<>(System.getProperties()).keySet()) { - System.out.println(key + "=" + System.getProperty(key.toString())); - } - - System.out.flush(); - - Signal.handle(new Signal("TERM"), (signal) -> { - System.out.println("SIGTERM caught"); - System.exit(0); - }); - Signal.handle(new Signal("INT"), (signal) -> { - System.out.println("SIGINT caught"); - System.exit(0); - }); - Signal.handle(new Signal("HUP"), (signal) -> { - System.out.println("SIGHUP caught"); - System.exit(0); - }); - - if (args.length > 0 && ("1".equals(args[0]) // - || "single".equals(args[0]) // - || "emergency".equals(args[0]))) { - // TODO check if we can remove dependency to management - String classpath = ManagementFactory.getRuntimeMXBean().getClassPath(); - String feedbackMode = "concise"; - // TODO --startup script - JavaShellToolBuilder builder = JavaShellToolBuilder.builder(); - try { - builder.start("--execution", "direct", "--class-path", classpath, "--feedback", feedbackMode); - } catch (Exception e) { - e.printStackTrace(); - System.err.flush(); - System.exit(1); - return; - } - - } else { - Service.main(args); - } - } -}