#!/usr/bin/env bash # install_systemd.sh — Install saltybot systemd services on Orin # Run as root: sudo ./systemd/install_systemd.sh set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_DIR="$(dirname "${SCRIPT_DIR}")" SYSTEMD_DIR="/etc/systemd/system" DEPLOY_DIR="/opt/saltybot/jetson" UDEV_DIR="/etc/udev/rules.d" BRINGUP_SYSTEMD="${REPO_DIR}/ros2_ws/src/saltybot_bringup/systemd" BRINGUP_UDEV="${REPO_DIR}/ros2_ws/src/saltybot_bringup/udev" log() { echo "[install_systemd] $*"; } [[ "$(id -u)" == "0" ]] || { echo "Run as root"; exit 1; } # Deploy repo to /opt/saltybot/jetson log "Deploying to ${DEPLOY_DIR}..." mkdir -p "${DEPLOY_DIR}" rsync -a --exclude='.git' --exclude='__pycache__' \ "${REPO_DIR}/" "${DEPLOY_DIR}/" # Install service files log "Installing systemd units..." cp "${SCRIPT_DIR}/saltybot.target" "${SYSTEMD_DIR}/" cp "${SCRIPT_DIR}/saltybot-social.service" "${SYSTEMD_DIR}/" cp "${SCRIPT_DIR}/tailscale-vpn.service" "${SYSTEMD_DIR}/" cp "${BRINGUP_SYSTEMD}/can-bringup.service" "${SYSTEMD_DIR}/" # Install udev rules log "Installing udev rules..." mkdir -p "${UDEV_DIR}" cp "${BRINGUP_UDEV}/70-canable.rules" "${UDEV_DIR}/" cp "${BRINGUP_UDEV}/90-magedok-touch.rules" "${UDEV_DIR}/" udevadm control --reload udevadm trigger --subsystem-match=net --action=add # Reload and enable systemctl daemon-reload systemctl enable saltybot.target systemctl enable saltybot-social.service systemctl enable tailscale-vpn.service systemctl enable can-bringup.service log "Services installed. Start with:" log " systemctl start saltybot-social" log " systemctl start tailscale-vpn" log " systemctl start can-bringup" log " journalctl -fu saltybot-social" log " journalctl -fu tailscale-vpn" log " journalctl -fu can-bringup" log "" log "Verify CAN bus: candump can0" log " VESC CAN IDs: 61 (0x3D) and 79 (0x4F)"