#!/bin/bash
# ============================================================================
# Скрипт настройки "сломанного" сервера для лабораторной работы Д-2
# ============================================================================
# Назначение: Создает преднамеренные проблемы на сервере для диагностики
# Использование: sudo ./setup_broken_server.sh --ssh-port 2222 --web-port 8080 --user admin
# ============================================================================

set -e

# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# Функция вывода сообщений
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# Проверка прав root
if [ "$EUID" -ne 0 ]; then
    log_error "Этот скрипт должен запускаться с правами root (sudo)"
    exit 1
fi

# Парсинг аргументов
SSH_PORT=2222
WEB_PORT=8080
USERNAME="admin"

while [[ $# -gt 0 ]]; do
    case $1 in
        --ssh-port)
            SSH_PORT="$2"
            shift 2
            ;;
        --web-port)
            WEB_PORT="$2"
            shift 2
            ;;
        --user)
            USERNAME="$2"
            shift 2
            ;;
        *)
            log_error "Неизвестный параметр: $1"
            exit 1
            ;;
    esac
done

log_info "Начинаю настройку 'сломанного' сервера..."
log_info "Параметры: SSH-порт=$SSH_PORT, Веб-порт=$WEB_PORT, Пользователь=$USERNAME"

# ============================================================================
# Обновление системы и установка пакетов
# ============================================================================
log_info "Обновление системы..."
apt-get update -qq
apt-get install -y -qq nginx cron logrotate ufw openssh-server > /dev/null 2>&1

# ============================================================================
# Проблема 1: SSH настроен с парольной аутентификацией (небезопасно)
# ============================================================================
log_info "Настройка SSH с парольной аутентификацией (проблема 1)..."

# Создаем пользователя
if ! id "$USERNAME" &>/dev/null; then
    useradd -m -s /bin/bash "$USERNAME"
    echo "$USERNAME:password123" | chpasswd
    usermod -aG sudo "$USERNAME"
    log_info "Создан пользователь $USERNAME с паролем password123"
fi

# Настраиваем SSH
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
sed -i "s/^#Port 22/Port $SSH_PORT/" /etc/ssh/sshd_config
sed -i "s/^Port 22/Port $SSH_PORT/" /etc/ssh/sshd_config
sed -i 's/^#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config
sed -i 's/^PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config
sed -i 's/^#PubkeyAuthentication yes/PubkeyAuthentication no/' /etc/ssh/sshd_config
sed -i 's/^PubkeyAuthentication yes/PubkeyAuthentication no/' /etc/ssh/sshd_config

systemctl restart ssh
log_warn "SSH настроен с парольной аутентификацией на порту $SSH_PORT"

# ============================================================================
# Проблема 2: Nginx слушает на нестандартном порту
# ============================================================================
log_info "Настройка nginx на нестандартном порту (проблема 2)..."

# Создаем простую HTML-страницу
mkdir -p /var/www/html
cat > /var/www/html/index.html << 'EOF'
<!DOCTYPE html>
<html>
<head>
    <title>Test Server</title>
</head>
<body>
    <h1>Сервер работает!</h1>
    <p>Если вы видите эту страницу, nginx настроен правильно.</p>
</body>
</html>
EOF

# Настраиваем nginx на нестандартный порт
cat > /etc/nginx/sites-available/default << EOF
server {
    listen $WEB_PORT default_server;
    listen [::]:$WEB_PORT default_server;

    root /var/www/html;
    index index.html;

    server_name _;

    location / {
        try_files \$uri \$uri/ =404;
    }
}
EOF

systemctl restart nginx
log_warn "Nginx настроен на порту $WEB_PORT (вместо стандартного 80)"

# ============================================================================
# Проблема 3: Неправильные права доступа к критическим файлам
# ============================================================================
log_info "Создание файлов с неправильными правами (проблема 3)..."

# Создаем конфигурационный файл с секретами
mkdir -p /etc/myapp
cat > /etc/myapp/config.yml << 'EOF'
database:
  host: localhost
  port: 5432
  username: admin
  password: super_secret_password_123
api_key: sk-1234567890abcdef
EOF

# Устанавливаем неправильные права (все могут читать)
chmod 644 /etc/myapp/config.yml
chown root:root /etc/myapp/config.yml

# Создаем приватный ключ SSH с неправильными правами
mkdir -p /home/$USERNAME/.ssh
ssh-keygen -t rsa -b 2048 -f /home/$USERNAME/.ssh/id_rsa -N "" -q
chmod 644 /home/$USERNAME/.ssh/id_rsa
chown -R $USERNAME:$USERNAME /home/$USERNAME/.ssh

log_warn "Созданы файлы с неправильными правами доступа"

# ============================================================================
# Проблема 4: Нерабочая cron-задача для бэкапов
# ============================================================================
log_info "Создание нерабочей cron-задачи (проблема 4)..."

# Создаем скрипт бэкапа
cat > /usr/local/bin/backup.sh << 'EOF'
#!/bin/bash
# Скрипт бэкапа конфигурации
BACKUP_DIR="/var/backups/myapp"
mkdir -p "$BACKUP_DIR"
tar -czf "$BACKUP_DIR/backup-$(date +%Y%m%d).tar.gz" /etc/myapp/
EOF

chmod +x /usr/local/bin/backup.sh

# Создаем неправильную cron-задачу (синтаксическая ошибка)
cat > /etc/cron.d/myapp-backup << 'EOF'
# Бэкап конфигурации каждый день в 3:00
0 3 * * * root /usr/local/bin/backup.sh
EOF

# Но делаем скрипт неисполняемым (проблема)
chmod -x /usr/local/bin/backup.sh

log_warn "Создана нерабочая cron-задача для бэкапов"

# ============================================================================
# Проблема 5: Лог-файлы занимают всё место (нет ротации)
# ============================================================================
log_info "Создание больших лог-файлов без ротации (проблема 5)..."

# Создаем большой лог-файл
mkdir -p /var/log/myapp
for i in {1..5000}; do
    echo "$(date '+%Y-%m-%d %H:%M:%S') [INFO] Application log entry $i - This is a test log message with some additional information to make it longer" >> /var/log/myapp/application.log
done

# Отключаем ротацию для этого лога
rm -f /etc/logrotate.d/myapp

log_warn "Создан большой лог-файл без ротации ($(du -h /var/log/myapp/application.log | cut -f1))"

# ============================================================================
# Проблема 6: Firewall отключен (все порты открыты)
# ============================================================================
log_info "Отключение firewall (проблема 6)..."

ufw disable > /dev/null 2>&1
ufw --force reset > /dev/null 2>&1

log_warn "Firewall отключен, все порты открыты"

# ============================================================================
# Создание файла с подсказками для студента
# ============================================================================
log_info "Создание файла с информацией для студента..."

cat > /home/$USERNAME/LAB_INFO.txt << EOF
================================================================================
ЛАБОРАТОРНАЯ РАБОТА Д-2: Аудит и настройка сервера
================================================================================

Ваш сервер настроен с преднамеренными проблемами. Ваша задача:
1. Диагностировать проблемы
2. Исправить их
3. Задокументировать процесс

ПАРАМЕТРЫ СЕРВЕРА:
- SSH-порт: $SSH_PORT
- Веб-порт: $WEB_PORT
- Пользователь: $USERNAME
- Пароль пользователя: password123

ПОДСКАЗКИ:
- Проверьте конфигурацию SSH (/etc/ssh/sshd_config)
- Проверьте конфигурацию nginx (/etc/nginx/sites-available/)
- Проверьте права доступа к критическим файлам
- Проверьте cron-задачи (/etc/cron.d/)
- Проверьте размер лог-файлов (/var/log/)
- Проверьте статус firewall (ufw status)

УДАЧИ!
================================================================================
EOF

chown $USERNAME:$USERNAME /home/$USERNAME/LAB_INFO.txt

# ============================================================================
# Финальная проверка
# ============================================================================
log_info "Проверка состояния сервера..."

echo ""
echo "================================================================================"
echo "СОСТОЯНИЕ СЕРВЕРА (для преподавателя)"
echo "================================================================================"
echo "SSH-порт: $SSH_PORT"
echo "  - PasswordAuthentication: yes (ПРОБЛЕМА)"
echo "  - PubkeyAuthentication: no (ПРОБЛЕМА)"
echo ""
echo "Nginx-порт: $WEB_PORT"
echo "  - Слушает на нестандартном порту (ПРОБЛЕМА)"
echo ""
echo "Права доступа:"
echo "  - /etc/myapp/config.yml: $(stat -c %a /etc/myapp/config.yml) (ПРОБЛЕМА - должно быть 600)"
echo "  - /home/$USERNAME/.ssh/id_rsa: $(stat -c %a /home/$USERNAME/.ssh/id_rsa) (ПРОБЛЕМА - должно быть 600)"
echo ""
echo "Cron-задача:"
echo "  - /usr/local/bin/backup.sh: $(stat -c %A /usr/local/bin/backup.sh) (ПРОБЛЕМА - нет execute)"
echo ""
echo "Лог-файлы:"
echo "  - /var/log/myapp/application.log: $(du -h /var/log/myapp/application.log | cut -f1) (ПРОБЛЕМА - нет ротации)"
echo ""
echo "Firewall:"
echo "  - UFW: $(ufw status | head -1) (ПРОБЛЕМА - отключен)"
echo "================================================================================"

log_info "Настройка завершена! Сервер готов для лабораторной работы."
log_warn "Не забудьте дать студенту файл /home/$USERNAME/LAB_INFO.txt"

