#!/usr/bin/env bash # Установка systemd-служб сетевого моста тележки. # # sudo ./install-bridge.sh [tx|rx|both|none] # # Аргумент выбирает, какую службу включить и запустить на ЭТОЙ машине # (tx — рядом с пультом, rx — рядом с тележкой). Без аргумента юниты только # ставятся, но не включаются. Файлы юнитов и шаблоны конфигов берутся из этого # каталога; пути к python и bridge.py подставляются автоматически. set -euo pipefail SELF="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" TOOLS="$(cd "$SELF/../tools" && pwd)" REPO="$(cd "$SELF/../../.." && pwd)" BRIDGE="$TOOLS/bridge.py" WORKDIR="$TOOLS" ENABLE="${1:-none}" case "$ENABLE" in tx|rx|both|none) ;; *) echo "аргумент: tx|rx|both|none" >&2; exit 2;; esac if [ "$(id -u)" -ne 0 ]; then echo "нужны права root — перезапускаюсь через sudo" exec sudo -E PYTHON="${PYTHON:-}" bash "$0" "$ENABLE" fi TARGET_USER="${SUDO_USER:-root}" # интерпретатор: venv проекта, если есть, иначе системный python3 PYTHON="${PYTHON:-}" if [ -z "$PYTHON" ]; then if [ -x "$REPO/.venv/bin/python" ]; then PYTHON="$REPO/.venv/bin/python" else PYTHON="$(command -v python3)" fi fi echo "python : $PYTHON" echo "bridge : $BRIDGE" echo "user : $TARGET_USER" if ! "$PYTHON" -c 'import serial' 2>/dev/null; then echo "ВНИМАНИЕ: в $PYTHON нет pyserial — поставь: $PYTHON -m pip install pyserial" >&2 fi gen_unit() { # local role="$1" sed -e "s|@PYTHON@|$PYTHON|g" -e "s|@BRIDGE@|$BRIDGE|g" \ -e "s|@WORKDIR@|$WORKDIR|g" -e "s|@USER@|$TARGET_USER|g" \ "$SELF/cart-bridge-$role.service" > "/etc/systemd/system/cart-bridge-$role.service" echo "установлен юнит /etc/systemd/system/cart-bridge-$role.service" } install -d -m 755 /etc/cart-bridge for role in tx rx; do gen_unit "$role" conf="/etc/cart-bridge/$role.env" if [ ! -e "$conf" ]; then install -m 600 "$SELF/cart-bridge-$role.env.example" "$conf" echo "создан конфиг $conf (ОТРЕДАКТИРУЙ: peer/bind и ключ)" else echo "конфиг $conf уже есть — не трогаю" fi done systemctl daemon-reload enable_one() { # systemctl enable --now "cart-bridge-$1.service" echo "включена и запущена cart-bridge-$1.service" } case "$ENABLE" in tx) enable_one tx ;; rx) enable_one rx ;; both) enable_one tx; enable_one rx ;; none) echo "юниты установлены, не включены. Включить: systemctl enable --now cart-bridge-tx (или -rx)";; esac echo "готово. Логи: journalctl -u cart-bridge-tx -f (или -rx)"