109 lines
3.8 KiB
Bash
Executable file
109 lines
3.8 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
BIN_DIR="${BIN_DIR:-$HOME/.local/bin}"
|
|
SERVICE_DIR="${HOME}/.config/systemd/user"
|
|
CONFIG_DIR="${HOME}/.config/bread"
|
|
MODULES_DIR="${CONFIG_DIR}/modules"
|
|
|
|
# ── build ──────────────────────────────────────────────────────────────────────
|
|
echo "building bread (release)..."
|
|
cargo build --release --manifest-path "$REPO_ROOT/Cargo.toml"
|
|
echo ""
|
|
|
|
# ── symlinks ───────────────────────────────────────────────────────────────────
|
|
echo "symlinking binaries into $BIN_DIR..."
|
|
mkdir -p "$BIN_DIR"
|
|
ln -sf "$REPO_ROOT/target/release/breadd" "$BIN_DIR/breadd"
|
|
ln -sf "$REPO_ROOT/target/release/bread" "$BIN_DIR/bread"
|
|
echo " $BIN_DIR/breadd -> $REPO_ROOT/target/release/breadd"
|
|
echo " $BIN_DIR/bread -> $REPO_ROOT/target/release/bread"
|
|
|
|
if [[ ":$PATH:" != *":$BIN_DIR:"* ]]; then
|
|
echo ""
|
|
echo " note: $BIN_DIR is not in PATH — add to your shell profile:"
|
|
echo " export PATH=\"\$HOME/.local/bin:\$PATH\""
|
|
fi
|
|
echo ""
|
|
|
|
# ── config ─────────────────────────────────────────────────────────────────────
|
|
echo "setting up config..."
|
|
mkdir -p "$CONFIG_DIR" "$MODULES_DIR"
|
|
|
|
if [[ ! -f "$CONFIG_DIR/breadd.toml" ]]; then
|
|
cat > "$CONFIG_DIR/breadd.toml" << 'EOF'
|
|
[daemon]
|
|
log_level = "info"
|
|
|
|
[lua]
|
|
entry_point = "~/.config/bread/init.lua"
|
|
module_path = "~/.config/bread/modules"
|
|
|
|
[adapters.hyprland]
|
|
enabled = true
|
|
|
|
[adapters.udev]
|
|
enabled = true
|
|
|
|
[adapters.power]
|
|
enabled = true
|
|
|
|
[adapters.network]
|
|
enabled = true
|
|
EOF
|
|
echo " created $CONFIG_DIR/breadd.toml"
|
|
else
|
|
echo " $CONFIG_DIR/breadd.toml already exists, skipping"
|
|
fi
|
|
|
|
if [[ ! -f "$CONFIG_DIR/init.lua" ]]; then
|
|
cat > "$CONFIG_DIR/init.lua" << 'EOF'
|
|
-- bread init.lua — loaded before modules, use for global setup
|
|
bread.log("bread started")
|
|
EOF
|
|
echo " created $CONFIG_DIR/init.lua"
|
|
else
|
|
echo " $CONFIG_DIR/init.lua already exists, skipping"
|
|
fi
|
|
echo ""
|
|
|
|
# ── systemd user service ───────────────────────────────────────────────────────
|
|
echo "installing systemd user service..."
|
|
mkdir -p "$SERVICE_DIR"
|
|
# Patch ExecStart to match the actual install location rather than hardcoding /usr/bin.
|
|
sed "s|ExecStart=.*|ExecStart=$BIN_DIR/breadd|" \
|
|
"$REPO_ROOT/packaging/systemd/breadd.service" \
|
|
> "$SERVICE_DIR/breadd.service"
|
|
echo " installed $SERVICE_DIR/breadd.service (ExecStart=$BIN_DIR/breadd)"
|
|
|
|
systemctl --user daemon-reload
|
|
|
|
if systemctl --user is-active --quiet breadd 2>/dev/null; then
|
|
systemctl --user restart breadd
|
|
echo " breadd restarted"
|
|
else
|
|
systemctl --user enable --now breadd
|
|
echo " breadd enabled and started"
|
|
fi
|
|
echo ""
|
|
|
|
# ── verify ─────────────────────────────────────────────────────────────────────
|
|
# Wait up to ~5s for the daemon to come up. Polling beats a fixed sleep
|
|
# because a freshly enabled systemd unit can take a variable amount of time
|
|
# to fork, bind the socket, and become ready.
|
|
ready=0
|
|
for _ in $(seq 1 25); do
|
|
if "$BIN_DIR/bread" ping &>/dev/null; then
|
|
ready=1
|
|
break
|
|
fi
|
|
sleep 0.2
|
|
done
|
|
|
|
if [[ "$ready" -eq 1 ]]; then
|
|
"$BIN_DIR/bread" doctor
|
|
else
|
|
echo "warning: daemon did not respond to ping within 5s"
|
|
echo " check: journalctl --user -u breadd -n 20"
|
|
fi
|