#!/bin/bash

# Проверка, запущен ли скрипт от root
if [ "$(id -u)" -ne 0 ]; then
    echo "Этот скрипт должен быть запущен с правами root!" >&2
    exit 1
fi

# Очистка директории БД 
rm -rf /opt/terminal/db/*

sed -i 's|http://raspbian.raspberrypi.org/raspbian/|http://legacy.raspbian.org/raspbian/|' /etc/apt/sources.list

# Пароль для пользователя postamat на удаленном сервере
REMOTE_PASSWORD="post#Admin"

# Обновляем информацию о пакетах чтобы не словить ошибки при скачивании
apt update

# Установка openssh-server (если ещё не установлен)
if ! systemctl is-active --quiet ssh; then
    echo "Установка openssh-server..."
    apt-get install -y openssh-server
    systemctl enable ssh
    systemctl start ssh
fi

# Установка autossh (если ещё не установлен)
if ! command -v autossh &> /dev/null; then
    echo "Установка autossh..."
    apt-get update && apt-get install -y autossh
fi

# Установка sshpass (если ещё не установлен)
if ! command -v sshpass &> /dev/null; then
    echo "Установка sshpass..."
    apt-get install -y sshpass
fi

# Изменяем пароль для пользователя pi
echo "Изменение пароля для пользователя pi..."
echo "pi:post#Admin" | sudo chpasswd

# Получаем ID терминала
echo "Получение ID терминала из конфигурации..."
TERMINAL_CONFIG="/opt/terminal/config/main.xml"

if [ -f "$TERMINAL_CONFIG" ]; then
    # Извлекаем ID терминала из XML файла
    TERMINAL_ID=$(grep -o 'terminal id="[0-9]*"' "$TERMINAL_CONFIG" | grep -o '[0-9]*')
    
    if [ -n "$TERMINAL_ID" ]; then
        echo "ID терминала: $TERMINAL_ID"
    else
        echo "Ошибка: Не удалось найти ID терминала в файле $TERMINAL_CONFIG"
        exit 1
    fi
else
    echo "Ошибка: Файл конфигурации $TERMINAL_CONFIG не найден"
    exit 1
fi

# Изменяем имя хоста
echo "Изменение имени хоста на postamat-$TERMINAL_ID..."
NEW_HOSTNAME="postamat-$TERMINAL_ID"

# Устанавливаем новое имя хоста
hostnamectl set-hostname "$NEW_HOSTNAME"

# Обновляем /etc/hosts
sed -i "s/127.0.1.1.*/127.0.1.1\t$NEW_HOSTNAME/" /etc/hosts

echo "Имя хоста изменено на: $NEW_HOSTNAME"

# Генерируем SSH ключи для пользователя pi, если их нет
echo "Генерация SSH ключей..."
sudo -u pi ssh-keygen -t ed25519 -f /home/pi/.ssh/id_ed25519 -y -q -N "" -C "pi@postomat-$TERMINAL_ID" -o

echo "Копирование SSH ключа на удаленный сервер..."
sshpass -p "$REMOTE_PASSWORD" ssh-copy-id -i /home/pi/.ssh/id_ed25519.pub -o StrictHostKeyChecking=no postamat@access.qsolution.ru

# Добавляем отпечаток хоста в known_hosts для пользователя root
echo "Добавление отпечатка хоста для пользователя root..."
mkdir -p /root/.ssh
ssh-keyscan access.qsolution.ru >> /root/.ssh/known_hosts 2>/dev/null

# Копируем SSH ключи в директорию root для удобства ручного использования
echo "Копирование SSH ключей в /root/.ssh/..."
cp /home/pi/.ssh/id_ed25519 /root/.ssh/
cp /home/pi/.ssh/id_ed25519.pub /root/.ssh/
chmod 600 /root/.ssh/id_ed25519
chmod 644 /root/.ssh/id_ed25519.pub

# Настройка автозапуска Reverse SSH (systemd)
echo "Создание systemd-сервиса для Reverse SSH..."

# Используем ID терминала для формирования порта (например, 112XX где XX - ID терминала)
REVERSE_PORT=$((11200 + TERMINAL_ID))
echo "Порт для Reverse SSH: $REVERSE_PORT (базовый порт 11200 + ID терминала $TERMINAL_ID)"

SERVICE_FILE="/etc/systemd/system/reverse-ssh.service"
cat > "$SERVICE_FILE" <<EOF
[Unit]
Description=Reverse SSH Tunnel
After=network-online.target
Wants=network-online.target

[Service]
User=root
ExecStart=/usr/bin/autossh -M 0 -N \
    -o "ServerAliveInterval=30" \
    -o "ServerAliveCountMax=3" \
    -o "ExitOnForwardFailure=yes" \
    -o "StrictHostKeyChecking=yes" \
    -i /root/.ssh/id_ed25519 \
    -R $REVERSE_PORT:localhost:22 postamat@access.qsolution.ru
Restart=always
RestartSec=15
StartLimitInterval=0

[Install]
WantedBy=multi-user.target
EOF

# Включаем и запускаем сервис
systemctl daemon-reload
systemctl enable reverse-ssh
systemctl start reverse-ssh

# Проверяем статус сервиса
if systemctl is-active --quiet reverse-ssh; then
    echo "✓ Сервис reverse-ssh успешно запущен"
    echo "✓ Настройка Reverse SSH завершена успешно!"
    
    # Получаем путь к текущему скрипту и удаляем его
    SCRIPT_PATH="$(readlink -f "$0")"
    echo "Удаление установочного скрипта: $SCRIPT_PATH"
    rm -f "$SCRIPT_PATH"
    
    echo "Установочный скрипт удален. Система готова к работе."
    echo "Перезагрузка..."
    reboot
else
    echo "✗ Ошибка: Не удалось запустить сервис reverse-ssh"
    echo "Проверьте логи: journalctl -u reverse-ssh"
    exit 1
fi
