Default run installs Hyprland, DMS, the font, kitty and the configs only. Scripts' tools and the Flatpak apps (Chrome, Telegram, Remmina, Nextcloud) moved behind --full. Without --full the networkEditor plugin is not deployed and its button is removed from the DMS bar. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
175 lines
9.3 KiB
Bash
Executable File
175 lines
9.3 KiB
Bash
Executable File
#!/bin/bash
|
||
# Установка райса на чистую Fedora (в том числе без Hyprland).
|
||
#
|
||
# ./install.sh только визуальная часть: Hyprland, DMS, шрифты, терминал + конфиги
|
||
# ./install.sh --full + инструменты для скриптов/биндов (fzf, tmux, tesseract, …) и приложения (Flatpak)
|
||
# ./install.sh --dry-run только показать, что будет сделано (ничего не меняет)
|
||
# ./install.sh --yes не задавать вопросов
|
||
# ./install.sh --no-packages / --no-config пропустить этап
|
||
#
|
||
# Скрипт можно запускать повторно: существующие конфиги не затираются, а переносятся в *.bak-<время>.
|
||
set -euo pipefail
|
||
|
||
REPO=$(cd "$(dirname "$0")" && pwd)
|
||
CFG=${XDG_CONFIG_HOME:-$HOME/.config}
|
||
TS=$(date +%Y%m%d-%H%M%S)
|
||
DRY=0; ASSUME_YES=0; FULL=0; DO_PKG=1; DO_CONFIG=1
|
||
|
||
COPRS=(sachesi/hyprland avengemedia/dms)
|
||
# --- визуальная часть (по умолчанию) ---
|
||
# Hyprland нет в репозиториях Fedora, он и его утилиты идут из COPR sachesi/hyprland
|
||
PKGS_HYPR=(hyprland hypridle hyprpolkitagent hyprland-guiutils
|
||
xdg-desktop-portal-hyprland xdg-desktop-portal-gtk)
|
||
# DMS (панель, лаунчер, уведомления, блокировка, обои, тема) из COPR avengemedia/dms
|
||
PKGS_SHELL=(dms)
|
||
# шрифт панели и терминал, wl-clipboard и brightnessctl нужны панели и затемнению экрана
|
||
PKGS_VISUAL=(jetbrains-mono-fonts kitty wl-clipboard brightnessctl)
|
||
# --- только с --full ---
|
||
PKGS_TOOLS=(hyprpicker hyprlock cliphist playerctl libnotify fzf tmux jq grim slurp
|
||
nautilus keepassxc nm-connection-editor network-manager-applet pavucontrol fuzzel micro
|
||
openssh-clients python3 flatpak tesseract tesseract-langpack-eng tesseract-langpack-rus
|
||
ImageMagick)
|
||
FLATPAKS=(com.google.Chrome org.telegram.desktop org.remmina.Remmina com.nextcloud.desktopclient.nextcloud)
|
||
|
||
c_hi=$'\e[1;38;2;233;30;99m'; c_dim=$'\e[2m'; c_err=$'\e[31m'; c_off=$'\e[0m'
|
||
step() { printf '\n%s==> %s%s\n' "$c_hi" "$*" "$c_off"; }
|
||
info() { printf ' %s\n' "$*"; }
|
||
warn() { printf '%s!! %s%s\n' "$c_err" "$*" "$c_off" >&2; }
|
||
die() { warn "$*"; exit 1; }
|
||
run() { if [ $DRY = 1 ]; then printf ' %s$ %s%s\n' "$c_dim" "$*" "$c_off"; else "$@"; fi; }
|
||
ask() { [ $ASSUME_YES = 1 ] && return 0; local v; read -r -p " $1 [Y/n] " v; [[ ! $v =~ ^[nNнН] ]]; }
|
||
|
||
while [ $# -gt 0 ]; do
|
||
case "$1" in
|
||
--dry-run) DRY=1 ;;
|
||
--yes|-y) ASSUME_YES=1 ;;
|
||
--full) FULL=1 ;;
|
||
--no-packages) DO_PKG=0 ;;
|
||
--no-config) DO_CONFIG=0 ;;
|
||
-h|--help) sed -n '2,10p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;;
|
||
*) die "неизвестный параметр: $1 (см. --help)" ;;
|
||
esac
|
||
shift
|
||
done
|
||
|
||
# ---------- проверки ----------
|
||
step "Проверки"
|
||
[ "$(id -u)" -ne 0 ] || die "запускайте от обычного пользователя, sudo скрипт вызовет сам"
|
||
for d in hypr dms/plugins/networkEditor systemd/user kitty; do
|
||
[ -e "$REPO/$d" ] || die "в репозитории нет $d (запускайте install.sh из корня hyprland-rising)"
|
||
done
|
||
. /etc/os-release 2>/dev/null || true
|
||
info "система: ${PRETTY_NAME:-unknown}"
|
||
info "режим: $([ $FULL = 1 ] && echo 'полный (визуал + инструменты + приложения)' || echo 'только визуал')"
|
||
if [ "${ID:-}" != fedora ]; then
|
||
warn "это не Fedora: пакетный этап рассчитан на dnf и COPR"
|
||
[ $DO_PKG = 1 ] && { ask "продолжить всё равно?" || exit 1; }
|
||
elif [ "${VERSION_ID:-}" != 44 ]; then
|
||
warn "райс собирался на Fedora 44, у вас ${VERSION_ID:-?}: COPR может не иметь сборок под эту версию"
|
||
[ $DO_PKG = 1 ] && { ask "продолжить?" || exit 1; }
|
||
fi
|
||
[ $DO_PKG = 1 ] && ! command -v sudo >/dev/null && die "нужен sudo"
|
||
[ $DRY = 1 ] && info "режим --dry-run: ничего не будет изменено"
|
||
|
||
# ---------- пакеты ----------
|
||
if [ $DO_PKG = 1 ]; then
|
||
step "Репозитории COPR: ${COPRS[*]}"
|
||
info "COPR — сторонние репозитории, пакеты в них никем не проверяются."
|
||
ask "подключить?" || die "без них Hyprland и DMS не установить (этап можно пропустить: --no-packages)"
|
||
for c in "${COPRS[@]}"; do run sudo dnf copr enable -y "$c"; done
|
||
|
||
step "Hyprland"
|
||
run sudo dnf -y install "${PKGS_HYPR[@]}"
|
||
step "DankMaterialShell"
|
||
run sudo dnf -y install "${PKGS_SHELL[@]}"
|
||
step "Шрифт, терминал и базовые утилиты оформления"
|
||
run sudo dnf -y install "${PKGS_VISUAL[@]}"
|
||
|
||
if [ $FULL = 1 ]; then
|
||
step "Инструменты для скриптов и биндов"
|
||
run sudo dnf -y install --skip-unavailable "${PKGS_TOOLS[@]}"
|
||
step "Flatpak-приложения: ${FLATPAKS[*]}"
|
||
info "Chrome, Telegram, Remmina и клиент Nextcloud используются в бинах и автозапуске."
|
||
if ask "установить?"; then
|
||
run flatpak remote-add --user --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
|
||
run flatpak install --user -y flathub "${FLATPAKS[@]}"
|
||
fi
|
||
fi
|
||
fi
|
||
|
||
# ---------- конфиги ----------
|
||
backup() { [ -e "$1" ] || [ -L "$1" ] && run mv "$1" "$1.bak-$TS" && info "старое сохранено: $1.bak-$TS" || true; }
|
||
|
||
if [ $DO_CONFIG = 1 ]; then
|
||
step "Конфиги → $CFG"
|
||
run mkdir -p "$CFG/dms/plugins" "$CFG/systemd/user" "$CFG/kitty"
|
||
|
||
backup "$CFG/hypr"
|
||
run cp -a "$REPO/hypr" "$CFG/hypr"
|
||
run chmod +x "$CFG"/hypr/scripts/*.sh "$CFG"/hypr/scripts/*.py
|
||
info "hypr/ (hyprland.lua, hypridle.conf, scripts, справка)"
|
||
|
||
if [ -f "$REPO/dms/settings.json" ]; then
|
||
backup "$CFG/dms/settings.json"
|
||
run cp -a "$REPO/dms/settings.json" "$CFG/dms/settings.json"
|
||
info "dms/settings.json (панель, тема)"
|
||
fi
|
||
|
||
if [ $FULL = 1 ]; then
|
||
backup "$CFG/dms/plugins/networkEditor"
|
||
run cp -a "$REPO/dms/plugins/networkEditor" "$CFG/dms/plugins/networkEditor"
|
||
info "плагин DMS networkEditor (кнопка nm-connection-editor)"
|
||
fi
|
||
# плагин: в полном режиме включаем, в визуальном убираем его кнопку из панели (редактора там нет)
|
||
if [ $DRY = 1 ]; then
|
||
info "${c_dim}\$ networkEditor: $([ $FULL = 1 ] && echo включить || echo 'убрать кнопку из панели') (dms/settings.json, plugin_settings.json)${c_off}"
|
||
else
|
||
python3 - "$CFG/dms" "$FULL" <<'PY'
|
||
import json, os, sys
|
||
base, full = sys.argv[1], sys.argv[2] == "1"
|
||
sp, pp = os.path.join(base, "settings.json"), os.path.join(base, "plugin_settings.json")
|
||
if full:
|
||
d = json.load(open(pp)) if os.path.exists(pp) else {}
|
||
d.setdefault("networkEditor", {})["enabled"] = True
|
||
json.dump(d, open(pp, "w"), indent=2)
|
||
elif os.path.exists(sp):
|
||
s = json.load(open(sp))
|
||
for bar in s.get("barConfigs", []):
|
||
for k in ("leftWidgets", "centerWidgets", "rightWidgets"):
|
||
if k in bar:
|
||
bar[k] = [w for w in bar[k] if not (isinstance(w, dict) and w.get("id") == "networkEditor")]
|
||
json.dump(s, open(sp, "w"), indent=2, ensure_ascii=False)
|
||
PY
|
||
fi
|
||
|
||
backup "$CFG/kitty/kitty.conf"
|
||
run cp -a "$REPO/kitty/kitty.conf" "$CFG/kitty/kitty.conf"
|
||
info "kitty/kitty.conf"
|
||
|
||
run cp -a "$REPO/systemd/user/hyprland-session.target" "$CFG/systemd/user/"
|
||
run systemctl --user daemon-reload || warn "systemctl --user недоступен (нет пользовательской сессии systemd): выполните daemon-reload после входа"
|
||
info "systemd/user/hyprland-session.target (нужен порталам: выбор файлов, демонстрация экрана)"
|
||
|
||
# каталог под ControlMaster, который использует ~/.ssh/config
|
||
[ $FULL = 1 ] && run install -d -m 700 "$HOME/.ssh" "$HOME/.ssh/sockets"
|
||
fi
|
||
|
||
# ---------- итог ----------
|
||
step "Готово"
|
||
cat <<EOF
|
||
Дальше:
|
||
1. Выйдите из сессии. На экране входа GDM нажмите на шестерёнку и выберите «Hyprland»
|
||
(именно Hyprland, не Hyprland (uwsm)).
|
||
2. Мониторы: в $CFG/hypr/hyprland.lua имена и масштаб заданы под ноутбук автора
|
||
(eDP-1, масштаб 1.25, HDMI-A-1). Свои смотрите командой: hyprctl monitors
|
||
3. Справка по клавишам: Mod+F1.
|
||
EOF
|
||
if [ $FULL = 0 ]; then
|
||
cat <<EOF
|
||
Это визуальная установка: бинды на приложения (Chrome, Telegram, SSH-меню, OCR и т. д.) не будут
|
||
работать, пока вы не поставите эти программы. Всё сразу: ./install.sh --full
|
||
EOF
|
||
fi
|
||
[ $DRY = 1 ] && info "это был --dry-run, запустите без него, чтобы применить."
|
||
exit 0
|