#!/bin/sh

# Налаштування
BACKUP_DIR="/home/backup"                                              # Переконайтеся, що цей шлях існує
MYSQL_BACKUP_DIR="/home/backup/mysqldump"                              # Шлях для збереження резервної копії бази даних
SYSTEM_DIRS="/etc /usr/local/etc /usr/local/www/apache24/data /var/log/stargazer.log /var/cron/tabs/root"                   # Вкажіть директорії для архівації
FTP_UPLOAD="YES"                                                       # Увімкнути або вимкнути завантаження на FTP (YES/NO)
FTP_HOST="0.0.0.0"                                                     # Хост FTP-сервера
FTP_LOGIN="kotiki"                                                     # Логін для FTP
FTP_PASSWORD="password"                                            # Пароль для FTP
FTP_REMOTE_PATH="/Ubilling/"                                                # Віддалений шлях для збереження резервних копій
FTP_REMOTE_MYSQL_PATH="/Ubilling/mysqldump/"                                # Віддалений шлях для резервних копій бази даних
TELEGRAM_BOT_TOKEN="------"                                            # Токен вашого Telegram-бота
TELEGRAM_CHAT_IDS="ID1 ID2"                                            # Вкажіть ID через пробіл
SEND_TELEGRAM_MESSAGES="YES"                                           # Увімкнути або вимкнути надсилання повідомлень у Telegram (YES/NO)
BACKUP_FILES="YES"                                                     # Увімкнути або вимкнути резервне копіювання файлів (YES/NO)
BACKUP_DATABASE="YES"                                                  # Увімкнути або вимкнути резервне копіювання бази даних (YES/NO)
HOSTNAME=$(hostname)                                                   # Отримання назви хоста

# Налаштування для MySQL
MYSQLDUMP="/usr/local/bin/mysqldump"                                        # Шлях до mysqldump
MYSQL_USER="root"                                                           # Логін MySQL
MYSQL_PASSWORD="password"                                                   # Пароль MySQL
MYSQL_HOST="localhost"                                                      # Хост MySQL

DATE=$(date +%Y%m%d)
BACKUP_PATH="${BACKUP_DIR}/${DATE}"

# Функція для надсилання повідомлень у Telegram
send_telegram_message() {
  if [ "$SEND_TELEGRAM_MESSAGES" = "YES" ]; then
    local message="$1"
    local chat_ids="${TELEGRAM_CHAT_IDS}"

    for chat_id in $chat_ids; do
      php -r "
      \$token = '${TELEGRAM_BOT_TOKEN}';
      \$chat_id = '${chat_id}';
      \$message = '${message}';
      \$url = 'https://api.telegram.org/bot'.\$token.'/sendMessage';
      \$post_fields = [
        'chat_id' => \$chat_id,
        'text' => \$message
      ];
      \$ch = curl_init();
      curl_setopt(\$ch, CURLOPT_URL, \$url);
      curl_setopt(\$ch, CURLOPT_POST, true);
      curl_setopt(\$ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt(\$ch, CURLOPT_POSTFIELDS, http_build_query(\$post_fields));
      curl_exec(\$ch);
      curl_close(\$ch);
      "
    done
  fi
}

# Перевіряємо та створюємо директорію для резервної копії
if [ -d "$BACKUP_PATH" ]; then
  echo "Резервна копія за ${DATE} вже існує. Видаляємо стару копію."
  rm -rf "$BACKUP_PATH"
fi

mkdir -p "$BACKUP_PATH"
chmod 700 "$BACKUP_PATH"
mkdir -p "$MYSQL_BACKUP_DIR"
chmod 700 "$MYSQL_BACKUP_DIR"

# Створення резервної копії системи
backup_files_status="NO"
backup_database_status="NO"

if [ "$BACKUP_FILES" = "YES" ]; then
  tar cf - $SYSTEM_DIRS 2>/dev/null | gzip > "${BACKUP_PATH}/system.tar.gz"
  if [ $? -ne 0 ]; then
    echo "Помилка створення резервної копії системи"
    send_telegram_message "Помилка створення резервної копії системи на хості ${HOSTNAME}"
    exit 1
  else
    backup_files_status="YES"
  fi
fi

# Створення резервної копії бази даних
if [ "$BACKUP_DATABASE" = "YES" ]; then
  if [ "$BACKUP_FILES" = "NO" ]; then
    backup_location="$MYSQL_BACKUP_DIR"
  else
    backup_location="${BACKUP_PATH}/sql"
  fi

  mkdir -p "$backup_location"
  chmod 700 "$backup_location"

  $MYSQLDUMP --opt --skip-lock-tables --single-transaction -h "$MYSQL_HOST" -p"$MYSQL_PASSWORD" -u "$MYSQL_USER" --all-databases | gzip > "${backup_location}/mysql.sql.gz"
  if [ $? -ne 0 ]; then
    echo "Помилка створення резервної копії бази даних"
    send_telegram_message "Помилка створення резервної копії бази даних на хості ${HOSTNAME}"
    exit 1
  else
    backup_database_status="YES"
  fi
fi

# Надсилання повідомлення залежно від статусу бекапів
if [ "$backup_files_status" = "YES" ] && [ "$backup_database_status" = "YES" ]; then
  send_telegram_message "Резервна копія файлів та бази даних успішно створена на хості ${HOSTNAME}"
elif [ "$backup_files_status" = "YES" ]; then
  send_telegram_message "Резервна копія файлів успішно створена на хості ${HOSTNAME}, резервне копіювання бази даних вимкнено"
elif [ "$backup_database_status" = "YES" ]; then
  send_telegram_message "Резервна копія бази даних успішно створена на хості ${HOSTNAME}, резервне копіювання файлів вимкнено"
else
  send_telegram_message "Резервне копіювання не виконано на хості ${HOSTNAME}"
fi

# Завантаження на FTP
case $FTP_UPLOAD in
YES)
  # Функція для очищення зайвих слешів у шляху
  clean_ftp_path() {
    echo "$1" | sed 's|/+|/|g' | sed 's|^/||'
  }

  FTP_REMOTE_PATH=$(clean_ftp_path "$FTP_REMOTE_PATH")
  FTP_REMOTE_MYSQL_PATH=$(clean_ftp_path "$FTP_REMOTE_MYSQL_PATH")

  if [ "$backup_files_status" = "YES" ]; then
    /usr/local/bin/ncftpput -R -v -u "$FTP_LOGIN" -p "$FTP_PASSWORD" "$FTP_HOST" "$FTP_REMOTE_PATH" "$BACKUP_PATH"
  fi

  if [ "$backup_database_status" = "YES" ]; then
    if [ "$BACKUP_FILES" = "NO" ]; then
      /usr/local/bin/ncftpput -R -v -u "$FTP_LOGIN" -p "$FTP_PASSWORD" "$FTP_HOST" "$FTP_REMOTE_MYSQL_PATH" "$MYSQL_BACKUP_DIR"
    else
      /usr/local/bin/ncftpput -R -v -u "$FTP_LOGIN" -p "$FTP_PASSWORD" "$FTP_HOST" "$FTP_REMOTE_MYSQL_PATH" "${BACKUP_PATH}/sql"
    fi
  fi

  if [ $? -eq 0 ]; then
    echo "Завантаження на FTP завершено успішно"
    send_telegram_message "Резервна копія успішно створена та завантажена на FTP (${FTP_HOST}) для хоста ${HOSTNAME}"
  else
    echo "Помилка завантаження на FTP"
    send_telegram_message "Помилка завантаження резервної копії на FTP (${FTP_HOST}) для хоста ${HOSTNAME}"
    exit 1
  fi
  ;;

NO)
  echo "Завантаження на FTP вимкнено"
  send_telegram_message "Резервна копія створена, але завантаження на FTP не виконано (вимкнено) для хоста ${HOSTNAME}"
  ;;
esac