From 7348bdd69ec660606cb08a11700059a073683f42 Mon Sep 17 00:00:00 2001 From: Ben Vincent Date: Sat, 29 Mar 2025 18:24:21 +1100 Subject: [PATCH] feat: add incus - manage the build of incus, incus-tools and incus-client --- rpms/incus/6.10.1/release | 1 + rpms/incus/Dockerfile | 55 ++++++++++++ rpms/incus/resources/incus-startup.service | 15 ++++ rpms/incus/resources/incus-user.service | 11 +++ rpms/incus/resources/incus-user.socket | 11 +++ rpms/incus/resources/incus.service | 21 +++++ rpms/incus/resources/incus.socket | 11 +++ rpms/incus/resources/nfpm_incus-client.yaml | 38 ++++++++ rpms/incus/resources/nfpm_incus-tools.yaml | 59 +++++++++++++ rpms/incus/resources/nfpm_incus.yaml | 98 +++++++++++++++++++++ rpms/incus/resources/shutdown | 7 ++ rpms/incus/resources/sysusers.d.incus.conf | 2 + rpms/incus/resources/tmpfiles.d.incus.conf | 4 + rpms/incus/scripts/build-packages.sh | 4 + rpms/incus/scripts/postinstall.sh | 2 + rpms/incus/scripts/postremove.sh | 5 ++ rpms/incus/scripts/preinstall.sh | 4 + rpms/incus/scripts/preremove.sh | 6 ++ 18 files changed, 354 insertions(+) create mode 100644 rpms/incus/6.10.1/release create mode 100644 rpms/incus/Dockerfile create mode 100644 rpms/incus/resources/incus-startup.service create mode 100644 rpms/incus/resources/incus-user.service create mode 100644 rpms/incus/resources/incus-user.socket create mode 100644 rpms/incus/resources/incus.service create mode 100644 rpms/incus/resources/incus.socket create mode 100644 rpms/incus/resources/nfpm_incus-client.yaml create mode 100644 rpms/incus/resources/nfpm_incus-tools.yaml create mode 100644 rpms/incus/resources/nfpm_incus.yaml create mode 100644 rpms/incus/resources/shutdown create mode 100644 rpms/incus/resources/sysusers.d.incus.conf create mode 100644 rpms/incus/resources/tmpfiles.d.incus.conf create mode 100755 rpms/incus/scripts/build-packages.sh create mode 100755 rpms/incus/scripts/postinstall.sh create mode 100755 rpms/incus/scripts/postremove.sh create mode 100755 rpms/incus/scripts/preinstall.sh create mode 100755 rpms/incus/scripts/preremove.sh diff --git a/rpms/incus/6.10.1/release b/rpms/incus/6.10.1/release new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/rpms/incus/6.10.1/release @@ -0,0 +1 @@ +1 diff --git a/rpms/incus/Dockerfile b/rpms/incus/Dockerfile new file mode 100644 index 0000000..de3f9d7 --- /dev/null +++ b/rpms/incus/Dockerfile @@ -0,0 +1,55 @@ +# Start with the AlmaLinux 8.10 base image +FROM git.query.consul/unkin/almalinux9-rpmbuilder:latest + +# Create output directory for RPMs +RUN mkdir -p /app/dist + +# Set working directory +WORKDIR /app + +ARG PACKAGE_RELEASE +ENV PACKAGE_RELEASE=${PACKAGE_RELEASE} +ARG PACKAGE_VERSION +ENV PACKAGE_VERSION=${PACKAGE_VERSION} + +COPY scripts /app/scripts +COPY resources /app/resources + +# Download the required files +RUN dnf install -y \ + unzip \ + libtool \ + autoconf \ + automake \ + gcc \ + make \ + git \ + go \ + cowsql-devel \ + libacl-devel \ + libcap-devel \ + libseccomp-devel \ + libuv-devel \ + raft-devel \ + libudev-devel \ + lxc-devel \ + libsqlite3x-devel \ + sqlite-devel \ + systemd-rpm-macros \ + bash-completion \ + gettext \ + help2man \ + wget && \ + wget -O /app/incus.tar.gz https://github.com/lxc/incus/archive/refs/tags/v${PACKAGE_VERSION}.tar.gz && tar -C /app -xf incus.tar.gz && \ + wget https://go.dev/dl/go1.24.1.linux-amd64.tar.gz && rm -rf /usr/local/go && tar -C /usr/local -xzf go1.24.1.linux-amd64.tar.gz && \ + export PATH=/usr/local/go/bin:$PATH && \ + pushd /app/incus-${PACKAGE_VERSION} && \ + make deps && \ + export CGO_CFLAGS="-I/root/go/deps/raft/include/ -I/root/go/deps/cowsql/include/" && \ + export CGO_LDFLAGS="-L/root/go/deps/raft/.libs -L/root/go/deps/cowsql/.libs/" && \ + export LD_LIBRARY_PATH="/root/go/deps/raft/.libs/:/root/go/deps/cowsql/.libs/" && \ + export CGO_LDFLAGS_ALLOW="(-Wl,-wrap,pthread_create)|(-Wl,-z,now)" && \ + make build + +# Default command to build RPMs +CMD /app/scripts/build-packages.sh diff --git a/rpms/incus/resources/incus-startup.service b/rpms/incus/resources/incus-startup.service new file mode 100644 index 0000000..731004e --- /dev/null +++ b/rpms/incus/resources/incus-startup.service @@ -0,0 +1,15 @@ +[Unit] +Description=Incus - Instance startup +After=incus.socket incus.service +Requires=incus.socket + +[Service] +Type=oneshot +ExecStart=/usr/libexec/incus/incusd activateifneeded +ExecStop=/usr/libexec/incus/shutdown +TimeoutStartSec=600s +TimeoutStopSec=600s +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/rpms/incus/resources/incus-user.service b/rpms/incus/resources/incus-user.service new file mode 100644 index 0000000..d0242b1 --- /dev/null +++ b/rpms/incus/resources/incus-user.service @@ -0,0 +1,11 @@ +[Unit] +Description=Incus - User daemon +After=incus-user.socket incus.service +Requires=incus-user.socket + +[Service] +ExecStart=/usr/libexec/incus/incus-user --group incus +Restart=on-failure + +[Install] +Also=incus-user.socket diff --git a/rpms/incus/resources/incus-user.socket b/rpms/incus/resources/incus-user.socket new file mode 100644 index 0000000..92de5fe --- /dev/null +++ b/rpms/incus/resources/incus-user.socket @@ -0,0 +1,11 @@ +[Unit] +Description=Incus - Daemon (user unix socket) + +[Socket] +ListenStream=/run/incus/unix.socket.user +SocketGroup=incus +SocketMode=0660 +Service=incus-user.service + +[Install] +WantedBy=sockets.target diff --git a/rpms/incus/resources/incus.service b/rpms/incus/resources/incus.service new file mode 100644 index 0000000..3e40d7c --- /dev/null +++ b/rpms/incus/resources/incus.service @@ -0,0 +1,21 @@ +[Unit] +Description=Incus - Daemon +After=network-online.target openvswitch-switch.service lxcfs.service incus.socket +Requires=network-online.target lxcfs.service incus.socket + +[Service] +Environment=INCUS_OVMF_PATH=/usr/share/edk2/ovmf +Environment=INCUS_SOCKET=/run/incus/unix.socket +ExecStart=/usr/libexec/incus/incusd --group incus-admin +ExecStartPost=/usr/libexec/incus/incusd waitready --timeout=600 +KillMode=process +TimeoutStartSec=600s +TimeoutStopSec=30s +Restart=on-failure +Delegate=yes +LimitNOFILE=1048576 +LimitNPROC=infinity +TasksMax=infinity + +[Install] +Also=incus-startup.service incus.socket diff --git a/rpms/incus/resources/incus.socket b/rpms/incus/resources/incus.socket new file mode 100644 index 0000000..7c98924 --- /dev/null +++ b/rpms/incus/resources/incus.socket @@ -0,0 +1,11 @@ +[Unit] +Description=Incus - Daemon (unix socket) + +[Socket] +ListenStream=/run/incus/unix.socket +SocketGroup=incus-admin +SocketMode=0660 +Service=incus.service + +[Install] +WantedBy=sockets.target diff --git a/rpms/incus/resources/nfpm_incus-client.yaml b/rpms/incus/resources/nfpm_incus-client.yaml new file mode 100644 index 0000000..f2376be --- /dev/null +++ b/rpms/incus/resources/nfpm_incus-client.yaml @@ -0,0 +1,38 @@ +# nfpm_incus-client.yaml + +name: incus-client +version: ${PACKAGE_VERSION} +release: ${PACKAGE_RELEASE} +arch: amd64 +platform: linux +section: default +priority: extra +description: "Powerful system container and virtual machine manager." + +maintainer: Incus +homepage: https://github.com/lxc/incus +license: Apache-2.0 + +disable_globbing: false + +replaces: + - incus-client + +recommends: + - incus-tools + +# Files to include in the package +contents: + - src: /root/go/bin/incus + dst: /usr/bin/incus + file_info: + mode: 0755 + owner: root + group: root + +# Scripts to run during installation/removal (optional) +# scripts: +# postinstall: ./scripts/postinstall.sh +# postremove: ./scripts/postremove.sh +# preinstall: ./scripts/preinstall.sh +# preremove: ./scripts/preremove.sh diff --git a/rpms/incus/resources/nfpm_incus-tools.yaml b/rpms/incus/resources/nfpm_incus-tools.yaml new file mode 100644 index 0000000..386caa5 --- /dev/null +++ b/rpms/incus/resources/nfpm_incus-tools.yaml @@ -0,0 +1,59 @@ +# nfpm_incus-tools.yaml + +name: incus-tools +version: ${PACKAGE_VERSION} +release: ${PACKAGE_RELEASE} +arch: amd64 +platform: linux +section: default +priority: extra +description: "Powerful system container and virtual machine manager." + +maintainer: Incus +homepage: https://github.com/lxc/incus +license: Apache-2.0 + +disable_globbing: false + +replaces: + - incus-tools + +# Files to include in the package +contents: + - src: /root/go/bin/incus-benchmark + dst: /usr/bin/incus-benchmark + file_info: + mode: 0755 + owner: root + group: root + - src: /root/go/bin/incus-migrate + dst: /usr/bin/incus-migrate + file_info: + mode: 0755 + owner: root + group: root + - src: /root/go/bin/incus-agent + dst: /usr/bin/incus-agent + file_info: + mode: 0755 + owner: root + group: root + - src: /root/go/bin/lxc-to-incus + dst: /usr/bin/lxc-to-incus + file_info: + mode: 0755 + owner: root + group: root + - src: /root/go/bin/lxd-to-incus + dst: /usr/bin/lxd-to-incus + file_info: + mode: 0755 + owner: root + group: root + +# Scripts to run during installation/removal (optional) +# scripts: +# postinstall: ./scripts/postinstall.sh +# postremove: ./scripts/postremove.sh +# preinstall: ./scripts/preinstall.sh +# preremove: ./scripts/preremove.sh diff --git a/rpms/incus/resources/nfpm_incus.yaml b/rpms/incus/resources/nfpm_incus.yaml new file mode 100644 index 0000000..6216338 --- /dev/null +++ b/rpms/incus/resources/nfpm_incus.yaml @@ -0,0 +1,98 @@ +# nfpm_incus.yaml + +name: incus +version: ${PACKAGE_VERSION} +release: ${PACKAGE_RELEASE} +arch: amd64 +platform: linux +section: default +priority: extra +description: "Powerful system container and virtual machine manager." + +maintainer: Incus +homepage: https://github.com/lxc/incus +license: Apache-2.0 + +disable_globbing: false + +replaces: + - incus + +depends: + - incus-client + - lxcfs + - cowsql + - raft + +recommends: + - incus-tools + +# Files to include in the package +contents: + - src: /root/go/bin/incusd + dst: /usr/libexec/incus/incusd + file_info: + mode: 0755 + owner: root + group: root + - src: /root/go/bin/incus-user + dst: /usr/libexec/incus/incus-user + file_info: + mode: 0755 + owner: root + group: root + - src: /app/resources/shutdown + dst: /usr/libexec/incus/shutdown + file_info: + mode: 0755 + owner: root + group: root + - src: /app/resources/incus.service + dst: /usr/lib/systemd/system/incus.service + file_info: + mode: 0644 + owner: root + group: root + - src: /app/resources/incus.socket + dst: /usr/lib/systemd/system/incus.socket + file_info: + mode: 0644 + owner: root + group: root + - src: /app/resources/incus-user.service + dst: /usr/lib/systemd/system/incus-user.service + file_info: + mode: 0644 + owner: root + group: root + - src: /app/resources/incus-user.socket + dst: /usr/lib/systemd/system/incus-user.socket + file_info: + mode: 0644 + owner: root + group: root + - src: /app/resources/incus-startup.service + dst: /usr/lib/systemd/system/incus-startup.service + file_info: + mode: 0644 + owner: root + group: root + - src: /app/resources/sysusers.d.incus.conf + dst: /usr/lib/sysusers.d/incus.conf + file_info: + mode: 0644 + owner: root + group: root + - src: /app/resources/tmpfiles.d.incus.conf + dst: /usr/lib/tmpfiles.d/incus.conf + file_info: + mode: 0644 + owner: root + group: root + +# Scripts to run during installation/removal (optional) +scripts: + postinstall: ./scripts/postinstall.sh + preremove: ./scripts/preremove.sh + postremove: ./scripts/postremove.sh + preinstall: ./scripts/preinstall.sh diff --git a/rpms/incus/resources/shutdown b/rpms/incus/resources/shutdown new file mode 100644 index 0000000..e145543 --- /dev/null +++ b/rpms/incus/resources/shutdown @@ -0,0 +1,7 @@ +#!/usr/bin/sh + +if ! systemctl -q is-active incus.service; then + exit 0 +fi + +exec /usr/lib/incus/incusd shutdown diff --git a/rpms/incus/resources/sysusers.d.incus.conf b/rpms/incus/resources/sysusers.d.incus.conf new file mode 100644 index 0000000..613b880 --- /dev/null +++ b/rpms/incus/resources/sysusers.d.incus.conf @@ -0,0 +1,2 @@ +g incus-admin - +g incus - diff --git a/rpms/incus/resources/tmpfiles.d.incus.conf b/rpms/incus/resources/tmpfiles.d.incus.conf new file mode 100644 index 0000000..2e66a6d --- /dev/null +++ b/rpms/incus/resources/tmpfiles.d.incus.conf @@ -0,0 +1,4 @@ +d /var/cache/incus 0700 root root - - +d /var/log/incus 0700 root root - - +d /var/lib/incus 0711 root root - - +d /run/incus 0711 root root - - diff --git a/rpms/incus/scripts/build-packages.sh b/rpms/incus/scripts/build-packages.sh new file mode 100755 index 0000000..9489094 --- /dev/null +++ b/rpms/incus/scripts/build-packages.sh @@ -0,0 +1,4 @@ +#!/usr/bin/bash +nfpm pkg --config /app/resources/nfpm_incus.yaml --target /app/dist --packager rpm && \ +nfpm pkg --config /app/resources/nfpm_incus-client.yaml --target /app/dist --packager rpm && \ +nfpm pkg --config /app/resources/nfpm_incus-tools.yaml --target /app/dist --packager rpm diff --git a/rpms/incus/scripts/postinstall.sh b/rpms/incus/scripts/postinstall.sh new file mode 100755 index 0000000..50041ee --- /dev/null +++ b/rpms/incus/scripts/postinstall.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +systemctl daemon-reload diff --git a/rpms/incus/scripts/postremove.sh b/rpms/incus/scripts/postremove.sh new file mode 100755 index 0000000..c5cbb5f --- /dev/null +++ b/rpms/incus/scripts/postremove.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +systemctl daemon-reload +rm -rf /usr/libexec/incus +groupdel incus-admin +groupdel incus diff --git a/rpms/incus/scripts/preinstall.sh b/rpms/incus/scripts/preinstall.sh new file mode 100755 index 0000000..3199ec2 --- /dev/null +++ b/rpms/incus/scripts/preinstall.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +mkdir -p /usr/libexec/incus/ +groupadd --system incus-admin +groupadd --system incus diff --git a/rpms/incus/scripts/preremove.sh b/rpms/incus/scripts/preremove.sh new file mode 100755 index 0000000..2bb3a52 --- /dev/null +++ b/rpms/incus/scripts/preremove.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +systemctl stop incus.service +systemctl stop incus.socket +systemctl stop incus-user.service +systemctl stop incus-user.socket +systemctl stop incus-startup.service