#!/bin/bash

echo "Начало выполнения обновления MongoDB"

echo "Проверяем место выполнения скрипта"
current_dir=$(pwd)
if [[ "$current_dir" == /tmp* ]]; then
    read -p "Внимание! Вы выполняете скрипт из директории /tmp. Во время выполнения скрипта в эту директорию будет сделан дамп mongodb. Продолжить? (y/n) " response
    if [[ "$response" == "y" ]]; then
        echo "Продолжаем установку"
    else
        exit 1
    fi
fi

echo "Получаем текущую версию MongoDB"
current_version=$(mongo --eval "db.version()" 2>/dev/null | tail -n 1)
current_fc_version=$(mongo --eval "db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )" 2>/dev/null | tail -n 2 | head -n 1 | awk '{print $3}')

if [[ $current_version < "4.4" ]]; then
    echo "Версия MongoDB ($current_version) ниже 4.4. Обновление невозможно."
    exit 1
fi

if ! grep -qs 'avx\b' /proc/cpuinfo; then
    echo "Процессор не поддерживает команды AVX. Обновление невозможно."
    exit 1
fi

if [[ $current_fc_version < "4.4" ]]; then
    echo "Повышаем featureCompatibilityVersion до 4.4"
    mongo --eval "db.adminCommand( { setFeatureCompatibilityVersion: \"4.4\" } )"
fi

echo "Поиск всех индексов с TTL expireAfterSeconds = NaN"
indexes=$(mongo --quiet --eval "db.system.indexes.find({expireAfterSeconds: NaN})" 2>/dev/null)
if [[ -n "$indexes" ]]; then
    echo "Найдены индексы с TTL expireAfterSeconds = NaN. Эти индексы сгорят после обновления, необходимо разобраться с ними вручную"
    exit 1
fi

echo "Создание резервной копии данных MongoDB"
mongodump

echo "Остановка MongoDB"
sudo systemctl stop mongod

if [[ $? -ne 0 ]]; then
    echo "Ошибка при создании резервной копии данных MongoDB"
    sudo systemctl start mongod
    exit 1
fi

echo "Установка новой версии MongoDB 5.0.23"
backup_current_version=$current_version
# Установка mongodb
repo_codename=$(lsb_release -sc)
if [ "$repo_codename" = 'bionic' ]; then
    m_type='bionic'
elif [ "$repo_codename" = 'bookworm' ]; then
    m_type='bullseye'
else
    m_type='focal'
fi

apt-get update
apt-get install -y mongodb-org=5.0.23 mongodb-org-database=5.0.23-$m_type mongodb-database-tools=100.9.3 mongodb-org-database-tools-extra=5.0.23 mongodb-org-tools=5.0.23 mongodb-mongosh=2.1.3

if [[ $? -ne 0 ]]; then
    echo "Ошибка при установке новой версии MongoDB"
    sudo systemctl start mongod
    exit 1
fi

echo "Запуск MongoDB"
sudo systemctl start mongod
if [[ $? -ne 0 ]]; then
    echo "Ошибка при запуске MongoDB. Выполняем откат к предыдущему состоянию"
    sudo systemctl stop mongod 
    sudo apt-get install -y mongodb-org=$backup_current_version mongodb-database-tools=$backup_current_version
    mongorestore
fi
