80 lines
2.9 KiB
Bash
Executable File
80 lines
2.9 KiB
Bash
Executable File
#!/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() { # <role>
|
|
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() { # <role>
|
|
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)"
|