#!/bin/sh # Установка Qenzo на линукс. # # ЗАЧЕМ ЭТОТ ФАЙЛ. На линуксе нет способа «скачал и открыл», который работал бы # у всех. Скачанный AppImage система не считает программой, пока ему вручную не # разрешат запуск: двойной щелчок не делает ничего, а вместо значка шестерёнка. # Двойной щелчок по .deb на нынешней Ubuntu открывает АРХИВАТОР — центр # приложений локальные пакеты больше не ставит. Лев поймал оба варианта подряд: # «и что это как установить я не понимаю и другие тоже не поймут». # # Поэтому — одна команда, которую можно скопировать: # # curl -fsSL https://qenzo.ai/install.sh | sh # # Пароль НЕ нужен: всё кладётся в домашний каталог. Ставится ровно то, что # человек и ожидает увидеть: приложение в меню, со значком, запускается щелчком. # Повторный запуск обновляет установленное. # # Удалить: # rm -rf ~/.local/share/Qenzo ~/.local/share/applications/qenzo.desktop \ # ~/.local/share/icons/hicolor/512x512/apps/qenzo.png set -eu SITE="${QENZO_SITE:-https://qenzo.ai}" APP_URL="$SITE/download/Qenzo.AppImage" DIR="$HOME/.local/share/Qenzo" BIN="$DIR/Qenzo.AppImage" APPS="$HOME/.local/share/applications" DESKTOP="$APPS/qenzo.desktop" ICONS="$HOME/.local/share/icons/hicolor/512x512/apps" say() { printf '%s\n' "$*"; } die() { printf '%s\n' "$*" >&2; exit 1; } say "Qenzo — установка в домашний каталог, пароль не нужен." # --- качаем ----------------------------------------------------------------- mkdir -p "$DIR" "$APPS" "$ICONS" TMP="$DIR/.download.$$" trap 'rm -f "$TMP"' EXIT INT TERM say "Скачиваю (около 130 МБ)…" if command -v curl >/dev/null 2>&1; then curl -fL --progress-bar "$APP_URL" -o "$TMP" || die "не удалось скачать $APP_URL" elif command -v wget >/dev/null 2>&1; then wget -q --show-progress -O "$TMP" "$APP_URL" || die "не удалось скачать $APP_URL" else die "нужен curl или wget" fi # Оборванная закачка и страница ошибки вместо файла выглядят одинаково — как # «файл на месте». Проверяем и размер, и то, что это вообще исполняемый файл. size=$(wc -c < "$TMP") [ "$size" -gt 50000000 ] || die "скачался обрезанный файл ($size байт) — попробуйте ещё раз" magic=$(od -An -N4 -tx1 < "$TMP" | tr -d ' \n') [ "$magic" = "7f454c46" ] || die "скачалось не приложение — проверьте соединение" chmod +x "$TMP" mv -f "$TMP" "$BIN" trap - EXIT INT TERM # --- значок ----------------------------------------------------------------- # Берём из самого приложения: так он всегда совпадает со сборкой, и скрипту не # нужен второй адрес, который может протухнуть отдельно от первого. ( cd "$DIR" || exit 0 rm -rf squashfs-root "$BIN" --appimage-extract 'usr/share/icons/hicolor/512x512/apps/qenzo.png' >/dev/null 2>&1 || true ) if [ -f "$DIR/squashfs-root/usr/share/icons/hicolor/512x512/apps/qenzo.png" ]; then cp -f "$DIR/squashfs-root/usr/share/icons/hicolor/512x512/apps/qenzo.png" "$ICONS/qenzo.png" fi rm -rf "$DIR/squashfs-root" # --- пункт меню ------------------------------------------------------------- # ⚠️ Ровно ОДНА главная категория: три (Utility;AudioVideo;Accessibility) # показывают приложение в меню трижды, об этом прямым текстом предупреждает # desktop-file-validate. cat > "$DESKTOP" </dev/null 2>&1 && update-desktop-database "$APPS" >/dev/null 2>&1 || true command -v gtk-update-icon-cache >/dev/null 2>&1 && gtk-update-icon-cache -f -t "$HOME/.local/share/icons/hicolor" >/dev/null 2>&1 || true say "" say "Готово. Qenzo появился в меню приложений." say "Запустить сейчас: $BIN"