diff --git a/install.sh b/install.sh index ba4f4be..fcbb7b1 100644 --- a/install.sh +++ b/install.sh @@ -1,6 +1,9 @@ #!/bin/bash SERVICE_NAME="awg_bot" +REPO_URL="https://github.com/stevefoxru/amnezia-bot.git" +REPO_API="https://api.github.com/repos/stevefoxru/amnezia-bot" +LOCAL_VERSION_FILE="/root/amnezia-bot/.version" GREEN=$'\033[0;32m' YELLOW=$'\033[1;33m' @@ -9,7 +12,6 @@ BLUE=$'\033[0;34m' NC=$'\033[0m' ENABLE_LOGS=true - SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" SCRIPT_NAME="$(basename "$0")" SCRIPT_PATH="$SCRIPT_DIR/$SCRIPT_NAME" @@ -19,9 +21,10 @@ while [[ "$#" -gt 0 ]]; do case $1 in --quiet) ENABLE_LOGS=false ;; --verbose) ENABLE_LOGS=true ;; + --check-update) check_updates; exit 0 ;; *) echo -e "${RED}Неизвестный параметр: $1${NC}" - echo "Использование: $0 [--quiet|--verbose]" + echo "Использование: $0 [--quiet|--verbose|--check-update]" exit 1 ;; esac @@ -61,9 +64,63 @@ run_with_spinner() { fi } +# Проверка обновлений на GitHub +check_github_updates() { + local current_sha local_sha latest_sha + cd amnezia-bot || { echo -e "${RED}Каталог amnezia-bot не найден${NC}"; return 1; } + + # Получение текущего SHA коммита + local_sha=$(git rev-parse HEAD 2>/dev/null || echo "unknown") + + # Получение последнего коммита через GitHub API + if command -v curl &>/dev/null; then + latest_sha=$(curl -s "$REPO_API/commits/main" | jq -r '.sha' 2>/dev/null) + [[ -z "$latest_sha" ]] && { echo -e "${RED}Не удалось получить данные с GitHub${NC}"; cd ..; return 1; } + else + echo -e "${RED}curl не установлен${NC}"; cd ..; return 1 + fi + + # Сравнение версий + if [[ "$local_sha" == "$latest_sha" ]]; then + echo -e "${GREEN}Репозиторий актуален (SHA: $local_sha)${NC}" + cd ..; return 0 + fi + + echo -e "${YELLOW}Доступно обновление (текущий SHA: $local_sha, последний SHA: $latest_sha)${NC}" + echo -ne "${BLUE}1) Установить 2) Отменить: ${NC}"; read choice + if [[ "$choice" == "1" ]]; then + run_with_spinner "Обновление репозитория" "git pull" + echo "$latest_sha" > "$LOCAL_VERSION_FILE" + # Проверка обновления самого скрипта + check_script_update + run_with_spinner "Перезапуск службы" "sudo systemctl restart $SERVICE_NAME -q" + else + echo -e "${YELLOW}Обновление отменено${NC}" + fi + cd .. +} + +# Проверка обновления самого скрипта +check_script_update() { + local temp_script=$(mktemp) + if [[ -f "amnezia-bot/install.sh" ]]; then + cp "amnezia-bot/install.sh" "$temp_script" + if ! cmp -s "$SCRIPT_PATH" "$temp_script"; then + echo -e "${YELLOW}Обнаружено обновление скрипта install.sh${NC}" + run_with_spinner "Обновление скрипта" "mv $temp_script $SCRIPT_PATH && chmod +x $SCRIPT_PATH" + echo -e "${GREEN}Скрипт обновлён, перезапускаю...${NC}" + exec "$SCRIPT_PATH" --check-update + else + rm -f "$temp_script" + fi + else + rm -f "$temp_script" + echo -e "${YELLOW}Скрипт install.sh не найден в репозитории${NC}" + fi +} + # Обновление и очистка системы update_and_clean_system() { - # Ждём освобождения APT while fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1; do echo -e "${YELLOW}APT занят. Ждём...${NC}"; sleep 2 done @@ -77,7 +134,6 @@ check_python() { echo -e "\n${GREEN}Python 3.11 уже установлен${NC}"; return 0 fi echo -e "\n${YELLOW}Устанавливаю Python 3.11...${NC}" - # Ожидание dpkg lock на Ubuntu 24.04 if [[ "$UBUNTU_VERSION" == "24.04" ]]; then local max=30 cnt=1 while fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1; do @@ -93,7 +149,7 @@ check_python() { # Установка зависимостей VPN-бота install_dependencies() { - run_with_spinner "Установка зависимостей" "sudo apt-get install -y jq net-tools iptables resolvconf git -qq" + run_with_spinner "Установка зависимостей" "sudo apt-get install -y jq net-tools iptables resolvconf git curl -qq" } # Установка и конфиг needrestart @@ -105,12 +161,11 @@ install_and_configure_needrestart() { # Клонирование репозитория clone_repository() { - # Если скрипт запущен внутри клонированного репозитория, пропускаем if [[ -d ".git" ]]; then echo -e "${YELLOW}Репозиторий уже присутствует, пропускаем клонирование...${NC}" return fi - run_with_spinner "Клонирование репозитория" "git clone https://github.com/stevefoxru/amnezia-bot.git -q" + run_with_spinner "Клонирование репозитория" "git clone $REPO_URL -q" cd amnezia-bot || { echo -e "${RED}Не удалось перейти в каталог amnezia-bot${NC}"; exit 1; } } @@ -165,18 +220,11 @@ EOF # Проверка и применение обновлений check_updates() { - cd amnezia-bot || return 1 - local out err - out=$(mktemp); err=$(mktemp) - git pull >"$out" 2>"$err" || { cat "$err"; rm -f "$out" "$err"; cd ..; return 1; } - local changes=$(<"$out"); rm -f "$out" "$err" - if [[ "$changes" == "Already up to date." ]]; then - echo -e "${GREEN}Обновлений нет${NC}"; cd ..; return 0 + if [[ ! -d "amnezia-bot/.git" ]]; then + echo -e "${RED}Репозиторий не найден. Пожалуйста, установите бот сначала.${NC}" + return 1 fi - echo -e "${YELLOW}Найдено обновление:${NC}\n$changes" - echo -ne "${BLUE}1) Установить 2) Отменить: ${NC}"; read choice - case $choice in 1) git pull; run_with_spinner "Перезапуск службы" "sudo systemctl restart $SERVICE_NAME -q" ;; *) echo "Отменено" ;; esac - cd .. + check_github_updates } # Удаление AmneziaWG @@ -194,16 +242,17 @@ service_control_menu() { while true; do echo -e "\n${BLUE}Управление службой${NC}" sudo systemctl status "$SERVICE_NAME" | grep -E "Active:|Loaded:" - echo -e "1) Остановить 2) Перезапустить 3) Переустановить 4) Удалить службу 5) Удалить AmneziaWG 6) Назад" + echo -e "1) Остановить 2) Перезапустить 3) Переустановить 4) Удалить службу 5) Удалить AmneziaWG 6) Проверить обновления 7) Назад" echo -ne "${BLUE}Выберите: ${NC}"; read act case $act in - 1) run_with_spinner "Остановка" "sudo systemctl stop $SERVICE_NAME -q" ;; - 2) run_with_spinner "Перезапуск" "sudo systemctl restart $SERVICE_NAME -q" ;; - 3) reinstall_bot ;; - 4) run_with_spinner "Удаление службы" "sudo systemctl disable $SERVICE_NAME -q && sudo rm /etc/systemd/system/$SERVICE_NAME.service && sudo systemctl daemon-reload -q" ;; - 5) remove_amneziawg ;; - 6) break ;; - *) echo "Неверно" ;; + 1) run_with_spinner "Остановка" "sudo systemctl stop $SERVICE_NAME -q" ;; + 2) run_with_spinner "Перезапуск" "sudo systemctl restart $SERVICE_NAME -q" ;; + 3) reinstall_bot ;; + 4) run_with_spinner "Удаление службы" "sudo systemctl disable $SERVICE_NAME -q && sudo rm /etc/systemd/system/$SERVICE_NAME.service && sudo systemctl daemon-reload -q" ;; + 5) remove_amneziawg ;; + 6) check_updates ;; + 7) break ;; + *) echo "Неверно" ;; esac done } @@ -224,11 +273,11 @@ installed_menu() { echo -e "\n${GREEN}1) Проверить обновления 2) Управление службой 3) Переустановить 4) Выход${NC}" echo -ne "${BLUE}Выберите: ${NC}"; read opt case $opt in - 1) check_updates ;; - 2) service_control_menu ;; - 3) reinstall_bot ;; - 4) exit 0 ;; - *) echo "Неверно" ;; + 1) check_updates ;; + 2) service_control_menu ;; + 3) reinstall_bot ;; + 4) exit 0 ;; + *) echo "Неверно" ;; esac done } @@ -245,7 +294,7 @@ install_bot() { set_permissions initialize_bot create_service - echo -e "${GREEN}Установка завершена!${NC}" + echo -e "${GREEN}Установка завершена!${NC}" } # Точка входа