#!/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" < "$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" </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 "Готово."