#!/bin/bash # SPDX-License-Identifier: Apache-2.0 # Build one vpp-maglev* Debian package for one architecture. # Usage: build-deb.sh # # is one of: # vpp-maglevd — health-checker daemon + optional web dashboard, # with both systemd units, the default config, and # the /etc/default/vpp-maglev environment file. # vpp-maglev — maglevc CLI client and maglevt out-of-band tester. # Pure client-side tools, no systemd units, no conffiles. # # The commit hash is baked into the binaries at link time via -ldflags # in the Makefile, so `maglevd --version` / `maglevc --version` / etc. # are the source of truth for "which build". The .deb itself carries # only the release version. set -euo pipefail PACKAGE="${1:?usage: build-deb.sh }" ARCH="${2:?usage: build-deb.sh }" VERSION="${3:?usage: build-deb.sh }" REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" PKG="${PACKAGE}_${VERSION}_${ARCH}" STAGING="$(mktemp -d)" trap 'rm -rf "$STAGING"' EXIT echo "Building ${PKG}.deb" install -d "$STAGING/DEBIAN" case "$PACKAGE" in vpp-maglevd) install -d "$STAGING/usr/sbin" install -d "$STAGING/usr/share/man/man8" install -d "$STAGING/lib/systemd/system" install -d "$STAGING/etc/default" install -d "$STAGING/etc/vpp-maglev" # Binaries. Both daemons live under /usr/sbin; they are long-running # services, not interactive tools. install -m 755 "$REPO_ROOT/build/${ARCH}/maglevd" "$STAGING/usr/sbin/maglevd" install -m 755 "$REPO_ROOT/build/${ARCH}/maglevd-frontend" "$STAGING/usr/sbin/maglevd-frontend" # Man pages gzip -9 -c "$REPO_ROOT/docs/maglevd.8" > "$STAGING/usr/share/man/man8/maglevd.8.gz" gzip -9 -c "$REPO_ROOT/docs/maglevd-frontend.8" > "$STAGING/usr/share/man/man8/maglevd-frontend.8.gz" # Systemd units install -m 644 "$REPO_ROOT/debian/vpp-maglev.service" "$STAGING/lib/systemd/system/vpp-maglev.service" install -m 644 "$REPO_ROOT/debian/vpp-maglev-frontend.service" "$STAGING/lib/systemd/system/vpp-maglev-frontend.service" # /etc/default/vpp-maglev (conffile — dpkg won't overwrite on upgrade) install -m 644 "$REPO_ROOT/debian/default.vpp-maglev" "$STAGING/etc/default/vpp-maglev" # /etc/vpp-maglev/maglev.yaml (conffile) install -m 644 "$REPO_ROOT/debian/maglev.yaml" "$STAGING/etc/vpp-maglev/maglev.yaml" # DEBIAN metadata sed "s/@VERSION@/${VERSION}/;s/@ARCH@/${ARCH}/" \ "$REPO_ROOT/debian/vpp-maglevd.control.in" > "$STAGING/DEBIAN/control" install -m 644 "$REPO_ROOT/debian/vpp-maglevd.conffiles" "$STAGING/DEBIAN/conffiles" install -m 755 "$REPO_ROOT/debian/vpp-maglevd.postinst" "$STAGING/DEBIAN/postinst" install -m 755 "$REPO_ROOT/debian/vpp-maglevd.prerm" "$STAGING/DEBIAN/prerm" install -m 755 "$REPO_ROOT/debian/vpp-maglevd.postrm" "$STAGING/DEBIAN/postrm" ;; vpp-maglev) install -d "$STAGING/usr/bin" install -d "$STAGING/usr/share/man/man1" # Binaries. Both client tools live under /usr/bin so they land on # every login shell's PATH without needing /usr/sbin on PATH. install -m 755 "$REPO_ROOT/build/${ARCH}/maglevc" "$STAGING/usr/bin/maglevc" install -m 755 "$REPO_ROOT/build/${ARCH}/maglevt" "$STAGING/usr/bin/maglevt" # Man pages gzip -9 -c "$REPO_ROOT/docs/maglevc.1" > "$STAGING/usr/share/man/man1/maglevc.1.gz" gzip -9 -c "$REPO_ROOT/docs/maglevt.1" > "$STAGING/usr/share/man/man1/maglevt.1.gz" # DEBIAN metadata. The client package has no conffiles and no # maintainer scripts — it ships binaries and manpages only. sed "s/@VERSION@/${VERSION}/;s/@ARCH@/${ARCH}/" \ "$REPO_ROOT/debian/vpp-maglev.control.in" > "$STAGING/DEBIAN/control" ;; *) echo "error: unknown package '${PACKAGE}' (expected vpp-maglevd or vpp-maglev)" >&2 exit 2 ;; esac # Emit package into build/ mkdir -p "$REPO_ROOT/build" OUT="$REPO_ROOT/build/${PKG}.deb" dpkg-deb --build --root-owner-group "$STAGING" "$OUT" echo "Built: $OUT"