diff --git a/README.md b/README.md index 3af822a..3dc5ab7 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ Hyprland 0.57 на Fedora 44: тёмный минималистичный рай | `dms/settings.json` | настройки DMS (панель, тема `pink`, лаунчер) | | `systemd/user/hyprland-session.target` | нужен порталам (`xdg-desktop-portal`) вне uwsm | | `kitty/kitty.conf` | терминал | +| `install.sh` | установка на чистую Fedora: репозитории, пакеты, Flatpak, конфиги | | `sync.sh` | копирует живой конфиг из `~/.config` в репозиторий | Панель, уведомления, лаунчер, блокировка, обои и буфер обмена — это @@ -48,27 +49,37 @@ Host proxmox1 бэкап в `~/.local/state/ssh-menu/backups`. Для хостов с `env: prod` перед broadcast и запуском команды спрашивается подтверждение. -## Установка +## Установка на чистую Fedora -Hyprland нет в репозиториях Fedora 44, он ставится из COPR: - -```bash -sudo dnf copr enable sachesi/hyprland -sudo dnf install hyprland hyprlock hypridle hyprpaper hyprpicker \ - xdg-desktop-portal-hyprland hyprland-guiutils hyprpolkitagent cliphist playerctl -# инструменты, которые используют скрипты -sudo dnf install fzf tmux kitty jq grim slurp wl-clipboard brightnessctl \ - nautilus keepassxc nm-connection-editor tesseract tesseract-langpack-eng \ - tesseract-langpack-rus ImageMagick jetbrains-mono-fonts -``` - -DMS ставится из COPR `avengemedia/dms` (см. документацию DMS). В автозапуске и на биндах -используются Flatpak-приложения: `com.google.Chrome`, `org.telegram.desktop`, -`org.remmina.Remmina`, `com.nextcloud.desktopclient.nextcloud`. +Нужна обычная Fedora (в том числе без Hyprland), пользователь с `sudo` и сеть: ```bash git clone git@git.ibrash.duckdns.org:aibrash/hyprland-rising.git cd hyprland-rising +./install.sh --dry-run # посмотреть, что будет сделано, ничего не меняя +./install.sh # установить +``` + +Скрипт по шагам: + +1. подключает COPR `sachesi/hyprland` (Hyprland нет в репозиториях Fedora) и `avengemedia/dms` (DMS); +2. ставит Hyprland с утилитами, DMS и инструменты для скриптов (kitty, fzf, tmux, grim, tesseract и т. д.); +3. ставит Flatpak-приложения из биндов и автозапуска: Chrome, Telegram, Remmina, клиент Nextcloud; +4. раскладывает конфиги в `~/.config` (`hypr`, плагин и настройки DMS, `kitty`, `hyprland-session.target`), + включает плагин `networkEditor` и создаёт `~/.ssh/sockets`. + +Существующие конфиги не затираются: они переносятся в `*.bak-<время>`, повторный запуск безопасен. +Этапы можно пропустить: `--no-packages`, `--no-flatpak`, `--no-config`; `--yes` отключает вопросы. +После установки выйдите из сессии и выберите в GDM **Hyprland** (не `hyprland-uwsm`). + +COPR — сторонние репозитории, пакеты в них никем не проверяются. + +### Вручную (без скрипта) + +```bash +sudo dnf copr enable sachesi/hyprland avengemedia/dms +sudo dnf install hyprland hyprlock hypridle hyprpaper hyprpicker hyprland-guiutils hyprpolkitagent \ + xdg-desktop-portal-hyprland xdg-desktop-portal-gtk dms cp -r hypr ~/.config/ mkdir -p ~/.config/dms/plugins ~/.config/systemd/user cp -r dms/plugins/networkEditor ~/.config/dms/plugins/ @@ -76,10 +87,9 @@ cp systemd/user/hyprland-session.target ~/.config/systemd/user/ systemctl --user daemon-reload ``` -Чтобы плагин `networkEditor` заработал, включите его в настройках DMS (Plugins) и добавьте виджет -в панель. Либо скопируйте `dms/settings.json` в `~/.config/dms/` и создайте -`~/.config/dms/plugin_settings.json` с содержимым `{"networkEditor": {"enabled": true}}`, затем `dms restart`. -После этого выберите в GDM сессию **Hyprland** (не `hyprland-uwsm`). +Полный список пакетов-инструментов см. в начале `install.sh`. Плагин `networkEditor` включите в настройках +DMS (Plugins) или создайте `~/.config/dms/plugin_settings.json` с `{"networkEditor": {"enabled": true}}` +и выполните `dms restart`. ## Под себя diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..48591ab --- /dev/null +++ b/install.sh @@ -0,0 +1,152 @@ +#!/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 <