mako 1.10 only searches $XDG_CONFIG_HOME/mako/config and ~/.mako/config — confirmed against the shipped binary, and mako(5) documents no system path. The config installed to /etc/xdg/mako/config would have been read by nothing and every notification would have come out stock. Ship it alongside the rest of the package's config in /etc/ekklesia-classroom/mako/ and name it on mako's command line, which also keeps it dpkg-owned instead of writing into the user's home. Start mako before the dock as well, so nothing can send a notification early and have D-Bus activate an unstyled instance that then holds the bus name for the rest of the session. Co-Authored-By: Claude Opus 5 <[email protected]>
181 lines
4.9 KiB
Bash
Executable File
181 lines
4.9 KiB
Bash
Executable File
#!/bin/bash
|
|
set -euo pipefail
|
|
|
|
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
cd "$ROOT"
|
|
|
|
if [[ $# -ne 1 ]]; then
|
|
echo "Usage: $0 VERSION"
|
|
exit 1
|
|
fi
|
|
|
|
VERSION="$1"
|
|
|
|
if [[ ! "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
echo "Invalid version: $VERSION"
|
|
echo "Expected MAJOR.MINOR.PATCH, for example 0.1.6"
|
|
exit 1
|
|
fi
|
|
|
|
STAGE="$ROOT/packaging/root"
|
|
OUTPUT="$ROOT/dist/ekklesia-classroom_${VERSION}_amd64.deb"
|
|
|
|
# Syntax check everything the package ships, by shebang, so this cannot
|
|
# drift out of date as classroom commands are added.
|
|
echo "Validating sources"
|
|
|
|
for script in "$ROOT/packaging/debian/postinst" "$ROOT"/scripts/*; do
|
|
[[ -f "$script" ]] || continue
|
|
|
|
case "$(head -n 1 "$script")" in
|
|
*python3*)
|
|
python3 -m py_compile "$script"
|
|
;;
|
|
*bash*|*bin/sh*)
|
|
bash -n "$script"
|
|
;;
|
|
esac
|
|
done
|
|
|
|
for module in "$ROOT"/lib/*.py; do
|
|
[[ -f "$module" ]] || continue
|
|
|
|
python3 -m py_compile "$module"
|
|
done
|
|
|
|
for policy in "$ROOT"/config/chrome/policies/*/*.json; do
|
|
[[ -f "$policy" ]] || continue
|
|
|
|
python3 -c 'import json, sys; json.load(open(sys.argv[1]))' "$policy"
|
|
done
|
|
|
|
find "$ROOT/scripts" "$ROOT/lib" \
|
|
-name '__pycache__' -type d -prune -exec rm -rf {} + 2>/dev/null || true
|
|
|
|
echo "Building Ekklesia Classroom ${VERSION}"
|
|
|
|
# Always construct the package from clean canonical sources.
|
|
rm -rf "$STAGE"
|
|
mkdir -p "$STAGE/DEBIAN" "$ROOT/dist"
|
|
|
|
# Debian package metadata.
|
|
sed \
|
|
"s/^Version: @VERSION@$/Version: ${VERSION}/" \
|
|
"$ROOT/packaging/debian/control.template" \
|
|
> "$STAGE/DEBIAN/control"
|
|
|
|
install -m755 \
|
|
"$ROOT/packaging/debian/postinst" \
|
|
"$STAGE/DEBIAN/postinst"
|
|
|
|
# Classroom UI configuration.
|
|
install -Dm644 \
|
|
"$ROOT/config/sway/config" \
|
|
"$STAGE/etc/ekklesia-classroom/sway/config"
|
|
|
|
install -Dm644 \
|
|
"$ROOT/config/waybar/config.jsonc" \
|
|
"$STAGE/etc/ekklesia-classroom/waybar/config.jsonc"
|
|
|
|
install -Dm644 \
|
|
"$ROOT/config/waybar/style.css" \
|
|
"$STAGE/etc/ekklesia-classroom/waybar/style.css"
|
|
|
|
# Classroom commands.
|
|
install -Dm755 \
|
|
"$ROOT/scripts/classroom-browser" \
|
|
"$STAGE/usr/local/bin/classroom-browser"
|
|
|
|
install -Dm755 \
|
|
"$ROOT/scripts/classroom-window" \
|
|
"$STAGE/usr/local/bin/classroom-window"
|
|
|
|
install -Dm755 \
|
|
"$ROOT/scripts/classroom-dvd" \
|
|
"$STAGE/usr/local/bin/classroom-dvd"
|
|
|
|
install -Dm755 \
|
|
"$ROOT/scripts/classroom-dvd-css-setup" \
|
|
"$STAGE/usr/local/bin/classroom-dvd-css-setup"
|
|
|
|
install -Dm755 \
|
|
"$ROOT/scripts/classroom-notify-test" \
|
|
"$STAGE/usr/local/bin/classroom-notify-test"
|
|
|
|
# Shared helpers imported by the dock and by classroom-dvd.
|
|
install -Dm644 \
|
|
"$ROOT/lib/classroom_optical.py" \
|
|
"$STAGE/usr/local/lib/ekklesia-classroom/classroom_optical.py"
|
|
|
|
install -Dm644 \
|
|
"$ROOT/config/wallpapers/classroom-default.png" \
|
|
"$STAGE/usr/share/backgrounds/ekklesia/classroom-default.png"
|
|
|
|
install -Dm755 \
|
|
"$ROOT/scripts/classroom-dock" \
|
|
"$STAGE/usr/local/bin/classroom-dock"
|
|
|
|
install -Dm644 \
|
|
"$ROOT/config/dock/style.css" \
|
|
"$STAGE/etc/ekklesia-classroom/dock/style.css"
|
|
|
|
# Notification styling, matched to the dock. mako only searches
|
|
# ~/.config, so sway starts it with an explicit --config path.
|
|
install -Dm644 \
|
|
"$ROOT/config/mako/config" \
|
|
"$STAGE/etc/ekklesia-classroom/mako/config"
|
|
|
|
# Chrome enterprise policy: suppress first-run and sign-in nags, and pin
|
|
# Home to Wonder Ink. Nothing here restricts where teachers can browse.
|
|
install -Dm644 \
|
|
"$ROOT/config/chrome/policies/managed/ekklesia-classroom.json" \
|
|
"$STAGE/etc/opt/chrome/policies/managed/ekklesia-classroom.json"
|
|
|
|
install -Dm644 \
|
|
"$ROOT/config/chrome/policies/recommended/ekklesia-classroom.json" \
|
|
"$STAGE/etc/opt/chrome/policies/recommended/ekklesia-classroom.json"
|
|
|
|
install -Dm755 \
|
|
"$ROOT/scripts/ekklesia-classroom-update" \
|
|
"$STAGE/usr/local/bin/ekklesia-classroom-update"
|
|
|
|
# System configuration.
|
|
install -Dm644 \
|
|
"$ROOT/systemd/autologin/autologin.conf" \
|
|
"$STAGE/etc/systemd/system/[email protected]/autologin.conf"
|
|
|
|
install -Dm644 \
|
|
"$ROOT/systemd/updater/ekklesia-classroom-update.service" \
|
|
"$STAGE/etc/systemd/system/ekklesia-classroom-update.service"
|
|
|
|
install -Dm644 \
|
|
"$ROOT/systemd/updater/ekklesia-classroom-update.timer" \
|
|
"$STAGE/etc/systemd/system/ekklesia-classroom-update.timer"
|
|
|
|
install -Dm644 \
|
|
"$ROOT/config/icons/dvd.svg" \
|
|
"$STAGE/etc/ekklesia-classroom/icons/dvd.svg"
|
|
|
|
install -Dm644 \
|
|
"$ROOT/config/icons/live.svg" \
|
|
"$STAGE/etc/ekklesia-classroom/icons/live.svg"
|
|
|
|
install -Dm644 \
|
|
"$ROOT/config/icons/live-off.svg" \
|
|
"$STAGE/etc/ekklesia-classroom/icons/live-off.svg"
|
|
|
|
install -Dm644 \
|
|
"$ROOT/config/icons/browser.svg" \
|
|
"$STAGE/etc/ekklesia-classroom/icons/browser.svg"
|
|
|
|
printf '%s\n' "$VERSION" > "$ROOT/VERSION"
|
|
|
|
dpkg-deb \
|
|
--root-owner-group \
|
|
--build "$STAGE" "$OUTPUT"
|
|
|
|
echo
|
|
echo "Built:"
|
|
echo "$OUTPUT"
|
|
sha256sum "$OUTPUT"
|