Files
hyprland-rising/install.sh
T
aibrashandClaude Sonnet 5.5 04e868102d install.sh: visual-only by default, --full for tools and apps
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>
2026-10-30 13:56:03 +05:00

175 lines
9.3 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 (в том числе без 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