Найдено и проверено живым прогоном на этой машине (реальный GTK-рабочий стол, реальные профили agy) — не по чтению кода. 1. Значок .desktop-записи был .ico. Измерено: GdkPixbuf.Pixbuf.new_from_file на HermesHub.ico падает с "Compressed icons are not supported". .desktop-файл с нерендерящейся иконкой меню приложений и файловый менеджер просто показывают пустым — без ошибки, молча. PNG в тех же ассетах уже был и загружается (проверено: 256x256). Подставлен app_icon_256.png. 2. Хаб нельзя было остановить иначе как из терминала. На Windows сервер стартует из HermesHubWeb.exe, который держит значок в системном трее — оттуда «Exit» останавливает процесс. На Linux сервер остаётся в фоне после закрытия окна браузера (так и задумано — не переустанавливать каждый раз), но ни кнопки в интерфейсе (её нет ни на одной платформе), ни трея, ни пункта меню не было вовсе. launcher/hermes-hub-stop.sh — недостающий эквивалент «Exit из трея»: доступен из меню приложений через собственный .desktop-пункт, использует ту же функцию, что и install/uninstall. Проверено живым прогоном: сервер запущен, остановлен через новый лаунчер, curl после этого получает connection refused. 3. uninstall-linux.sh не останавливал работающий хаб перед удалением файлов — та же причина, что install уже чинил для установки: с --purge-user-data это ещё и rm -rf каталогов, на которые у живого процесса открыты файловые дескрипторы. Измерено: сервер, запущенный в песочнице, оставался в списке процессов после uninstall-linux.sh до этой правки. Добавлена та же остановка, тем же кодом. 4. stop_running_hub была вписана отдельно в install-linux.sh и uninstall-linux.sh — две копии, которые разошлись бы при правке одной незамеченной для другой. Вынесена в installer/lib_stop_running_hub.sh, источается обоими скриптами и новым лаунчером остановки. Всё проверено дважды: прямым запуском install-linux.sh/uninstall-linux.sh в изолированной песочнице (не ~/.hermes) и через собранный dist/hermes-hub-setup.sh — тот самый файл, который уходит в релиз. Тесты: 738 -> 740 passed, 2 skipped, 4 deselected. Новый тест на .ico падает на прежней версии install-linux.sh (проверено git stash) и проходит после фикса. ruff check . чисто. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
88 lines
3.9 KiB
Bash
88 lines
3.9 KiB
Bash
#!/usr/bin/env bash
|
||
# ==============================================================================
|
||
# Hermes Hub — Linux Uninstaller
|
||
# Removes application files, plugin integration, launcher and .desktop shortcuts.
|
||
# Preserves user data and credentials by default unless --purge-user-data is passed.
|
||
# ==============================================================================
|
||
|
||
set -e
|
||
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
|
||
DEFAULT_HERMES_HOME="$HOME/.hermes"
|
||
HERMES_HOME="${HERMES_HOME:-$DEFAULT_HERMES_HOME}"
|
||
|
||
PURGE_USER_DATA=false
|
||
for arg in "$@"; do
|
||
if [ "$arg" = "--purge-user-data" ] || [ "$arg" = "-p" ]; then
|
||
PURGE_USER_DATA=true
|
||
fi
|
||
done
|
||
|
||
echo "======================================================================"
|
||
echo " HERMES HUB UNINSTALLER (Linux / POSIX) "
|
||
echo "======================================================================"
|
||
echo "Hermes Home : $HERMES_HOME"
|
||
echo ""
|
||
|
||
# 0. Остановка работающего хаба.
|
||
#
|
||
# Тот же порядок, что в install-linux.sh, и по той же причине: файлы под
|
||
# работающим процессом здесь не просто устаревают, а исчезают. С
|
||
# --purge-user-data это ещё и rm -rf каталогов, на которые у живого процесса
|
||
# открыты файловые дескрипторы — на Linux это не роняет процесс, но он
|
||
# продолжает отвечать по старому порту после «успешного» удаления, и
|
||
# следующая попытка что-то с ним сделать бьётся об уже удалённые файлы.
|
||
echo "[0/4] Остановка работающего Hermes Hub..."
|
||
# shellcheck source=./lib_stop_running_hub.sh
|
||
. "$SCRIPT_DIR/lib_stop_running_hub.sh"
|
||
stop_running_hub || true
|
||
echo ""
|
||
|
||
# 1. Remove Plugin Integration
|
||
echo "[1/4] Removing plugin integration..."
|
||
if [ -d "$HERMES_HOME/plugins/antigravity-provider" ]; then
|
||
rm -rf "$HERMES_HOME/plugins/antigravity-provider"
|
||
echo " Removed $HERMES_HOME/plugins/antigravity-provider"
|
||
fi
|
||
|
||
# 2. Remove Launchers and Shortcuts
|
||
echo "[2/4] Removing application launchers and desktop entries..."
|
||
rm -f "$HOME/.local/bin/hermes-hub-web"
|
||
rm -f "$HERMES_HOME/bin/hermes-hub-web"
|
||
rm -f "$HOME/.local/bin/hermes-hub-stop"
|
||
rm -f "$HOME/.local/bin/lib_stop_running_hub.sh"
|
||
rm -f "$HOME/.local/share/applications/hermes-hub-web.desktop"
|
||
rm -f "$HOME/.local/share/applications/hermes-hub-stop.desktop"
|
||
|
||
if command -v update-desktop-database >/dev/null 2>&1; then
|
||
update-desktop-database "$HOME/.local/share/applications" 2>/dev/null || true
|
||
fi
|
||
|
||
# 3. User Data Handling
|
||
if [ "$PURGE_USER_DATA" = "true" ]; then
|
||
echo "[3/4] Purging user data (--purge-user-data specified)..."
|
||
rm -f "$HERMES_HOME/config/router_profiles.yaml"
|
||
rm -rf "$HERMES_HOME/agy_profiles"
|
||
rm -rf "$HERMES_HOME/codex_profiles"
|
||
rm -rf "$HERMES_HOME/opencode_profiles"
|
||
echo " User configuration and profiles purged."
|
||
else
|
||
echo "[3/4] Preserving user data and credentials."
|
||
echo " Your router profiles, auth keys, and settings in $HERMES_HOME remain intact."
|
||
fi
|
||
|
||
# 4. Post-uninstall verification: пойманный хаб действительно молчит.
|
||
echo "[4/4] Verifying no hub process remains..."
|
||
REMAINING="$(pgrep -u "$(id -u)" -f "antigravity_provider.router.web|hermes_hub_web_entry" 2>/dev/null | tr '\n' ' ')"
|
||
if [ -n "$REMAINING" ]; then
|
||
echo " ⚠ Всё ещё работает: $REMAINING — удаление файлов это не остановило."
|
||
else
|
||
echo " Хаб не работает."
|
||
fi
|
||
|
||
echo ""
|
||
echo "======================================================================"
|
||
echo " HERMES HUB UNINSTALLED SUCCESSFULLY FROM LINUX "
|
||
echo "======================================================================"
|
||
exit 0
|