diff --git a/build-iso.sh b/build-iso.sh index 85b3a94..b0a9c53 100755 --- a/build-iso.sh +++ b/build-iso.sh @@ -100,7 +100,7 @@ set timeout=10 menuentry "Ubuntu MacBook AutoInstall" { set gfxpayload=keep - linux /casper/vmlinuz quiet autoinstall ds=nocloud\;s=/cdrom/autoinstall/ --- + linux /casper/vmlinuz quiet autoinstall cloud-config-url=/dev/null ds=nocloud\;s=/cdrom/autoinstall/ --- initrd /casper/initrd } diff --git a/setup-base.sh b/setup-base.sh index 18a92d3..32edbbf 100755 --- a/setup-base.sh +++ b/setup-base.sh @@ -57,6 +57,10 @@ apt install -y \ nodejs npm \ wireguard wireguard-tools \ openssh-server \ + libheif-examples imagemagick \ + pipx \ + zoxide \ + micro \ libreoffice libreoffice-l10n-de \ thunderbird thunderbird-locale-de \ keepassxc \ @@ -99,16 +103,17 @@ ok "Brave installiert" # ── 5. Konfigurationsdateien ───────────────────────────────────────────── echo -e "\n=== 5/10 Systemkonfigurationen ===" -# Tastaturbelegung +# Tastaturbelegung (mac_nodeadkeys: @=Alt+L, |=Alt+7, wie auf dem Mac) tee /etc/default/keyboard > /dev/null </dev/null || true -# Fn-Tasten -echo 'options hid_apple fnmode=2' | tee /etc/modprobe.d/hid_apple.conf > /dev/null +# Fn-Tasten + ISO-Layout-Fix (iso_layout=0 verhindert ^/< Vertauschung) +echo 'options hid_apple fnmode=2 iso_layout=0' | tee /etc/modprobe.d/hid_apple.conf > /dev/null # mbpfan (modellabhängig) wget -q -O /tmp/mbpfan.conf "$SETUP_RAW/mbpfan-${MODEL}.conf" @@ -213,6 +218,12 @@ else ok "mbpfan, thermald, tlp, ssh aktiviert (Start nach Reboot)" fi +# ── cloud-init deaktivieren (kein Cloud-Provider, blockiert sonst den Boot) ── +if command -v cloud-init &>/dev/null; then + touch /etc/cloud/cloud-init.disabled + ok "cloud-init deaktiviert" +fi + # ── zsh als Standard-Shell für rene ────────────────────────────────────── chsh -s /bin/zsh rene 2>/dev/null || true diff --git a/setup-desktop.sh b/setup-desktop.sh index 3b2efba..b23efd8 100755 --- a/setup-desktop.sh +++ b/setup-desktop.sh @@ -1,6 +1,6 @@ #!/bin/bash # macbook-setup/setup-desktop.sh -# Desktop-Setup: oh-my-zsh, Claude Code, PrusaSlicer, Dotfiles, XFCE-Einstellungen +# Desktop-Setup: oh-my-zsh, Zsh-Tooling, Claude Code, PrusaSlicer, Dotfiles, XFCE # Braucht eine laufende Desktop-Session (XFCE) — NICHT in chroot ausführen! # Verwendung: bash setup-desktop.sh # Wird automatisch beim ersten Login gestartet (via Autostart) @@ -24,22 +24,55 @@ echo " setup-desktop.sh startet" echo "════════════════════════════════════════════" # ── 1. oh-my-zsh ──────────────────────────────────────────────────────── -echo -e "\n=== 1/5 oh-my-zsh ===" +echo -e "\n=== 1/8 oh-my-zsh ===" if [[ ! -d ~/.oh-my-zsh ]]; then sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended fi ok "oh-my-zsh installiert" -# ── 2. npm global + Claude Code ───────────────────────────────────────── -echo -e "\n=== 2/5 Claude Code ===" +# ── 2. Zsh-Plugins & Powerlevel10k ────────────────────────────────────── +echo -e "\n=== 2/8 Zsh-Plugins & Powerlevel10k ===" + +# zsh-syntax-highlighting (Submodule im Dotfiles-Repo ist leer) +ZSH_SHL_DIR="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting" +if [[ ! -d "$ZSH_SHL_DIR/.git" ]]; then + rm -rf "$ZSH_SHL_DIR" + git clone https://github.com/zsh-users/zsh-syntax-highlighting.git "$ZSH_SHL_DIR" +fi +ok "zsh-syntax-highlighting" + +# Powerlevel10k (Submodule im Dotfiles-Repo ist leer) +P10K_DIR="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k" +if [[ ! -d "$P10K_DIR/.git" ]]; then + rm -rf "$P10K_DIR" + git clone --depth=1 https://github.com/romkatv/powerlevel10k.git "$P10K_DIR" +fi +ok "Powerlevel10k" + +# ── 3. MesloLGS NF Font (Powerlevel10k-Icons) ─────────────────────────── +echo -e "\n=== 3/8 MesloLGS NF Font ===" +FONT_DIR="$HOME/.local/share/fonts" +mkdir -p "$FONT_DIR" +FONT_BASE="https://github.com/romkatv/powerlevel10k-media/raw/master" +for font in "MesloLGS NF Regular.ttf" "MesloLGS NF Bold.ttf" \ + "MesloLGS NF Italic.ttf" "MesloLGS NF Bold Italic.ttf"; do + if [[ ! -f "$FONT_DIR/$font" ]]; then + curl -fsSL -o "$FONT_DIR/$font" "$FONT_BASE/${font// /%20}" + fi +done +fc-cache -f "$FONT_DIR" 2>/dev/null || true +ok "MesloLGS NF Fonts installiert" + +# ── 4. npm global + Claude Code ───────────────────────────────────────── +echo -e "\n=== 4/8 Claude Code ===" mkdir -p ~/.npm-global npm config set prefix '~/.npm-global' export PATH="$HOME/.npm-global/bin:$PATH" npm install -g @anthropic-ai/claude-code ok "Claude Code installiert" -# ── 3. PrusaSlicer (Flatpak) ────────────────────────────────────────────── -echo -e "\n=== 3/5 PrusaSlicer ===" +# ── 5. PrusaSlicer (Flatpak) ──────────────────────────────────────────── +echo -e "\n=== 5/8 PrusaSlicer ===" if ! command -v flatpak &>/dev/null; then sudo apt install -y flatpak fi @@ -47,8 +80,16 @@ flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flath flatpak install --user -y flathub com.prusa3d.PrusaSlicer ok "PrusaSlicer installiert (Flatpak)" -# ── 4. Dot-Files ──────────────────────────────────────────────────────── -echo -e "\n=== 4/5 Dot-Files ===" +# ── 6. PlatformIO (pipx) ──────────────────────────────────────────────── +echo -e "\n=== 6/8 PlatformIO ===" +if ! command -v pio &>/dev/null; then + pipx install platformio + pipx ensurepath +fi +ok "PlatformIO installiert (pipx)" + +# ── 7. Dot-Files ──────────────────────────────────────────────────────── +echo -e "\n=== 7/8 Dot-Files ===" DOTFILES_DIR="$HOME/git-projekte/dotfiles-rene" if [[ ! -d "$DOTFILES_DIR" ]]; then mkdir -p "$HOME/git-projekte" @@ -67,51 +108,158 @@ if [[ -f "$DOTFILES_DIR/micro/install-micro-dotfiles.sh" ]]; then ok "Dot-Files: micro" fi -# oh-my-zsh custom (Plugins, Themes, Aliase) +# oh-my-zsh custom (platformio.zsh etc.) if [[ -d "$DOTFILES_DIR/oh-my-zsh/custom" ]] && [[ -d ~/.oh-my-zsh/custom ]]; then for f in "$DOTFILES_DIR/oh-my-zsh/custom"/*.zsh; do [[ -f "$f" ]] && ln -sf "$f" ~/.oh-my-zsh/custom/ done - # Custom Plugins - if [[ -d "$DOTFILES_DIR/oh-my-zsh/custom/plugins" ]]; then - for plugin_dir in "$DOTFILES_DIR/oh-my-zsh/custom/plugins"/*/; do - plugin_name=$(basename "$plugin_dir") - ln -sfn "$plugin_dir" ~/.oh-my-zsh/custom/plugins/"$plugin_name" - done - fi - # Custom Themes - if [[ -d "$DOTFILES_DIR/oh-my-zsh/custom/themes" ]]; then - for theme_dir in "$DOTFILES_DIR/oh-my-zsh/custom/themes"/*/; do - theme_name=$(basename "$theme_dir") - ln -sfn "$theme_dir" ~/.oh-my-zsh/custom/themes/"$theme_name" - done - fi ok "Dot-Files: oh-my-zsh custom" fi # heic-scripts nach ~/bin +mkdir -p ~/bin if [[ -d "$DOTFILES_DIR/heic-scripts" ]]; then - mkdir -p ~/bin for script in "$DOTFILES_DIR/heic-scripts"/*; do - [[ -f "$script" ]] && ln -sf "$script" ~/bin/ + [[ -f "$script" ]] && chmod +x "$script" && ln -sf "$script" ~/bin/ done ok "Dot-Files: heic-scripts → ~/bin" fi -# ── 5. XFCE Energieeinstellungen ──────────────────────────────────────── -echo -e "\n=== 5/5 XFCE Energieeinstellungen ===" +# git-check-all.sh + git-update-all.sh nach ~/ +if [[ -d "$DOTFILES_DIR/bin" ]]; then + for script in "$DOTFILES_DIR/bin"/*; do + [[ -f "$script" ]] && chmod +x "$script" && ln -sf "$script" ~/ + done + ok "Dot-Files: git-check-all.sh, git-update-all.sh → ~/" +fi + +# .zshrc (Linux-Version, ohne Conda/LM Studio/iTerm2) +cat > ~/.zshrc <<'ZSHEOF' +# ---------------------------------------------------------- +# Zsh-Konfiguration fuer Rene (Linux / MacBook Pro) +# Oh My Zsh + Powerlevel10k + Micro +# ---------------------------------------------------------- + +# 1) Powerlevel10k Instant Prompt (muss sehr weit oben stehen) +if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then + source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" +fi + +# 2) Oh My Zsh Basis +export ZSH="$HOME/.oh-my-zsh" +ZSH_THEME="powerlevel10k/powerlevel10k" + +plugins=( + git + zsh-syntax-highlighting + zoxide +) + +source "$ZSH/oh-my-zsh.sh" + +# 3) Powerlevel10k-Konfiguration +[[ -f "$HOME/.p10k.zsh" ]] && source "$HOME/.p10k.zsh" + +# 4) Standard-Editor (lokal: micro, SSH: nicht erzwingen) +if [[ -z "$SSH_CONNECTION" ]]; then + export EDITOR="micro" + export VISUAL="micro" +fi + +# 5) Pfade +export PATH="$HOME/bin:$HOME/.local/bin:$HOME/.npm-global/bin:$PATH" + +# 6) Aliases + +# ls-Varianten +alias ll='ls -lha' +alias la='ls -A' +alias l='ls -lh' + +# Verzeichnisse +alias ..='cd ..' +alias ...='cd ../..' +alias ....='cd ../../..' + +# Konfigdateien +alias zshconfig='micro ~/.zshrc' +alias p10kconfig='micro ~/.p10k.zsh' + +# Git-Kurzbefehle +alias gs='git status' +alias ga='git add' +alias gc='git commit' +alias gp='git push' +alias gl='git log --oneline --graph --decorate' +alias gitcheck="~/git-check-all.sh --short" +alias gitupdate="~/git-update-all.sh" + +# 7) History +HISTFILE="$HOME/.zsh_history" +HISTSIZE=5000 +SAVEHIST=5000 +setopt HIST_IGNORE_DUPS +setopt HIST_IGNORE_SPACE +setopt SHARE_HISTORY + +# 8) Zsh-Optionen +setopt AUTO_CD + +# 9) Fenster-/Tab-Titel +precmd() { print -Pn "\e]0;%n@%m: %~\a" } +export COLORTERM=truecolor +ZSHEOF +ok "Dot-Files: .zshrc" + +# .p10k.zsh (vom Mac kopieren, falls im Repo vorhanden, sonst Wizard beim ersten Start) +if [[ -f "$DOTFILES_DIR/.p10k.zsh" ]]; then + cp "$DOTFILES_DIR/.p10k.zsh" ~/.p10k.zsh + ok "Dot-Files: .p10k.zsh" +else + warn ".p10k.zsh nicht im Dotfiles-Repo — beim ersten zsh-Start 'p10k configure' ausfuehren" +fi + +# ── 8. XFCE-Einstellungen ─────────────────────────────────────────────── +echo -e "\n=== 8/8 XFCE-Einstellungen ===" + +# Keyboard: XFCE soll /etc/default/keyboard respektieren (nicht eigenes Layout erzwingen) +if command -v xfconf-query &>/dev/null; then + xfconf-query -c keyboard-layout -p /Default/XkbDisable -n -t bool -s true 2>/dev/null || true + ok "XFCE Keyboard: System-Layout wird verwendet" +fi + +# Energieeinstellungen if command -v xfconf-query &>/dev/null; then xfconf-query -c xfce4-power-manager -p /xfce4-power-manager/dpms-on-ac-off -s 0 --create -t int xfconf-query -c xfce4-power-manager -p /xfce4-power-manager/dpms-on-ac-sleep -s 0 --create -t int xfconf-query -c xfce4-power-manager -p /xfce4-power-manager/blank-on-ac -s 0 --create -t int - xfconf-query -c xfce4-power-manager -p /xfce4-power-manager/dpms-on-battery-off -s 10 --create -t int - xfconf-query -c xfce4-power-manager -p /xfce4-power-manager/dpms-on-battery-sleep -s 10 --create -t int - xfconf-query -c xfce4-power-manager -p /xfce4-power-manager/blank-on-battery -s 10 --create -t int + xfconf-query -c xfce4-power-manager -p /xfce4-power-manager/blank-on-battery -s 5 --create -t int + xfconf-query -c xfce4-power-manager -p /xfce4-power-manager/dpms-on-battery-sleep -s 6 --create -t int + xfconf-query -c xfce4-power-manager -p /xfce4-power-manager/dpms-on-battery-off -s 7 --create -t int ok "XFCE Power Manager konfiguriert" else warn "xfconf-query nicht gefunden — XFCE Energieeinstellungen übersprungen" fi +# XFCE Terminal: MesloLGS NF als Schriftart setzen +XFCE_TERM_RC="$HOME/.config/xfce4/terminal/terminalrc" +if [[ -d "$HOME/.config/xfce4" ]]; then + mkdir -p "$(dirname "$XFCE_TERM_RC")" + if [[ -f "$XFCE_TERM_RC" ]]; then + sed -i 's/^FontName=.*/FontName=MesloLGS NF 11/' "$XFCE_TERM_RC" 2>/dev/null || true + else + cat > "$XFCE_TERM_RC" <<'TERMEOF' +[Configuration] +FontName=MesloLGS NF 11 +MiscAlwaysShowTabs=FALSE +MiscBell=FALSE +MiscDefaultGeometry=120x35 +ScrollingBar=TERMINAL_SCROLLBAR_NONE +TERMEOF + fi + ok "XFCE Terminal: MesloLGS NF Schriftart" +fi + # ── Autostart entfernen ───────────────────────────────────────────────── AUTOSTART_FILE="$HOME/.config/autostart/macbook-setup-desktop.desktop" if [[ -f "$AUTOSTART_FILE" ]]; then @@ -131,3 +279,4 @@ echo " sudo cp wg0.conf /etc/wireguard/ && sudo systemctl enable --now wg-qu echo " 2. Synology Drive Client installieren (.deb von synology.com)" echo " 3. Thunderbird starten → Profil aus Synology Drive einbinden" echo " 4. Brave starten → Synchronisation einrichten" +echo " 5. Falls p10k-Icons fehlen: Terminal-Schriftart auf 'MesloLGS NF' setzen" diff --git a/user-data b/user-data index 4b23e6c..08668d0 100644 --- a/user-data +++ b/user-data @@ -4,7 +4,7 @@ autoinstall: locale: de_DE.UTF-8 keyboard: layout: de - variant: mac + variant: mac_nodeadkeys identity: hostname: m16 username: rene