git: 92eeb2761b01 - main - sysutils/kleene-daemon: new port for container management

From: Dave Cottlehuber <dch_at_FreeBSD.org>
Date: Tue, 18 Feb 2025 18:17:46 UTC
The branch main has been updated by dch:

URL: https://cgit.FreeBSD.org/ports/commit/?id=92eeb2761b015c6da8a8cdbe9f28484b630b6af9

commit 92eeb2761b015c6da8a8cdbe9f28484b630b6af9
Author:     Dave Cottlehuber <dch@FreeBSD.org>
AuthorDate: 2025-02-18 18:17:42 +0000
Commit:     Dave Cottlehuber <dch@FreeBSD.org>
CommitDate: 2025-02-18 18:17:42 +0000

    sysutils/kleene-daemon: new port for container management
    
    PR:             279003
    Sponsored by:   SkunkWerks, GmbH
    Differential Revision:  https://reviews.freebsd.org/D49018
---
 sysutils/Makefile                           |  1 +
 sysutils/kleene-daemon/Makefile             | 88 +++++++++++++++++++++++++++++
 sysutils/kleene-daemon/distinfo             |  5 ++
 sysutils/kleene-daemon/files/kleened.in     | 74 ++++++++++++++++++++++++
 sysutils/kleene-daemon/files/pkg-message.in | 33 +++++++++++
 sysutils/kleene-daemon/pkg-descr            |  3 +
 sysutils/kleene-daemon/pkg-plist            | 27 +++++++++
 7 files changed, 231 insertions(+)

diff --git a/sysutils/Makefile b/sysutils/Makefile
index 2185e5e6b812..e9795cb2f589 100644
--- a/sysutils/Makefile
+++ b/sysutils/Makefile
@@ -586,6 +586,7 @@
     SUBDIR += kiconvtool
     SUBDIR += kldfind
     SUBDIR += kldpatch
+    SUBDIR += kleene-daemon
     SUBDIR += kopia
     SUBDIR += kops
     SUBDIR += kpmcore
diff --git a/sysutils/kleene-daemon/Makefile b/sysutils/kleene-daemon/Makefile
new file mode 100644
index 000000000000..4f652086418b
--- /dev/null
+++ b/sysutils/kleene-daemon/Makefile
@@ -0,0 +1,88 @@
+PORTNAME=	kleene-daemon
+DISTVERSIONPREFIX=	v
+DISTVERSION=	0.1.0
+DISTVERSIONSUFFIX=	-rc.5
+CATEGORIES=	sysutils
+MASTER_SITES+=	https://builds.hex.pm/installs/1.16.0/:hex
+DISTFILES+=	hex-${_HEXPM_VERSION}.ez:hex
+
+MAINTAINER=	lasse@philomath.dk
+COMMENT=	Kleene backend daemon for managing containers on FreeBSD
+WWW=		https://kleene.dev
+
+LICENSE=	APACHE20 BSD2CLAUSE
+LICENSE_COMB=	multi
+
+BUILD_DEPENDS=	ca_root_nss>0:security/ca_root_nss \
+		mix:lang/elixir \
+		rebar3:devel/rebar3
+
+USES=		gmake ssl
+USE_GITHUB=	yes
+
+GH_ACCOUNT=	kleene-project
+GH_PROJECT=	kleened
+USE_RC_SUBR=	kleened
+
+MAKE_ENV+=	ERL_LIBS='' \
+		HEX_HOME=${WRKDIR}/.hex \
+		HEX_OFFLINE=true \
+		LANG=en_US_UTF-8 \
+		LC_ALL=en_US.UTF-8 \
+		MIX_ARCHIVES=${WRKDIR} \
+		MIX_ENV=prod \
+		MIX_HOME=${WRKDIR}/.mix \
+		MIX_PATH=${WRKDIR}/.mix/archives/hex-${_HEXPM_VERSION}/hex-${_HEXPM_VERSION}/ebin \
+		MIX_REBAR3=${LOCALBASE}/bin/rebar3
+
+ETCDIR=		${PREFIX}/etc/kleened
+SUB_FILES=	pkg-message
+PLIST_SUB=	DISTVERSION=${DISTVERSION}
+
+_HEXPM_VERSION=		2.1.1
+_HEX_DIR=		${WRKDIR}/.mix/archives/hex-${_HEXPM_VERSION}
+_RELEASE_PATH=		${WRKSRC}/_build/prod/rel/kleened
+_RELEASE_BINARIES=	escript dialyzer erlexec beam.smp heart dyn_erl to_erl \
+			erlc epmd run_erl typer inet_gethost erl_child_setup \
+			ct_run erl_call yielding_c_fun
+
+.include <bsd.port.pre.mk>
+
+post-extract:
+	${MKDIR} ${_HEX_DIR}
+	${MV} ${WRKDIR}/hex-* \
+		${_HEX_DIR}/
+
+do-build:
+	(cd ${WRKSRC} && \
+		${SETENV} ${MAKE_ENV} ${LOCALBASE}/bin/mix do deps.compile, \
+		compile, release)
+
+do-install:
+# sample configs
+	${MKDIR} ${STAGEDIR}${ETCDIR}
+	${INSTALL_DATA} ${WRKSRC}/example/kleened_config.yaml \
+		${STAGEDIR}${ETCDIR}/config.yaml.sample
+	${INSTALL_DATA} ${WRKSRC}/example/pf.conf.kleene \
+		${STAGEDIR}${ETCDIR}/pf.conf.kleene.sample
+# the release
+	${CP} -a ${WRKSRC}/_build/prod/rel/kleened ${STAGEDIR}${PREFIX}/libexec/
+	${INSTALL_PROGRAM} ${WRKSRC}/priv/bin/kleened_pty \
+		${STAGEDIR}${PREFIX}/libexec/kleened/bin/
+	${RM} ${STAGEDIR}${PREFIX}/libexec/kleened/bin/*.src
+# strip binaries and objects
+	${FIND} ${STAGEDIR}${PREFIX}/libexec/kleened/lib -type f -name \
+		*.so -exec ${STRIP_CMD} {} \;
+.for bin in ${_RELEASE_BINARIES}
+	${STRIP_CMD} ${STAGEDIR}${PREFIX}/libexec/kleened/erts-*/bin/${bin}
+.endfor
+
+post-install:
+	@cd ${STAGEDIR}${PREFIX} && \
+		${FIND} libexec/kleened/erts-* -type f -o -type l | \
+		${SORT} >> ${TMPPLIST}
+	@cd ${STAGEDIR}${PREFIX} && \
+		${FIND} libexec/kleened/lib/* -type f -o -type l | \
+		${SORT} >> ${TMPPLIST}
+
+.include <bsd.port.post.mk>
diff --git a/sysutils/kleene-daemon/distinfo b/sysutils/kleene-daemon/distinfo
new file mode 100644
index 000000000000..c176dd72276a
--- /dev/null
+++ b/sysutils/kleene-daemon/distinfo
@@ -0,0 +1,5 @@
+TIMESTAMP = 1739837077
+SHA256 (hex-2.1.1.ez) = 59c163c3e4efe4bdbb7029cd494e30c09b87beebc99359c175960cc4101beada
+SIZE (hex-2.1.1.ez) = 777696
+SHA256 (kleene-project-kleened-v0.1.0-rc.5_GH0.tar.gz) = 2fa2f9f907c8046a3c67daf100a5d6937f8a8be08865a9fb03c2cb6d31745fb7
+SIZE (kleene-project-kleened-v0.1.0-rc.5_GH0.tar.gz) = 5080006
diff --git a/sysutils/kleene-daemon/files/kleened.in b/sysutils/kleene-daemon/files/kleened.in
new file mode 100644
index 000000000000..081380d2f183
--- /dev/null
+++ b/sysutils/kleene-daemon/files/kleened.in
@@ -0,0 +1,74 @@
+#!/bin/sh
+#
+# PROVIDE: kleened
+# REQUIRE: LOGIN
+# KEYWORD: shutdown
+#
+# Add these lines to /etc/rc.conf.local or /etc/rc.conf
+# to enable and configure this service:
+#
+# kleened_enable (bool):    Set to NO by default.
+#                          Set it to YES to enable kleened.
+# kleened_user (str):      Set to "root" by default.
+# kleened_config (str):    Path to config file.
+#                          Default: %%PREFIX%%/etc/kleened/config.yaml
+# kleened_shutdown_timeout (int): Seconds to wait for graceful shutdown.
+#                                Default: 60
+
+. /etc/rc.subr
+name=kleened
+rcvar=kleened_enable
+extra_commands="init dryinit"
+# kleened_init: Initialize host configuration
+# kleened_dryinit: Test host configuration without applying changes
+
+required_files="${kleened_config}"
+
+command="%%PREFIX%%/libexec/kleened/bin/kleened"
+pidfile="/var/run/kleened.pid"
+procname="$(/usr/bin/find %%PREFIX%%/libexec/kleened -name beam.smp)"
+
+start_cmd="${command} daemon"
+status_cmd="${command} ping"
+stop_cmd="kleened_stop"
+init_cmd="kleened_init"
+dryinit_cmd="kleened_dryinit"
+
+load_rc_config $name
+
+: ${kleened_enable:=no}
+: ${kleened_user:="root"}
+: ${kleened_config:="%%ETCDIR%%/config.yaml"}
+: ${kleened_shutdown_timeout:=60}
+: ${kleened_env="LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 PATH=%%PREFIX%%/libexec/kleened/bin:${PATH}"}
+
+kleened_stop()
+{
+    echo "Stopping ${name}."
+    ${command} stop
+    wait_for_pids ${pidfile} ${kleened_shutdown_timeout}
+}
+
+kleened_init()
+{
+    echo "Initializing kleened host configuration..."
+    if %%PREFIX%%/libexec/kleened/bin/kleened eval "Kleened.Core.Config.initialize_host(%{dry_run: false})"; then
+        echo "Host initialization completed successfully"
+    else
+        echo "Host initialization failed"
+        return 1
+    fi
+}
+
+kleened_dryinit()
+{
+    echo "Testing kleened host configuration..."
+    if %%PREFIX%%/libexec/kleened/bin/kleened eval "Kleened.Core.Config.initialize_host(%{dry_run: true})"; then
+        echo "Host configuration test completed successfully"
+    else
+        echo "Host configuration test failed"
+        return 1
+    fi
+}
+
+run_rc_command "$1"
diff --git a/sysutils/kleene-daemon/files/pkg-message.in b/sysutils/kleene-daemon/files/pkg-message.in
new file mode 100644
index 000000000000..1cbc258054e2
--- /dev/null
+++ b/sysutils/kleene-daemon/files/pkg-message.in
@@ -0,0 +1,33 @@
+[
+{ type: install
+  message: <<EOM
+Kleene is a new tool and should be used for
+testing and experimentation purposes only.
+
+To use Kleened, enable it in rc.conf using
+
+  sysrc kleened_enable=YES
+
+Kleened requires certain services and kernel modules to be configured in order
+to work properly. Run
+
+  service kleened init
+
+to make Kleened automatically try and configure the host for you.
+Alternatively, run
+
+  service kleened dryinit
+
+to get an overview of what needs to be configured, without actually changing
+the host.
+
+NB. The %%ETCDIR%%/config.yaml file should be edited before running
+    'service kleened init' since some of the parameters are used during host
+    initialization.
+
+You can then start Kleened by running:
+
+  service kleened start
+EOM
+}
+]
diff --git a/sysutils/kleene-daemon/pkg-descr b/sysutils/kleene-daemon/pkg-descr
new file mode 100644
index 000000000000..448b215a5c80
--- /dev/null
+++ b/sysutils/kleene-daemon/pkg-descr
@@ -0,0 +1,3 @@
+Backend daemon for Kleene, a modern FreeBSD-native container management tool.
+Extensive documentation is available at https://kleene.dev/ and community
+via #kleene IRC channel on https://libera.chat/ .
diff --git a/sysutils/kleene-daemon/pkg-plist b/sysutils/kleene-daemon/pkg-plist
new file mode 100644
index 000000000000..01606c00de05
--- /dev/null
+++ b/sysutils/kleene-daemon/pkg-plist
@@ -0,0 +1,27 @@
+@sample %%ETCDIR%%/config.yaml.sample
+@sample %%ETCDIR%%/pf.conf.kleene.sample
+libexec/kleened/bin/kleened
+libexec/kleened/bin/kleened_pty
+libexec/kleened/releases/%%DISTVERSION%%/consolidated/Elixir.Collectable.beam
+libexec/kleened/releases/%%DISTVERSION%%/consolidated/Elixir.DBConnection.Query.beam
+libexec/kleened/releases/%%DISTVERSION%%/consolidated/Elixir.Enumerable.beam
+libexec/kleened/releases/%%DISTVERSION%%/consolidated/Elixir.IEx.Info.beam
+libexec/kleened/releases/%%DISTVERSION%%/consolidated/Elixir.Inspect.beam
+libexec/kleened/releases/%%DISTVERSION%%/consolidated/Elixir.Jason.Encoder.beam
+libexec/kleened/releases/%%DISTVERSION%%/consolidated/Elixir.List.Chars.beam
+libexec/kleened/releases/%%DISTVERSION%%/consolidated/Elixir.OpenApiSpex.Extendable.beam
+libexec/kleened/releases/%%DISTVERSION%%/consolidated/Elixir.Plug.Exception.beam
+libexec/kleened/releases/%%DISTVERSION%%/consolidated/Elixir.String.Chars.beam
+libexec/kleened/releases/%%DISTVERSION%%/elixir
+libexec/kleened/releases/%%DISTVERSION%%/env.sh
+libexec/kleened/releases/%%DISTVERSION%%/iex
+libexec/kleened/releases/%%DISTVERSION%%/kleened.rel
+libexec/kleened/releases/%%DISTVERSION%%/remote.vm.args
+libexec/kleened/releases/%%DISTVERSION%%/start.boot
+libexec/kleened/releases/%%DISTVERSION%%/start.script
+libexec/kleened/releases/%%DISTVERSION%%/start_clean.boot
+libexec/kleened/releases/%%DISTVERSION%%/start_clean.script
+libexec/kleened/releases/%%DISTVERSION%%/sys.config
+libexec/kleened/releases/%%DISTVERSION%%/vm.args
+libexec/kleened/releases/COOKIE
+libexec/kleened/releases/start_erl.data