Files
hyprland-rising/install.sh
T
aibrashandClaude Sonnet 5.5 e47f54d394 Add install.sh for a clean Fedora machine
Enables the sachesi/hyprland and avengemedia/dms COPRs, installs Hyprland,
DMS and the tools used by the scripts, optionally the Flatpak apps, then
deploys the configs into ~/.config. Existing configs are moved to
*.bak-<time>, so re-running is safe; --dry-run only prints the plan.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-30 13:53:48 +05:00

153 lines
7.9 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# Установка райса на чистую Fedora (проверено на структуре Fedora 44), в том числе без Hyprland.
#
# ./install.sh всё: репозитории, пакеты, Flatpak-приложения, конфиги
# ./install.sh --dry-run только показать, что будет сделано (ничего не меняет)
# ./install.sh --yes не задавать вопросов
# ./install.sh --no-packages / --no-flatpak / --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; DO_PKG=1; DO_FLATPAK=1; DO_CONFIG=1
COPRS=(sachesi/hyprland avengemedia/dms)
# Hyprland нет в репозиториях Fedora, он и его утилиты идут из COPR sachesi/hyprland
PKGS_HYPR=(hyprland hyprlock hypridle hyprpaper hyprpicker hyprland-guiutils hyprpolkitagent
xdg-desktop-portal-hyprland xdg-desktop-portal-gtk)
# DMS (панель, лаунчер, уведомления, блокировка) из COPR avengemedia/dms вместе с quickshell, matugen, dgop
PKGS_SHELL=(dms)
# то, чем пользуются скрипты и бинды
PKGS_TOOLS=(kitty fzf tmux jq grim slurp wl-clipboard cliphist playerctl brightnessctl libnotify
nautilus keepassxc nm-connection-editor network-manager-applet pavucontrol fuzzel micro
openssh-clients python3 flatpak tesseract tesseract-langpack-eng tesseract-langpack-rus
ImageMagick jetbrains-mono-fonts)
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 ;;
--no-packages) DO_PKG=0 ;;
--no-flatpak) DO_FLATPAK=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}"
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 --skip-unavailable "${PKGS_TOOLS[@]}"
fi
# ---------- flatpak ----------
if [ $DO_FLATPAK = 1 ]; then
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
# ---------- конфиги ----------
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, справка)"
backup "$CFG/dms/plugins/networkEditor"
run cp -a "$REPO/dms/plugins/networkEditor" "$CFG/dms/plugins/networkEditor"
info "плагин DMS networkEditor"
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 [ $DRY = 1 ]; then
info "${c_dim}\$ включить networkEditor в $CFG/dms/plugin_settings.json${c_off}"
else
python3 - "$CFG/dms/plugin_settings.json" <<'PY'
import json, os, sys
p = sys.argv[1]
d = json.load(open(p)) if os.path.exists(p) else {}
d.setdefault("networkEditor", {})["enabled"] = True
json.dump(d, open(p, "w"), indent=2)
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
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. SSH-меню (Mod+S) читает ваш ~/.ssh/config; ключи и сам конфиг скрипт не создаёт.
4. Справка по клавишам: Mod+F1.
EOF
[ $DRY = 1 ] && info "это был --dry-run, запустите без него, чтобы применить."
exit 0