Feat: Hyprland-Desktop mit Debian-Hyprland-Installer und interaktivem Dotfiles-Setup
Co-authored-by: Junie <junie@jetbrains.com>
This commit is contained in:
@@ -44,7 +44,7 @@ Dieses Repository ist ein modulares, automatisiertes Setup- und Konfigurations-F
|
|||||||
│ ├── 06-services.sh # Aktivierung von AppArmor, Docker, Libvirt, zram
|
│ ├── 06-services.sh # Aktivierung von AppArmor, Docker, Libvirt, zram
|
||||||
│ ├── 07-skel-and-user.sh # /etc/skel Vorlagen, ZSH-Shell-Setzen, Dotfiles-Sync
|
│ ├── 07-skel-and-user.sh # /etc/skel Vorlagen, ZSH-Shell-Setzen, Dotfiles-Sync
|
||||||
│ ├── 08-flatpaks-apps.sh # Flathub Setup, Flatpaks, Spotify, Waydroid, MIME-Types
|
│ ├── 08-flatpaks-apps.sh # Flathub Setup, Flatpaks, Spotify, Waydroid, MIME-Types
|
||||||
│ └── 09-hyprland.sh # LinuxBeginnings Debian-Hyprland Auto-Installer
|
│ └── 09-hyprland.sh # LinuxBeginnings Debian-Hyprland Auto-Installer & Desktop-Setup
|
||||||
├── data/ # Statische Konfigurationsdateien & Vorlagen
|
├── data/ # Statische Konfigurationsdateien & Vorlagen
|
||||||
│ ├── apt/
|
│ ├── apt/
|
||||||
│ │ ├── sources.list.d/ # Deb822-Quellen (debian-unstable.sources, xanmod.sources)
|
│ │ ├── sources.list.d/ # Deb822-Quellen (debian-unstable.sources, xanmod.sources)
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ sudo ./setup.sh --stages 04,05
|
|||||||
├── etc/
|
├── etc/
|
||||||
│ ├── environment.d/ # 99-raytracing.conf, 99-upscaling.conf
|
│ ├── environment.d/ # 99-raytracing.conf, 99-upscaling.conf
|
||||||
│ └── profile.d/ # Bereinigte System-Profile-Skripte
|
│ └── profile.d/ # Bereinigte System-Profile-Skripte
|
||||||
├── skel/ # .zshrc, Templates für Dokumente & Skripte
|
├── skel/ # .zshrc, .config/hypr, Templates für Dokumente & Skripte
|
||||||
└── usr/share/applications/ # Desktop-Dateien (z. B. Spotify)
|
└── usr/share/applications/ # Desktop-Dateien (z. B. Spotify)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ firmware-misc-nonfree
|
|||||||
flatpak
|
flatpak
|
||||||
flatseal
|
flatseal
|
||||||
fzf
|
fzf
|
||||||
|
git
|
||||||
glances
|
glances
|
||||||
gnome-disk-utility
|
gnome-disk-utility
|
||||||
gnome-firmware
|
gnome-firmware
|
||||||
|
|||||||
@@ -0,0 +1,97 @@
|
|||||||
|
# ==============================================================================
|
||||||
|
# Rudimentäre Hyprland-Konfiguration (Standard für neue Benutzer)
|
||||||
|
# ==============================================================================
|
||||||
|
|
||||||
|
# Monitor Setup (Standard: Automatische Auflösung & Positionierung)
|
||||||
|
monitor = , preferred, auto, 1
|
||||||
|
|
||||||
|
# Modifikator-Taste: SUPER (Windows-Taste)
|
||||||
|
$mainMod = SUPER
|
||||||
|
|
||||||
|
# Standard-Terminal
|
||||||
|
$terminal = kitty
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# Tastenbelegungen (Keybindings)
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# SUPER + ENTER: Kitty Terminal öffnen
|
||||||
|
bind = $mainMod, RETURN, exec, $terminal
|
||||||
|
bind = $mainMod, Return, exec, $terminal
|
||||||
|
|
||||||
|
# SUPER + Q: Aktives Fenster schließen
|
||||||
|
bind = $mainMod, Q, killactive,
|
||||||
|
|
||||||
|
# Grundlegende Navigation & Fensterverwaltung
|
||||||
|
bind = $mainMod, M, exit,
|
||||||
|
bind = $mainMod, E, exec, thunar
|
||||||
|
bind = $mainMod, V, togglefloating,
|
||||||
|
bind = $mainMod, F, fullscreen,
|
||||||
|
|
||||||
|
# Fokus mit Pfeiltasten wechseln
|
||||||
|
bind = $mainMod, left, movefocus, l
|
||||||
|
bind = $mainMod, right, movefocus, r
|
||||||
|
bind = $mainMod, up, movefocus, u
|
||||||
|
bind = $mainMod, down, movefocus, d
|
||||||
|
|
||||||
|
# Workspaces 1-10 wechseln
|
||||||
|
bind = $mainMod, 1, workspace, 1
|
||||||
|
bind = $mainMod, 2, workspace, 2
|
||||||
|
bind = $mainMod, 3, workspace, 3
|
||||||
|
bind = $mainMod, 4, workspace, 4
|
||||||
|
bind = $mainMod, 5, workspace, 5
|
||||||
|
bind = $mainMod, 6, workspace, 6
|
||||||
|
bind = $mainMod, 7, workspace, 7
|
||||||
|
bind = $mainMod, 8, workspace, 8
|
||||||
|
bind = $mainMod, 9, workspace, 9
|
||||||
|
bind = $mainMod, 0, workspace, 10
|
||||||
|
|
||||||
|
# Aktives Fenster auf Workspace 1-10 verschieben
|
||||||
|
bind = $mainMod SHIFT, 1, movetoworkspace, 1
|
||||||
|
bind = $mainMod SHIFT, 2, movetoworkspace, 2
|
||||||
|
bind = $mainMod SHIFT, 3, movetoworkspace, 3
|
||||||
|
bind = $mainMod SHIFT, 4, movetoworkspace, 4
|
||||||
|
bind = $mainMod SHIFT, 5, movetoworkspace, 5
|
||||||
|
bind = $mainMod SHIFT, 6, movetoworkspace, 6
|
||||||
|
bind = $mainMod SHIFT, 7, movetoworkspace, 7
|
||||||
|
bind = $mainMod SHIFT, 8, movetoworkspace, 8
|
||||||
|
bind = $mainMod SHIFT, 9, movetoworkspace, 9
|
||||||
|
bind = $mainMod SHIFT, 0, movetoworkspace, 10
|
||||||
|
|
||||||
|
# Fenster mit Maus bewegen und vergrößern/verkleinern
|
||||||
|
bindm = $mainMod, mouse:272, movewindow
|
||||||
|
bindm = $mainMod, mouse:273, resizewindow
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# Erscheinungsbild & Verhalten
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
general {
|
||||||
|
gaps_in = 4
|
||||||
|
gaps_out = 8
|
||||||
|
border_size = 2
|
||||||
|
col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg
|
||||||
|
col.inactive_border = rgba(595959aa)
|
||||||
|
layout = dwindle
|
||||||
|
}
|
||||||
|
|
||||||
|
decoration {
|
||||||
|
rounding = 8
|
||||||
|
}
|
||||||
|
|
||||||
|
animations {
|
||||||
|
enabled = yes
|
||||||
|
}
|
||||||
|
|
||||||
|
input {
|
||||||
|
kb_layout = de
|
||||||
|
follow_mouse = 1
|
||||||
|
touchpad {
|
||||||
|
natural_scroll = yes
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# Autostart nach der Anmeldung
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# Fragt nach der ersten Anmeldung nach der gewünschten Dotfiles-Konfiguration
|
||||||
|
# (LinuxBeginnings Hyprland-Dots oder eigenes Git-Repository für ~/.config)
|
||||||
|
exec-once = ~/.config/hypr/scripts/install-dots-prompt.sh
|
||||||
+230
@@ -0,0 +1,230 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# ==============================================================================
|
||||||
|
# ~/.config/hypr/scripts/install-dots-prompt.sh
|
||||||
|
# Fragt nach der Anmeldung nach der gewünschten Dotfiles-Konfiguration:
|
||||||
|
# 1) LinuxBeginnings Hyprland-Dotfiles (GitHub)
|
||||||
|
# 2) Eigenes Git-Repository als ~/.config klonen
|
||||||
|
# 3) Überspringen (rudimentäre Basiskonfiguration beibehalten)
|
||||||
|
# ==============================================================================
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
MARKER_FILE="$HOME/.config/hypr/.dots_prompted"
|
||||||
|
FORCE=0
|
||||||
|
|
||||||
|
for arg in "$@"; do
|
||||||
|
case "$arg" in
|
||||||
|
-f|--force)
|
||||||
|
FORCE=1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Wenn bereits abgefragt und kein --force übergeben wurde, beenden
|
||||||
|
if [[ "$FORCE" -eq 0 && -f "$MARKER_FILE" ]]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Wenn nicht in einem interaktiven Terminal ausgeführt (z. B. via Hyprland exec-once),
|
||||||
|
# starte das Skript in einem Kitty-Fenster:
|
||||||
|
if [[ ! -t 0 || ! -t 1 ]]; then
|
||||||
|
if command -v kitty >/dev/null 2>&1; then
|
||||||
|
exec kitty --title "Dotfiles Setup & Konfiguration" bash -c "$0 --in-terminal; echo; read -r -p 'Drücke Enter zum Schließen...' || true"
|
||||||
|
else
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ANSI Farben
|
||||||
|
CLR_RESET='\033[0m'
|
||||||
|
CLR_BOLD='\033[1m'
|
||||||
|
CLR_CYAN='\033[0;36m'
|
||||||
|
CLR_GREEN='\033[0;32m'
|
||||||
|
CLR_YELLOW='\033[0;33m'
|
||||||
|
CLR_RED='\033[0;31m'
|
||||||
|
CLR_BLUE='\033[0;34m'
|
||||||
|
CLR_MAGENTA='\033[0;35m'
|
||||||
|
|
||||||
|
mark_as_prompted() {
|
||||||
|
mkdir -p "$(dirname "$MARKER_FILE")" 2>/dev/null || true
|
||||||
|
touch "$MARKER_FILE" 2>/dev/null || true
|
||||||
|
}
|
||||||
|
|
||||||
|
install_linuxbeginnings() {
|
||||||
|
printf "\n"
|
||||||
|
printf "%b\n" "${CLR_GREEN}${CLR_BOLD}[INFO] Starte Installation der LinuxBeginnings Hyprland-Dotfiles...${CLR_RESET}"
|
||||||
|
printf "\n"
|
||||||
|
if command -v curl >/dev/null 2>&1; then
|
||||||
|
mark_as_prompted
|
||||||
|
sh <(curl -fsSL https://raw.githubusercontent.com/LinuxBeginnings/Hyprland-Dots/main/Distro-Hyprland.sh)
|
||||||
|
else
|
||||||
|
printf "%b\n" "${CLR_RED}[FEHLER] 'curl' ist nicht installiert. Bitte installieren Sie curl und wiederholen Sie den Vorgang.${CLR_RESET}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
clone_custom_repo() {
|
||||||
|
if ! command -v git >/dev/null 2>&1; then
|
||||||
|
printf "\n%b\n" "${CLR_RED}[FEHLER] 'git' ist nicht installiert. Bitte installieren Sie git zuerst.${CLR_RESET}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
printf "\n"
|
||||||
|
printf "%b\n" "${CLR_BOLD}${CLR_CYAN}--- Eigenes Git-Repository für ~/.config klonen ---${CLR_RESET}"
|
||||||
|
printf "%b\n" "Geben Sie die Git-URL Ihres Dotfiles-/Config-Repositories an."
|
||||||
|
printf "%b\n" "Beispiele:"
|
||||||
|
printf "%b\n" " HTTPS : ${CLR_BLUE}https://github.com/Benutzername/mein-config-repo.git${CLR_RESET}"
|
||||||
|
printf "%b\n" " SSH : ${CLR_BLUE}git@github.com:Benutzername/mein-config-repo.git${CLR_RESET}"
|
||||||
|
printf "\n"
|
||||||
|
printf "%b\n" "${CLR_YELLOW}Hinweise zur Authentifizierung:${CLR_RESET}"
|
||||||
|
printf "%b\n" " - ${CLR_BOLD}HTTPS:${CLR_RESET} Bei privaten Repositories fragt Git nach Benutzername & Personal Access Token (PAT)."
|
||||||
|
printf "%b\n" " - ${CLR_BOLD}SSH:${CLR_RESET} Erfordert einen hinterlegten SSH-Schlüssel (z. B. in ~/.ssh/ oder via ssh-agent)."
|
||||||
|
printf "\n"
|
||||||
|
|
||||||
|
read -r -p "Git-Repository-URL (oder 'q' zum Abbrechen): " repo_url
|
||||||
|
repo_url="$(echo "$repo_url" | xargs)"
|
||||||
|
|
||||||
|
if [[ "$repo_url" == "q" || "$repo_url" == "Q" || -z "$repo_url" ]]; then
|
||||||
|
printf "%b\n" "${CLR_YELLOW}[INFO] Vorgang abgebrochen. Kehre zum Hauptmenü zurück.${CLR_RESET}"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# SSH-Prüfung und Hilfestellung
|
||||||
|
if [[ "$repo_url" =~ ^git@ || "$repo_url" =~ ^ssh:// ]]; then
|
||||||
|
local ssh_keys_found=0
|
||||||
|
if [[ -d "$HOME/.ssh" ]]; then
|
||||||
|
for k in "$HOME/.ssh"/id_*; do
|
||||||
|
if [[ -f "$k" && ! "$k" =~ \.pub$ ]]; then
|
||||||
|
ssh_keys_found=1
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$ssh_keys_found" -eq 0 ]]; then
|
||||||
|
printf "\n"
|
||||||
|
printf "%b\n" "${CLR_YELLOW}[WARNUNG] Es wurde kein lokaler SSH-Privatschlüssel in ~/.ssh/ gefunden.${CLR_RESET}"
|
||||||
|
read -r -p "Möchten Sie vor dem Klonen ein neues SSH-Schlüsselpaar (ed25519) generieren? [j/N]: " gen_ssh || gen_ssh="n"
|
||||||
|
if [[ "$gen_ssh" =~ ^[JjYy] ]]; then
|
||||||
|
mkdir -p "$HOME/.ssh"
|
||||||
|
chmod 700 "$HOME/.ssh"
|
||||||
|
ssh-keygen -t ed25519 -f "$HOME/.ssh/id_ed25519" -C "$USER@$(hostname)"
|
||||||
|
printf "\n%b\n" "${CLR_GREEN}Neuer öffentlicher SSH-Schlüssel (~/.ssh/id_ed25519.pub):${CLR_RESET}"
|
||||||
|
cat "$HOME/.ssh/id_ed25519.pub"
|
||||||
|
printf "\n%b\n" "Bitte fügen Sie diesen Schlüssel bei GitHub/GitLab zu Ihrem Account hinzu."
|
||||||
|
if command -v wl-copy >/dev/null 2>&1; then
|
||||||
|
if wl-copy < "$HOME/.ssh/id_ed25519.pub" 2>/dev/null; then
|
||||||
|
printf "%b\n" "${CLR_GREEN}(In die Zwischenablage kopiert!)${CLR_RESET}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
read -r -p "Drücken Sie Enter, sobald der SSH-Key hinterlegt wurde..."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Backup und Klon-Vorgang vorbereiten
|
||||||
|
local timestamp
|
||||||
|
timestamp="$(date +%Y%m%d_%H%M%S)"
|
||||||
|
local backup_dir="$HOME/.config.backup_$timestamp"
|
||||||
|
|
||||||
|
printf "\n"
|
||||||
|
printf "%b\n" "${CLR_CYAN}[1/3] Sichere bestehendes ~/.config-Verzeichnis nach ${backup_dir}...${CLR_RESET}"
|
||||||
|
|
||||||
|
if [[ -d "$HOME/.config" ]]; then
|
||||||
|
mv "$HOME/.config" "$backup_dir"
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf "%b\n" "${CLR_CYAN}[2/3] Klone Repository direkt nach ~/.config...${CLR_RESET}"
|
||||||
|
|
||||||
|
# Git ausführen mit aktivierter Terminal-Eingabeaufforderung für Authentifizierung
|
||||||
|
if env GIT_TERMINAL_PROMPT=1 git clone --recurse-submodules "$repo_url" "$HOME/.config"; then
|
||||||
|
printf "\n"
|
||||||
|
printf "%b\n" "${CLR_GREEN}${CLR_BOLD}[ERFOLG] Repository wurde erfolgreich nach ~/.config geklont!${CLR_RESET}"
|
||||||
|
printf "%b\n" " - Ihr gesamter ${CLR_BOLD}~/.config${CLR_RESET}-Ordner ist nun das Git-Repository."
|
||||||
|
printf "%b\n" " - Vorherige Konfigurationen wurden gesichert in: ${CLR_BOLD}${backup_dir}${CLR_RESET}"
|
||||||
|
|
||||||
|
mark_as_prompted
|
||||||
|
|
||||||
|
# Hyprland-Konfiguration neu laden falls aktiv
|
||||||
|
if command -v hyprctl >/dev/null 2>&1; then
|
||||||
|
printf "\n"
|
||||||
|
printf "%b\n" "${CLR_CYAN}[3/3] Lade Hyprland-Konfiguration neu...${CLR_RESET}"
|
||||||
|
hyprctl reload 2>/dev/null || true
|
||||||
|
printf "%b\n" "${CLR_GREEN}[✓] Hyprland erfolgreich aktualisiert.${CLR_RESET}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf "\n"
|
||||||
|
printf "%b\n" "${CLR_GREEN}Einrichtung abgeschlossen!${CLR_RESET}"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
printf "\n"
|
||||||
|
printf "%b\n" "${CLR_RED}${CLR_BOLD}[FEHLER] Git Clone ist fehlgeschlagen (Authentifizierungsfehler, falsche URL oder Netzwerkproblem).${CLR_RESET}"
|
||||||
|
printf "%b\n" "${CLR_YELLOW}[ROLLBACK] Stelle vorheriges ~/.config-Verzeichnis aus dem Backup wieder her...${CLR_RESET}"
|
||||||
|
rm -rf "$HOME/.config" 2>/dev/null || true
|
||||||
|
if [[ -d "$backup_dir" ]]; then
|
||||||
|
mv "$backup_dir" "$HOME/.config"
|
||||||
|
printf "%b\n" "${CLR_GREEN}[✓] Ursprüngliches ~/.config-Verzeichnis wurde vollständig wiederhergestellt.${CLR_RESET}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf "\n"
|
||||||
|
read -r -p "Möchten Sie es erneut versuchen? [J/n]: " retry || retry="n"
|
||||||
|
if [[ ! "$retry" =~ ^[JjYy] && -n "$retry" ]]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
clear 2>/dev/null || true
|
||||||
|
printf "%b\n" "${CLR_BOLD}${CLR_CYAN}==============================================================================${CLR_RESET}"
|
||||||
|
printf "%b\n" "${CLR_BOLD}${CLR_CYAN} Hyprland Desktop - Dotfiles Setup & Konfiguration ${CLR_RESET}"
|
||||||
|
printf "%b\n" "${CLR_BOLD}${CLR_CYAN}==============================================================================${CLR_RESET}"
|
||||||
|
printf "\n"
|
||||||
|
printf "%b\n" "Willkommen auf Ihrem neuen Debian Unstable Hyprland-System!"
|
||||||
|
printf "\n"
|
||||||
|
printf "%b\n" "Aktuell ist eine rudimentäre Basiskonfiguration aktiv:"
|
||||||
|
printf "%b\n" " - ${CLR_BOLD}SUPER + ENTER${CLR_RESET} : Terminal (Kitty) öffnen"
|
||||||
|
printf "%b\n" " - ${CLR_BOLD}SUPER + Q${CLR_RESET} : Aktives Fenster schließen"
|
||||||
|
printf "\n"
|
||||||
|
printf "%b\n" "Wie möchten Sie Ihre Desktop-Konfiguration (Dotfiles) einrichten?"
|
||||||
|
printf "\n"
|
||||||
|
printf "%b\n" " ${CLR_BOLD}[1]${CLR_RESET} ${CLR_GREEN}LinuxBeginnings Hyprland-Dotfiles installieren${CLR_RESET}"
|
||||||
|
printf "%b\n" " Vollständig vorkonfiguriertes Setup (Waybar, Rofi, Animationen, Themes)"
|
||||||
|
printf "%b\n" " URL: https://github.com/LinuxBeginnings/Hyprland-Dots"
|
||||||
|
printf "\n"
|
||||||
|
printf "%b\n" " ${CLR_BOLD}[2]${CLR_RESET} ${CLR_MAGENTA}Eigenes Git-Repository als ~/.config klonen${CLR_RESET}"
|
||||||
|
printf "%b\n" " Klont Ihr eigenes Git-Repository direkt als vollständigen ~/.config-Ordner."
|
||||||
|
printf "%b\n" " (Unterstützt HTTPS & SSH inkl. Authentifizierung)"
|
||||||
|
printf "\n"
|
||||||
|
printf "%b\n" " ${CLR_BOLD}[3]${CLR_RESET} ${CLR_YELLOW}Überspringen / Basiskonfiguration beibehalten${CLR_RESET}"
|
||||||
|
printf "%b\n" " Keine Änderungen vornehmen (kann später manuell eingerichtet werden)."
|
||||||
|
printf "\n"
|
||||||
|
printf "%b\n" "${CLR_BOLD}${CLR_CYAN}------------------------------------------------------------------------------${CLR_RESET}"
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
read -r -p "Bitte wählen Sie eine Option [1-3] (Standard: 1): " choice || choice="1"
|
||||||
|
choice="$(echo "$choice" | xargs)"
|
||||||
|
[[ -z "$choice" ]] && choice="1"
|
||||||
|
|
||||||
|
case "$choice" in
|
||||||
|
1)
|
||||||
|
install_linuxbeginnings
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
clone_custom_repo
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
3)
|
||||||
|
mark_as_prompted
|
||||||
|
printf "\n"
|
||||||
|
printf "%b\n" "${CLR_YELLOW}[INFO] Einrichtung übersprungen. Die Basiskonfiguration bleibt aktiv.${CLR_RESET}"
|
||||||
|
printf "%b\n" "Sie können dieses Menü jederzeit erneut aufrufen mit:"
|
||||||
|
printf "%b\n" " ${CLR_BOLD}~/.config/hypr/scripts/install-dots-prompt.sh --force${CLR_RESET}"
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
printf "%b\n" "${CLR_RED}Ungültige Eingabe. Bitte 1, 2 oder 3 wählen.${CLR_RESET}"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
+1
-1
@@ -35,7 +35,7 @@ tui_select_stages() {
|
|||||||
"06" "System-Dienste (AppArmor, Docker, Libvirt, zram)" ON \
|
"06" "System-Dienste (AppArmor, Docker, Libvirt, zram)" ON \
|
||||||
"07" "Userland & Skel (Zsh, Skel-Templates, Dotfiles)" ON \
|
"07" "Userland & Skel (Zsh, Skel-Templates, Dotfiles)" ON \
|
||||||
"08" "Flatpaks & Apps (Flathub, Flatpaks, MIME)" ON \
|
"08" "Flatpaks & Apps (Flathub, Flatpaks, MIME)" ON \
|
||||||
"09" "Hyprland Desktop (LinuxBeginnings Installer)" ON \
|
"09" "Hyprland Desktop (LinuxBeginnings Debian-Hyprland Installer)" ON \
|
||||||
3>&1 1>&2 2>&3) || {
|
3>&1 1>&2 2>&3) || {
|
||||||
log_info "Setup durch Benutzer abgebrochen."
|
log_info "Setup durch Benutzer abgebrochen."
|
||||||
exit 0
|
exit 0
|
||||||
|
|||||||
+5
-5
@@ -118,8 +118,8 @@ prompt_target_user() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -n "$candidate" && "$candidate" != "root" ]]; then
|
if [[ -n "$candidate" && "$candidate" != "root" ]]; then
|
||||||
printf "\n${CLR_CYAN}Target User Detection:${CLR_RESET}\n" > "$tty_out"
|
printf "\n%bTarget User Detection:%b\n" "${CLR_CYAN}" "${CLR_RESET}" > "$tty_out"
|
||||||
printf "Detected target user: ${CLR_BOLD}%s${CLR_RESET}\n" "$candidate" > "$tty_out"
|
printf "Detected target user: %b%s%b\n" "${CLR_BOLD}" "$candidate" "${CLR_RESET}" > "$tty_out"
|
||||||
local answer=""
|
local answer=""
|
||||||
read -r -p "Use target user '$candidate'? [Y/n]: " answer < "$tty_in" > "$tty_out" 2>&1 || answer="y"
|
read -r -p "Use target user '$candidate'? [Y/n]: " answer < "$tty_in" > "$tty_out" 2>&1 || answer="y"
|
||||||
if [[ -z "$answer" || "$answer" =~ ^[YyJj] ]]; then
|
if [[ -z "$answer" || "$answer" =~ ^[YyJj] ]]; then
|
||||||
@@ -132,15 +132,15 @@ prompt_target_user() {
|
|||||||
read -r -p "Please enter the target desktop username: " input_user < "$tty_in" > "$tty_out" 2>&1 || true
|
read -r -p "Please enter the target desktop username: " input_user < "$tty_in" > "$tty_out" 2>&1 || true
|
||||||
input_user="$(echo "$input_user" | tr -d '[:space:]')"
|
input_user="$(echo "$input_user" | tr -d '[:space:]')"
|
||||||
if [[ -z "$input_user" ]]; then
|
if [[ -z "$input_user" ]]; then
|
||||||
printf "${CLR_YELLOW}Username cannot be empty.${CLR_RESET}\n" > "$tty_out"
|
printf "%bUsername cannot be empty.%b\n" "${CLR_YELLOW}" "${CLR_RESET}" > "$tty_out"
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
if [[ "$input_user" == "root" ]]; then
|
if [[ "$input_user" == "root" ]]; then
|
||||||
printf "${CLR_YELLOW}Root cannot be used as target desktop user.${CLR_RESET}\n" > "$tty_out"
|
printf "%bRoot cannot be used as target desktop user.%b\n" "${CLR_YELLOW}" "${CLR_RESET}" > "$tty_out"
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
if ! id "$input_user" >/dev/null 2>&1; then
|
if ! id "$input_user" >/dev/null 2>&1; then
|
||||||
printf "${CLR_YELLOW}User '%s' does not exist on this system.${CLR_RESET}\n" "$input_user" > "$tty_out"
|
printf "%bUser '%s' does not exist on this system.%b\n" "${CLR_YELLOW}" "$input_user" "${CLR_RESET}" > "$tty_out"
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
chosen="$input_user"
|
chosen="$input_user"
|
||||||
|
|||||||
@@ -44,11 +44,18 @@ fi
|
|||||||
if [[ -f "$SCRIPT_DIR/data/skel/.zshrc" ]]; then
|
if [[ -f "$SCRIPT_DIR/data/skel/.zshrc" ]]; then
|
||||||
cp "$SCRIPT_DIR/data/skel/.zshrc" /etc/skel/.zshrc
|
cp "$SCRIPT_DIR/data/skel/.zshrc" /etc/skel/.zshrc
|
||||||
fi
|
fi
|
||||||
|
if [[ -d "$SCRIPT_DIR/data/skel/.config" ]]; then
|
||||||
|
mkdir -p /etc/skel/.config
|
||||||
|
cp -r "$SCRIPT_DIR"/data/skel/.config/* /etc/skel/.config/ 2>/dev/null || true
|
||||||
|
if [[ -d /etc/skel/.config/hypr/scripts ]]; then
|
||||||
|
chmod 0755 /etc/skel/.config/hypr/scripts/*.sh 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
chown -R root:root /etc/skel
|
chown -R root:root /etc/skel
|
||||||
|
|
||||||
# 3. Synchronize User Environment for Target User
|
# 3. Synchronize User Environment for Target User
|
||||||
log_substep "Synchronizing Dotfiles & Templates into $TARGET_HOME..."
|
log_substep "Synchronizing Dotfiles & Templates into $TARGET_HOME..."
|
||||||
mkdir -p "$TARGET_HOME/Templates"
|
mkdir -p "$TARGET_HOME/Templates" "$TARGET_HOME/.config"
|
||||||
|
|
||||||
# Backup existing .zshrc if present
|
# Backup existing .zshrc if present
|
||||||
if [[ -f "$TARGET_HOME/.zshrc" ]]; then
|
if [[ -f "$TARGET_HOME/.zshrc" ]]; then
|
||||||
@@ -63,6 +70,18 @@ if [[ -d "$SCRIPT_DIR/data/skel/Templates" ]]; then
|
|||||||
cp -r "$SCRIPT_DIR"/data/skel/Templates/* "$TARGET_HOME/Templates/" 2>/dev/null || true
|
cp -r "$SCRIPT_DIR"/data/skel/Templates/* "$TARGET_HOME/Templates/" 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Backup existing Hyprland config if present
|
||||||
|
if [[ -f "$TARGET_HOME/.config/hypr/hyprland.conf" ]]; then
|
||||||
|
backup_file_or_dir "$TARGET_HOME/.config/hypr/hyprland.conf"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -d "$SCRIPT_DIR/data/skel/.config" ]]; then
|
||||||
|
cp -r "$SCRIPT_DIR"/data/skel/.config/* "$TARGET_HOME/.config/" 2>/dev/null || true
|
||||||
|
if [[ -d "$TARGET_HOME/.config/hypr/scripts" ]]; then
|
||||||
|
chmod 0755 "$TARGET_HOME"/.config/hypr/scripts/*.sh 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# 4. Install Oh-My-Zsh for Target User (if not already installed)
|
# 4. Install Oh-My-Zsh for Target User (if not already installed)
|
||||||
if [[ ! -d "$TARGET_HOME/.oh-my-zsh" ]]; then
|
if [[ ! -d "$TARGET_HOME/.oh-my-zsh" ]]; then
|
||||||
log_substep "Installing Oh-My-Zsh repository for $TARGET_USER..."
|
log_substep "Installing Oh-My-Zsh repository for $TARGET_USER..."
|
||||||
@@ -72,7 +91,7 @@ if [[ ! -d "$TARGET_HOME/.oh-my-zsh" ]]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Fix ownership
|
# Fix ownership
|
||||||
chown -R "$TARGET_USER:$TARGET_USER" "$TARGET_HOME/.zshrc" "$TARGET_HOME/Templates"
|
chown -R "$TARGET_USER:$TARGET_USER" "$TARGET_HOME/.zshrc" "$TARGET_HOME/Templates" "$TARGET_HOME/.config"
|
||||||
if [[ -d "$TARGET_HOME/.oh-my-zsh" ]]; then
|
if [[ -d "$TARGET_HOME/.oh-my-zsh" ]]; then
|
||||||
chown -R "$TARGET_USER:$TARGET_USER" "$TARGET_HOME/.oh-my-zsh"
|
chown -R "$TARGET_USER:$TARGET_USER" "$TARGET_HOME/.oh-my-zsh"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ log_step "Running Stage 08: Flatpaks, Additional Apps & MIME Associations"
|
|||||||
require_root
|
require_root
|
||||||
|
|
||||||
TARGET_USER="$(get_target_user)"
|
TARGET_USER="$(get_target_user)"
|
||||||
TARGET_HOME="$(get_target_home)"
|
|
||||||
|
|
||||||
# 1. Flathub Repository Setup
|
# 1. Flathub Repository Setup
|
||||||
log_substep "Configuring Flathub remote repository..."
|
log_substep "Configuring Flathub remote repository..."
|
||||||
|
|||||||
+42
-13
@@ -6,11 +6,12 @@
|
|||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||||
|
# shellcheck source=lib/utils.sh
|
||||||
source "$SCRIPT_DIR/lib/utils.sh"
|
source "$SCRIPT_DIR/lib/utils.sh"
|
||||||
|
|
||||||
setup_err_trap
|
setup_err_trap
|
||||||
|
|
||||||
log_step "Running Stage 09: Hyprland Desktop (LinuxBeginnings Installer)"
|
log_step "Running Stage 09: Hyprland Desktop (LinuxBeginnings Debian-Hyprland Installer)"
|
||||||
|
|
||||||
require_root
|
require_root
|
||||||
|
|
||||||
@@ -19,24 +20,52 @@ TARGET_HOME="$(get_target_home)"
|
|||||||
|
|
||||||
log_info "Configuring Hyprland Desktop for target user: $TARGET_USER ($TARGET_HOME)"
|
log_info "Configuring Hyprland Desktop for target user: $TARGET_USER ($TARGET_HOME)"
|
||||||
|
|
||||||
|
# 1. Execute LinuxBeginnings Debian-Hyprland installer
|
||||||
log_substep "Downloading and executing LinuxBeginnings Debian-Hyprland installer..."
|
log_substep "Downloading and executing LinuxBeginnings Debian-Hyprland installer..."
|
||||||
INSTALLER_URL="https://raw.githubusercontent.com/LinuxBeginnings/Debian-Hyprland/main/auto-install.sh"
|
if command_exists curl; then
|
||||||
TEMP_INSTALLER="$(mktemp "/tmp/hyprland-install.XXXXXX.sh")"
|
log_info "Running Debian-Hyprland installer as target user '$TARGET_USER'..."
|
||||||
|
if run_as_target_user bash -c 'sh <(curl -L https://raw.githubusercontent.com/LinuxBeginnings/Debian-Hyprland/main/auto-install.sh)'; then
|
||||||
if curl -fsSL "$INSTALLER_URL" -o "$TEMP_INSTALLER"; then
|
|
||||||
chmod +x "$TEMP_INSTALLER"
|
|
||||||
chown "$TARGET_USER:$TARGET_USER" "$TEMP_INSTALLER"
|
|
||||||
|
|
||||||
log_info "Running LinuxBeginnings auto-installer under user '$TARGET_USER'..."
|
|
||||||
if run_as_target_user bash "$TEMP_INSTALLER"; then
|
|
||||||
log_success "LinuxBeginnings Debian-Hyprland installation completed successfully."
|
log_success "LinuxBeginnings Debian-Hyprland installation completed successfully."
|
||||||
else
|
else
|
||||||
log_warn "LinuxBeginnings installer exited with non-zero status. Check logs if needed."
|
log_warn "LinuxBeginnings installer exited with non-zero status. Check logs if needed."
|
||||||
fi
|
fi
|
||||||
rm -f "$TEMP_INSTALLER"
|
|
||||||
else
|
else
|
||||||
log_error "Failed to download LinuxBeginnings Debian-Hyprland installer from $INSTALLER_URL"
|
log_error "curl is required to download Debian-Hyprland installer."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log_success "Stage 09: Hyprland Desktop installation completed successfully!"
|
# 2. Ensure rudimentary Hyprland config is deployed to /etc/skel
|
||||||
|
log_substep "Deploying rudimentary Hyprland configuration to /etc/skel..."
|
||||||
|
mkdir -p /etc/skel/.config/hypr/scripts
|
||||||
|
if [[ -f "$SCRIPT_DIR/data/skel/.config/hypr/hyprland.conf" ]]; then
|
||||||
|
cp "$SCRIPT_DIR/data/skel/.config/hypr/hyprland.conf" /etc/skel/.config/hypr/hyprland.conf
|
||||||
|
fi
|
||||||
|
if [[ -f "$SCRIPT_DIR/data/skel/.config/hypr/scripts/install-dots-prompt.sh" ]]; then
|
||||||
|
cp "$SCRIPT_DIR/data/skel/.config/hypr/scripts/install-dots-prompt.sh" /etc/skel/.config/hypr/scripts/install-dots-prompt.sh
|
||||||
|
chmod 0755 /etc/skel/.config/hypr/scripts/install-dots-prompt.sh
|
||||||
|
fi
|
||||||
|
chown -R root:root /etc/skel/.config
|
||||||
|
|
||||||
|
# 3. Deploy rudimentary Hyprland config to target user
|
||||||
|
log_substep "Deploying rudimentary Hyprland configuration to $TARGET_HOME/.config/hypr..."
|
||||||
|
mkdir -p "$TARGET_HOME/.config/hypr/scripts"
|
||||||
|
|
||||||
|
if [[ -f "$TARGET_HOME/.config/hypr/hyprland.conf" ]]; then
|
||||||
|
backup_file_or_dir "$TARGET_HOME/.config/hypr/hyprland.conf"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -f "$SCRIPT_DIR/data/skel/.config/hypr/hyprland.conf" ]]; then
|
||||||
|
cp "$SCRIPT_DIR/data/skel/.config/hypr/hyprland.conf" "$TARGET_HOME/.config/hypr/hyprland.conf"
|
||||||
|
fi
|
||||||
|
if [[ -f "$SCRIPT_DIR/data/skel/.config/hypr/scripts/install-dots-prompt.sh" ]]; then
|
||||||
|
cp "$SCRIPT_DIR/data/skel/.config/hypr/scripts/install-dots-prompt.sh" "$TARGET_HOME/.config/hypr/scripts/install-dots-prompt.sh"
|
||||||
|
chmod 0755 "$TARGET_HOME/.config/hypr/scripts/install-dots-prompt.sh"
|
||||||
|
fi
|
||||||
|
|
||||||
|
chown -R "$TARGET_USER:$TARGET_USER" "$TARGET_HOME/.config/hypr"
|
||||||
|
|
||||||
|
log_success "Rudimentary Hyprland configuration deployed:"
|
||||||
|
log_info " - SUPER+ENTER: Kitty Terminal"
|
||||||
|
log_info " - SUPER+Q: Close Active Window"
|
||||||
|
log_info " - Login Prompt: Asks user after login to choose Dotfiles setup (LinuxBeginnings or custom Git repo for ~/.config)"
|
||||||
|
log_success "Stage 09: Hyprland Desktop installation & configuration completed successfully!"
|
||||||
|
|||||||
Reference in New Issue
Block a user