mirror of
https://github.com/l-ptrol/mihomo_studio.git
synced 2026-04-26 10:31:32 +00:00
275 lines
No EOL
10 KiB
Bash
275 lines
No EOL
10 KiB
Bash
#!/bin/sh
|
||
|
||
#
|
||
# Copyright (C) 2024-2025 by l-ptrol
|
||
#
|
||
|
||
# === КОНСТАНТЫ И ПЕРЕМЕННЫЕ ===
|
||
SERVICE_NAME="Mihomo Studio"
|
||
BRANCH="master"
|
||
BASE_URL="https://raw.githubusercontent.com/l-ptrol/mihomo_studio/${BRANCH}"
|
||
INSTALL_DIR="/opt/scripts"
|
||
INIT_DIR="/opt/etc/init.d"
|
||
BIN_DIR="/opt/bin"
|
||
MIHOMO_ETC_DIR="/opt/etc/mihomo" # Добавлено для совместимости и управления конфигами
|
||
PY_SCRIPT="mihomo_editor.py"
|
||
INIT_SCRIPT="S95mihomo-web"
|
||
MAIN_SCRIPT="mhstudio"
|
||
PACKAGES="python3-base python3-light python3-email python3-urllib python3-codecs"
|
||
|
||
# === ФУНКЦИИ ===
|
||
|
||
# --- Получение локальной версии ---
|
||
get_local_version() {
|
||
local_py_path="$INSTALL_DIR/$PY_SCRIPT"
|
||
if [ -f "$local_py_path" ]; then
|
||
# Ищем строку с <title>, извлекаем 'v' и номер версии, затем удаляем 'v'
|
||
grep '<title>Mihomo Studio v' "$local_py_path" | sed -n 's/.*Mihomo Studio v\([^<]*\)<.*/\1/p'
|
||
else
|
||
echo "0"
|
||
fi
|
||
}
|
||
|
||
# --- Получение удаленной версии ---
|
||
get_remote_version() {
|
||
local remote_py_url="$BASE_URL/$PY_SCRIPT"
|
||
local temp_py_path="/tmp/$PY_SCRIPT.tmp"
|
||
|
||
# Скачиваем удаленный скрипт во временный файл
|
||
wget --no-check-certificate -O "$temp_py_path" "$remote_py_url" >/dev/null 2>&1
|
||
|
||
if [ $? -eq 0 ] && [ -s "$temp_py_path" ]; then
|
||
# Извлекаем версию из временного файла
|
||
grep '<title>Mihomo Studio v' "$temp_py_path" | sed -n 's/.*Mihomo Studio v\([^<]*\)<.*/\1/p'
|
||
rm "$temp_py_path" # Удаляем временный файл
|
||
else
|
||
# Если скачать не удалось, возвращаем 0 и удаляем пустой файл (если создался)
|
||
[ -f "$temp_py_path" ] && rm "$temp_py_path"
|
||
echo "0"
|
||
fi
|
||
}
|
||
|
||
# --- Отображение заголовка ---
|
||
display_header() {
|
||
# Переменные local_version и remote_version должны быть определены
|
||
# перед вызовом этой функции в глобальной области видимости.
|
||
|
||
# Коррекция отображения для пользователя
|
||
if [ "$local_version" = "0" ]; then
|
||
display_local="не установлено"
|
||
else
|
||
display_local="$local_version"
|
||
fi
|
||
|
||
if [ "$remote_version" = "0" ]; then
|
||
display_remote="не удалось получить"
|
||
else
|
||
display_remote="$remote_version"
|
||
fi
|
||
|
||
echo "========================================"
|
||
echo " ${SERVICE_NAME} Installer"
|
||
echo "----------------------------------------"
|
||
echo " Установленная версия: ${display_local}"
|
||
echo " Доступная версия: ${display_remote}"
|
||
echo "========================================"
|
||
}
|
||
|
||
# --- Справка ---
|
||
usage() {
|
||
echo "Использование: mhstudio {start|stop|restart|update|reinstall|uninstall|uninstall-full}"
|
||
echo " mhstudio -start - Запустить сервис"
|
||
echo " mhstudio -stop - Остановить сервис"
|
||
echo " mhstudio -restart - Перезапустить сервис"
|
||
echo " mhstudio -update - Обновить сервис (если есть новая версия)"
|
||
echo " mhstudio -reinstall - Принудительно переустановить/обновить сервис"
|
||
echo " mhstudio -uninstall - Удалить сервис (сохранив зависимости)"
|
||
echo " mhstudio -uninstall-full - Удалить сервис и все его зависимости"
|
||
}
|
||
|
||
# --- Установка зависимостей ---
|
||
install_dependencies() {
|
||
echo ">>> Проверка и установка зависимостей..."
|
||
opkg update
|
||
for pkg in $PACKAGES; do
|
||
if ! opkg list-installed | grep -q "^$pkg"; then
|
||
echo "Устанавливаем $pkg..."
|
||
opkg install "$pkg"
|
||
else
|
||
echo "$pkg уже установлен."
|
||
fi
|
||
done
|
||
}
|
||
|
||
# --- Создание директорий ---
|
||
create_dirs() {
|
||
echo ">>> Создание директорий..."
|
||
mkdir -p "$INSTALL_DIR"
|
||
mkdir -p "$INIT_DIR"
|
||
mkdir -p "${MIHOMO_ETC_DIR}/profiles"
|
||
mkdir -p "${MIHOMO_ETC_DIR}/backup"
|
||
}
|
||
|
||
# --- Скачивание файлов ---
|
||
download_files() {
|
||
echo ">>> Скачивание файлов..."
|
||
|
||
# Скачиваем основной скрипт сервиса
|
||
echo "Скачивание $PY_SCRIPT..."
|
||
wget --no-check-certificate -O "$INSTALL_DIR/$PY_SCRIPT" "${BASE_URL}/${PY_SCRIPT}"
|
||
if [ $? -ne 0 ]; then echo "ОШИБКА: Не удалось скачать $PY_SCRIPT."; exit 1; fi
|
||
|
||
# Скачиваем скрипт инициализации
|
||
echo "Скачивание $INIT_SCRIPT..."
|
||
wget --no-check-certificate -O "$INIT_DIR/$INIT_SCRIPT" "${BASE_URL}/${INIT_SCRIPT}"
|
||
if [ $? -ne 0 ]; then echo "ОШИБКА: Не удалось скачать $INIT_SCRIPT."; exit 1; fi
|
||
|
||
# Проверка наличия файла
|
||
if [ ! -f "$INIT_DIR/$INIT_SCRIPT" ]; then
|
||
echo "ОШИБКА: Файл $INIT_DIR/$INIT_SCRIPT не был создан после скачивания."
|
||
exit 1
|
||
fi
|
||
|
||
# Обновляем сам управляющий скрипт (mhstudio.sh)
|
||
echo ">>> Обновление управляющего скрипта..."
|
||
wget --no-check-certificate -O "$BIN_DIR/$MAIN_SCRIPT" "${BASE_URL}/mhstudio.sh"
|
||
if [ $? -ne 0 ]; then
|
||
echo "ПРЕДУПРЕЖДЕНИЕ: Не удалось обновить $MAIN_SCRIPT. Продолжаем..."
|
||
else
|
||
chmod +x "$BIN_DIR/$MAIN_SCRIPT"
|
||
fi
|
||
}
|
||
|
||
# --- Установка прав доступа ---
|
||
set_permissions() {
|
||
echo ">>> Установка прав доступа..."
|
||
chmod +x "$INSTALL_DIR/$PY_SCRIPT"
|
||
chmod +x "$INIT_DIR/$INIT_SCRIPT"
|
||
}
|
||
|
||
# --- Управление сервисом ---
|
||
service_control() {
|
||
local action=$1
|
||
if [ -f "$INIT_DIR/$INIT_SCRIPT" ]; then
|
||
echo ">>> Выполнение: $action..."
|
||
"$INIT_DIR/$INIT_SCRIPT" "$action"
|
||
else
|
||
echo "ОШИБКА: Скрипт инициализации не найден ($INIT_DIR/$INIT_SCRIPT)."
|
||
# Попытка восстановить, если это не удаление
|
||
if [ "$action" != "stop" ]; then
|
||
echo "Попытка восстановления..."
|
||
download_files
|
||
set_permissions
|
||
if [ -f "$INIT_DIR/$INIT_SCRIPT" ]; then
|
||
"$INIT_DIR/$INIT_SCRIPT" "$action"
|
||
else
|
||
echo "Не удалось восстановить."
|
||
fi
|
||
fi
|
||
fi
|
||
}
|
||
|
||
# --- Полный цикл установки ---
|
||
install_service() {
|
||
echo ">>> Начинаем установку/обновление..."
|
||
|
||
# Остановка сервиса (если запущен)
|
||
if [ -f "$INIT_DIR/$INIT_SCRIPT" ]; then
|
||
"$INIT_DIR/$INIT_SCRIPT" stop
|
||
fi
|
||
|
||
install_dependencies
|
||
create_dirs
|
||
download_files
|
||
set_permissions
|
||
service_control "restart"
|
||
|
||
echo "=== Установка/обновление завершено! ==="
|
||
echo "Веб-интерфейс (если запущен) доступен по адресу: http://$(uname -n):8888"
|
||
}
|
||
|
||
# --- Удаление сервиса ---
|
||
uninstall_service() {
|
||
local mode=$1
|
||
echo "[1/2] Остановка и удаление службы..."
|
||
if [ -f "$INIT_DIR/$INIT_SCRIPT" ]; then
|
||
"$INIT_DIR/$INIT_SCRIPT" stop
|
||
fi
|
||
rm -f "$INSTALL_DIR/$PY_SCRIPT"
|
||
rm -f "$INIT_DIR/$INIT_SCRIPT"
|
||
|
||
if [ "$mode" = "full" ]; then
|
||
echo "[2/2] Удаление зависимостей..."
|
||
echo "ВНИМАНИЕ: Следующие пакеты будут удалены: $PACKAGES"
|
||
echo "Это может повлиять на работу других приложений."
|
||
opkg remove $PACKAGES
|
||
else
|
||
echo "[2/2] Зависимости не были удалены."
|
||
fi
|
||
|
||
echo "=== Удаление завершено! ==="
|
||
}
|
||
|
||
|
||
# --- ТОЧКА ВХОДА ---
|
||
|
||
# Проверяем, установлен ли сервис
|
||
if [ ! -f "$INSTALL_DIR/$PY_SCRIPT" ]; then
|
||
echo "Сервис Mihomo Studio не найден. Запускаю первичную установку..."
|
||
install_service
|
||
echo "Установка завершена. Для дальнейшего управления используйте команды:"
|
||
usage
|
||
exit 0
|
||
fi
|
||
|
||
# Если сервис уже установлен, обрабатываем аргументы
|
||
local_version=$(get_local_version)
|
||
remote_version=$(get_remote_version)
|
||
display_header
|
||
|
||
# Если аргументов нет, показать справку
|
||
if [ -z "$1" ]; then
|
||
usage
|
||
exit 0
|
||
fi
|
||
|
||
case "$1" in
|
||
-start)
|
||
service_control "start"
|
||
;;
|
||
-stop)
|
||
service_control "stop"
|
||
;;
|
||
-restart)
|
||
service_control "restart"
|
||
;;
|
||
-update)
|
||
if [ "$local_version" = "0" ]; then
|
||
echo "Сервис не установлен. Используйте 'install'."
|
||
exit 1
|
||
fi
|
||
# Сравнение версий. `sort -V` корректно сравнивает номера версий.
|
||
latest=$(printf "%s\n%s" "$local_version" "$remote_version" | sort -V | tail -n1)
|
||
if [ "$local_version" = "$remote_version" ] || [ "$local_version" = "$latest" ]; then
|
||
echo "У вас уже установлена последняя версия."
|
||
exit 0
|
||
fi
|
||
echo "Доступно обновление. Установка..."
|
||
install_service
|
||
;;
|
||
-reinstall)
|
||
echo "Принудительная переустановка..."
|
||
install_service
|
||
;;
|
||
-uninstall)
|
||
uninstall_service
|
||
;;
|
||
-uninstall-full)
|
||
uninstall_service "full"
|
||
;;
|
||
*)
|
||
echo "Неизвестная команда: $1"
|
||
usage
|
||
exit 1
|
||
;;
|
||
esac |