Files
RDtop/scripts/host/setup-host-rustdesk.sh
Orchestrator 43e7b30f41 feat: add host setup scripts + configs for Intel Alder Lake-N
- scripts/host/setup-host-rustdesk.sh: protect RustDesk ID on host
- scripts/host/README-host.md: instructions for manual apply
- configs/rustdesk2-host.toml.template: config template
- configs/systemd/: systemd units for both VPS and host
2026-05-16 00:16:14 +01:00

208 lines
7.8 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
set -euo pipefail
#######################################
# setup-host-rustdesk.sh
# Защита RustDesk ID на хосте Intel Alder Lake-N
# Запускать от root
#######################################
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LOG="$SCRIPT_DIR/setup-host-rustdesk.log"
USER_HOME="${USER_HOME:-/home/user}"
USER="${USER:-user}"
RUSTDESK_DIR="$USER_HOME/.config/rustdesk"
CONFIG_FILE="$RUSTDESK_DIR/RustDesk.toml"
log() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG"; }
warn() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] WARN: $1" | tee -a "$LOG" >&2; }
fail() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] FATAL: $1" | tee -a "$LOG" >&2; exit 1; }
[[ $EUID -ne 0 ]] && fail "Этот скрипт нужно запускать от root: sudo bash setup-host-rustdesk.sh"
log "========== Начало настройки RustDesk на хосте =========="
log "USER_HOME=$USER_HOME | USER=$USER"
# 1. Проверить dummy Xorg (GNOME с dummy-драйвером должен показывать монитор)
log "--- Шаг 1: Проверка dummy Xorg ---"
# systemd-сервис xorg-dummy уже должен быть создан пользователем или предыдущими сессиями
if systemctl is-active --quiet xorg-dummy 2>/dev/null; then
log "xorg-dummy.service: ACTIVE"
elif systemctl is-active --quiet xorg-dummy@"$USER" 2>/dev/null; then
log "xorg-dummy@$USER.service: ACTIVE"
else
warn "xorg-dummy.service не найден в активных юнитах. Это может быть нормально, если драйвер загружен иначе."
fi
# Проверяем через xrandr у активного пользователя (display :1 для dummy)
if DISPLAY=:1 xrandr --listmonitors 2>/dev/null | grep -qi "DUMMY\|dummy"; then
log "xrandr: dummy монитор обнаружен (DISPLAY=:1)"
else
warn "xrandr не нашел DUMMY монитор на DISPLAY=:1. Попробуйте DISPLAY=:0"
fi
log "--- Шаг 2: Статус локального клиента RustDesk --"
if systemctl is-active --quiet rustdesk-client-local 2>/dev/null; then
log "rustdesk-client-local.service: ACTIVE"
else
warn "rustdesk-client-local.service: NOT ACTIVE — будет создан/включён ниже"
fi
# 2. Проверить/создать RustDesk.toml и защитить его
log "--- Шаг 3: Проверка/создание RustDesk.toml ---"
mkdir -p "$RUSTDESK_DIR"
if [[ -f "$CONFIG_FILE" ]]; then
log "RustDesk.toml найден: $CONFIG_FILE"
# Показать текущий ID
CURRENT_ID=$(rustdesk --get-id 2>/dev/null || echo "N/A")
log "Текущий RustDesk ID: $CURRENT_ID"
# Убедиться что в конфиге нужный сервер
if grep -q 'custom-rendezvous-server' "$CONFIG_FILE"; then
log "custom-rendezvous-server уже задан в конфиге"
else
log "custom-rendezvous-server НЕ задан — добавляем публичный сервер"
cat >> "$CONFIG_FILE" <<'TOML'
[options]
custom-rendezvous-server = "rs-ny.rustdesk.com:21116"
TOML
fi
else
CURRENT_ID=$(rustdesk --get-id 2>/dev/null || echo "")
if [[ -z "$CURRENT_ID" ]]; then
warn "RustDesk.toml ОТСУТСТВУЕТ, и rustdesk --get-id не вернул ID."
warn "Возможно, RustDesk ещё ни разу не запускался с GUI (нужен xorg-dummy)."
warn "Если ID ещё не сгенерирован — создайте конфиг вручную:"
warn " mkdir -p $RUSTDESK_DIR && cat > $CONFIG_FILE <<'TOML'"
warn " [options]"
warn " custom-rendezvous-server = \"rs-ny.rustdesk.com:21116\""
warn " TOML"
warn "Затем перезапустите rustdesk-client-local и повторите скрипт."
else
log "ID получен ($CURRENT_ID), но RustDesk.toml отсутствует — создаём из текущих настроек"
cat > "$CONFIG_FILE" <<TOML
[options]
custom-rendezvous-server = "rs-ny.rustdesk.com:21116"
TOML
fi
fi
# Правильные права
chown -R "$USER:$USER" "$RUSTDESK_DIR"
chmod 600 "$CONFIG_FILE"
# 3. Защита chattr +i (только root)
log "--- Шаг 4: Применение chattr +i к RustDesk.toml ---"
if [[ -f "$CONFIG_FILE" ]]; then
chattr +i "$CONFIG_FILE"
log "chattr +i применён к $CONFIG_FILE"
lsattr "$CONFIG_FILE" | tee -a "$LOG"
else
warn "Файл $CONFIG_FILE не существует — chattr +i НЕ применён!"
warn "Сначала убедитесь, что RustDesk сгенерировал конфигурацию."
fi
# 4. Создать/обновить write-rustdesk-config.sh (для экстренной перезаписи)
WRITE_SCRIPT="$SCRIPT_DIR/write-rustdesk-config.sh"
log "--- Шаг 5: Создание write-rustdesk-config.sh ---"
cat > "$WRITE_SCRIPT" <<'SCRIPT'
#!/usr/bin/env bash
# Этот скрипт временно снимает защиту, перезаписывает конфиг и ставит защиту обратно.
# Запускать от root только если понимаете зачем.
set -euo pipefail
USER="${1:-user}"
USER_HOME="/home/$USER"
CONFIG_FILE="$USER_HOME/.config/rustdesk/RustDesk.toml"
[[ $EUID -ne 0 ]] && { echo "Run as root"; exit 1; }
if [[ ! -f "$CONFIG_FILE" ]]; then
echo "Файл $CONFIG_FILE не найден. Нечего перезаписывать."
exit 1
fi
echo "Снимаем immutable..."
chattr -i "$CONFIG_FILE"
echo "Перезаписываем RustDesk.toml..."
cat > "$CONFIG_FILE" <<'TOML'
[options]
custom-rendezvous-server = "rs-ny.rustdesk.com:21116"
TOML
chown "$USER:$USER" "$CONFIG_FILE"
chmod 600 "$CONFIG_FILE"
echo "Ставим immutable обратно..."
chattr +i "$CONFIG_FILE"
lsattr "$CONFIG_FILE"
echo "Готово."
SCRIPT
chmod +x "$WRITE_SCRIPT"
chown root:root "$WRITE_SCRIPT"
log "write-rustdesk-config.sh создан: $WRITE_SCRIPT"
# 5. Создать/обновить systemd-сервис rustdesk-client-local
SERVICE_FILE="/etc/systemd/system/rustdesk-client-local.service"
log "--- Шаг 6: Создание systemd unit rustdesk-client-local.service ---"
if [[ -f "$SERVICE_FILE" ]]; then
cp "$SERVICE_FILE" "$SERVICE_FILE.bak.$(date +%s)"
log "Backup создан: $SERVICE_FILE.bak.*"
fi
cat > "$SERVICE_FILE" <<EOF
[Unit]
Description=RustDesk Client Local (headless host)
After=network.target xorg-dummy.service
Wants=xorg-dummy.service
[Service]
Type=simple
User=$USER
Environment=DISPLAY=:1
Environment=XAUTHORITY=$USER_HOME/.Xauthority
WorkingDirectory=$USER_HOME
ExecStart=/usr/bin/rustdesk --tray
Restart=always
RestartSec=5
StartLimitInterval=60
StartLimitBurst=3
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now rustdesk-client-local.service || true
log "rustdesk-client-local.service: enabled & restarted"
# 6. Текущий ID
log "--- Шаг 7: Проверка RustDesk ID хоста ---"
ID=$(rustdesk --get-id 2>/dev/null || echo "")
if [[ -n "$ID" ]]; then
log "ТЕКУЩИЙ RUSTDESK ID: $ID"
else
warn "Не удалось получить ID (rustdesk --get-id вернул пустоту)"
warn "Убедитесь, что rustdesk установлен и systemd-сервис запущён."
fi
# Summary
log "========== Результат =========="
log "RustDesk ID: ${ID:-пусто}"
log "Конфиг защищён chattr: $(lsattr "$CONFIG_FILE" 2>/dev/null || echo 'не удалось проверить')"
log "systemd unit: $(systemctl is-active rustdesk-client-local 2>/dev/null || echo 'неактивен')"
log "Записи в systemd journal: journalctl -u rustdesk-client-local -f"
log "Лог скрипта: $LOG"
log "Готово."