messenger/run
2026-03-06 16:39:39 -08:00

155 lines
5.4 KiB
Bash
Executable file

#!/bin/bash
set -euo pipefail
# @messenger — unified run command
#
# Usage:
# ./run deploy all Deploy backend + macOS agent + frontend
# ./run deploy backend Deploy backend to black
# ./run deploy macos Full deploy macOS agent + frontend to plum (rebuilds, re-signs)
# ./run deploy frontend Deploy frontend only to plum (no rebuild, preserves TCC)
# ./run logs backend Tail backend logs on black
# ./run logs macos Tail macOS agent logs on plum
# ./run status Check status of all services
# ./run version Show current version
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
VERSION_FILE="$SCRIPT_DIR/VERSION.json"
# shellcheck source=/dev/null
source "${HOME}/Code/@packages/@ts/@cli/bash-templates/lib/colors.sh"
usage() {
echo "Usage: ./run <command> [target]"
echo ""
echo "Commands:"
echo " deploy all Deploy everything (backend + macOS + frontend)"
echo " deploy backend Deploy backend to black"
echo " deploy macos Full deploy macOS agent to plum (rebuilds binary)"
echo " deploy frontend Deploy frontend only to plum (preserves TCC permissions)"
echo " logs backend Tail backend logs on black"
echo " logs macos Tail macOS agent logs on plum"
echo " status Check all service status"
echo " version Show current version"
exit 1
}
bump_version() {
if [[ ! -f "$VERSION_FILE" ]] || ! command -v jq &>/dev/null; then
echo -e "${YELLOW}${NC} Cannot bump version (missing VERSION.json or jq)"
return
fi
local builds major minor new_builds new_version today
builds=$(jq '.builds' "$VERSION_FILE")
major=$(jq -r '.major' "$VERSION_FILE")
minor=$(jq -r '.minor' "$VERSION_FILE")
new_builds=$((builds + 1))
new_version="${major}.${minor}.${new_builds}"
today=$(date +%Y-%m-%d)
jq --arg v "$new_version" --argjson b "$new_builds" --arg d "$today" \
'.builds = $b | .version = $v | .lastBuild = $d' \
"$VERSION_FILE" > "${VERSION_FILE}.tmp" && mv "${VERSION_FILE}.tmp" "$VERSION_FILE"
# Update backend package.json
local pkg="$SCRIPT_DIR/imessage-sync/backend/package.json"
if [[ -f "$pkg" ]]; then
jq --arg v "$new_version" '.version = $v' "$pkg" > "${pkg}.tmp" && mv "${pkg}.tmp" "$pkg"
fi
echo -e "${GREEN}${NC} Version: ${GREEN}${new_version}${NC}"
}
cmd_deploy() {
case "${1:-}" in
all)
bump_version
echo ""
"$SCRIPT_DIR/imessage-sync/deploy-backend.sh" --no-bump
echo ""
"$SCRIPT_DIR/imessage-macos/deploy-remote.sh" --no-bump
;;
backend)
bump_version
echo ""
exec "$SCRIPT_DIR/imessage-sync/deploy-backend.sh" --no-bump
;;
macos)
bump_version
echo ""
exec "$SCRIPT_DIR/imessage-macos/deploy-remote.sh" --no-bump
;;
frontend)
exec "$SCRIPT_DIR/imessage-macos/deploy-remote.sh" frontend
;;
*)
echo -e "${RED}Unknown deploy target: ${1:-}${NC}"
echo "Targets: all, backend, macos, frontend"
exit 1
;;
esac
}
cmd_logs() {
case "${1:-}" in
backend)
ssh black "journalctl -u messenger-imessage -f"
;;
macos)
ssh plum "tail -f ~/Library/Application\ Support/iMessageMacos/stderr.log"
;;
*)
echo -e "${RED}Unknown logs target: ${1:-}${NC}"
echo "Targets: backend, macos"
exit 1
;;
esac
}
cmd_status() {
if [[ -f "$VERSION_FILE" ]] && command -v jq &>/dev/null; then
echo -e "${BLUE}Version: $(jq -r '.version' "$VERSION_FILE") (built $(jq -r '.lastBuild' "$VERSION_FILE"))${NC}"
echo ""
fi
echo -e "${BLUE}━━━ Backend (black) ━━━${NC}"
if ssh -o ConnectTimeout=3 black "systemctl is-active --quiet messenger-imessage" 2>/dev/null; then
echo -e "${GREEN}${NC} messenger-imessage: running"
else
echo -e "${RED}${NC} messenger-imessage: stopped"
fi
echo ""
echo -e "${BLUE}━━━ macOS Agent (plum) ━━━${NC}"
if ssh -o ConnectTimeout=3 plum "pgrep -x iMessageMacos >/dev/null" 2>/dev/null; then
echo -e "${GREEN}${NC} iMessageMacos: running"
else
echo -e "${RED}${NC} iMessageMacos: stopped"
fi
echo ""
echo -e "${BLUE}━━━ Database ━━━${NC}"
if ssh -o ConnectTimeout=3 black "PGPASSWORD=devpassword psql -h localhost -p 25432 -U postgres -d messenger -c 'SELECT 1' >/dev/null 2>&1"; then
echo -e "${GREEN}${NC} PostgreSQL: reachable"
ssh black "PGPASSWORD=devpassword psql -h localhost -p 25432 -U postgres -d messenger -tAc \"SELECT 'Messages: ' || COUNT(*) FROM messages; SELECT 'Conversations: ' || COUNT(*) FROM conversations; SELECT 'Contacts: ' || COUNT(*) FROM contacts;\"" 2>/dev/null
else
echo -e "${RED}${NC} PostgreSQL: unreachable"
fi
}
cmd_version() {
if [[ -f "$VERSION_FILE" ]]; then
jq '.' "$VERSION_FILE"
else
echo "No VERSION.json found"
fi
}
case "${1:-}" in
deploy) cmd_deploy "${2:-}" ;;
logs) cmd_logs "${2:-}" ;;
status) cmd_status ;;
version) cmd_version ;;
*) usage ;;
esac