#!/usr/bin/env bash set -euo pipefail payload_dir="/usr/share/raveos/plasma-theme/theme-data" wallpaper_dst="/usr/share/backgrounds/raveos/raveos-main-bg.jpeg" fastfetch_hook='[[ -f /etc/profile.d/raveos-fastfetch.sh ]] && source /etc/profile.d/raveos-fastfetch.sh' if [[ ! -d "$payload_dir" ]]; then echo "Missing payload: $payload_dir" >&2 exit 1 fi if [[ ${EUID} -ne 0 ]]; then echo "Run as root." >&2 exit 1 fi ensure_bashrc_hook() { local bashrc_path="$1" touch "$bashrc_path" if ! grep -Fqx "$fastfetch_hook" "$bashrc_path" 2>/dev/null; then printf '\n%s\n' "$fastfetch_hook" >> "$bashrc_path" fi } disable_kmix_autostart() { local target_home="$1" mkdir -p "${target_home}/.config/autostart" cat > "${target_home}/.config/autostart/kmix_autostart.desktop" <<'EOF' [Desktop Entry] Hidden=true EOF } write_konsolerc() { local target_home="$1" cat > "${target_home}/.config/konsolerc" <<'EOF' [Desktop Entry] DefaultProfile=RaveOS.profile [General] ConfigVersion=1 [UiSettings] ColorScheme=RaveOS EOF } write_plasma_wallpaper_config() { local target_home="$1" local applet_config="${target_home}/.config/plasma-org.kde.plasma.desktop-appletsrc" mkdir -p "${target_home}/.config" if [[ ! -f "${applet_config}" ]]; then if command -v kwriteconfig6 >/dev/null 2>&1; then kwriteconfig6 --file "${applet_config}" \ --group Containments --group 1 --group Wallpaper --group org.kde.image --group General \ --key Image "file://${wallpaper_dst}" kwriteconfig6 --file "${applet_config}" \ --group Containments --group 1 --group Wallpaper --group org.kde.image --group General \ --key FillMode 2 else cat >> "${applet_config}" </dev/null 2>&1; then kwriteconfig6 --file "${applet_config}" \ --group Containments --group "${c}" --group Wallpaper --group org.kde.image --group General \ --key Image "file://${wallpaper_dst}" kwriteconfig6 --file "${applet_config}" \ --group Containments --group "${c}" --group Wallpaper --group org.kde.image --group General \ --key FillMode 2 fi done fi } write_kickoff_config() { local target_home="$1" local kickoff_image="/usr/share/raveos/plasma-theme/theme-data/plasma/org.kde.plasma.kickoff.svg" if [[ ! -f "${kickoff_image}" ]]; then kickoff_image="/usr/share/pixmaps/raveos-logo.svg" fi if [[ ! -f "${kickoff_image}" ]]; then kickoff_image="/usr/share/icons/breeze/applets/256/org.kde.plasma.kickoff.svg" fi [[ -f "${target_home}/.config/plasma-org.kde.plasma.desktop-appletsrc" ]] || return 0 while IFS=: read -r containment applet; do [[ -n "${containment}" && -n "${applet}" ]] || continue if command -v kwriteconfig6 >/dev/null 2>&1; then kwriteconfig6 --file "${target_home}/.config/plasma-org.kde.plasma.desktop-appletsrc" \ --group Containments --group "${containment}" --group Applets --group "${applet}" --group Configuration --group General \ --key useCustomButtonImage true kwriteconfig6 --file "${target_home}/.config/plasma-org.kde.plasma.desktop-appletsrc" \ --group Containments --group "${containment}" --group Applets --group "${applet}" --group Configuration --group General \ --key customButtonImage "file://${kickoff_image}" kwriteconfig6 --file "${target_home}/.config/plasma-org.kde.plasma.desktop-appletsrc" \ --group Containments --group "${containment}" --group Applets --group "${applet}" --group Configuration --group General \ --key icon "${kickoff_image}" else cat >> "${target_home}/.config/plasma-org.kde.plasma.desktop-appletsrc" < "${target_home}/.config/kscreenlockerrc" < "${target_home}/.config/ksplashrc" <<'EOF' [KSplash] Engine=KSplashQML Theme=org.kde.raveos.desktop EOF } apply_user_payload() { local target_user="$1" local passwd_line target_uid target_gid target_home passwd_line="$(getent passwd "$target_user" || true)" [[ -n "$passwd_line" ]] || return 0 IFS=: read -r _ _ target_uid target_gid _ target_home _ <<<"$passwd_line" [[ -d "$target_home" ]] || return 0 mkdir -p \ "${target_home}/.config/kitty" \ "${target_home}/.config/fastfetch" \ "${target_home}/.config/autostart" \ "${target_home}/.local/share/konsole" \ "${target_home}/.local/share/icons/breeze/applets/256" \ "${target_home}/.local/share/icons/breeze-dark/applets/256" \ "${target_home}/.local/share/icons/breeze/places/22" \ "${target_home}/.local/share/icons/breeze/places/32" \ "${target_home}/.local/share/icons/breeze/places/64" \ "${target_home}/.local/share/icons/breeze/places/96" \ "${target_home}/.local/share/icons/breeze-dark/places/22" \ "${target_home}/.local/share/icons/breeze-dark/places/32" \ "${target_home}/.local/share/icons/breeze-dark/places/64" \ "${target_home}/.local/share/icons/breeze-dark/places/96" \ "${target_home}/.local/share/icons/Adwaita/symbolic/places" install -Dm644 "$wallpaper_dst" "${target_home}/.config/background" if [[ -f "${payload_dir}/kitty/kitty.conf" ]]; then install -Dm644 "${payload_dir}/kitty/kitty.conf" "${target_home}/.config/kitty/kitty.conf" fi if [[ -f "${payload_dir}/fastfetch/config.jsonc" ]]; then install -Dm644 "${payload_dir}/fastfetch/config.jsonc" "${target_home}/.config/fastfetch/config.jsonc" fi if [[ -f "${payload_dir}/fastfetch/config-kitty.jsonc" ]]; then install -Dm644 "${payload_dir}/fastfetch/config-kitty.jsonc" "${target_home}/.config/fastfetch/config-kitty.jsonc" fi if [[ -f "${payload_dir}/fastfetch/raveos-logo.png" ]]; then install -Dm644 "${payload_dir}/fastfetch/raveos-logo.png" "${target_home}/.config/fastfetch/raveos-logo.png" fi if [[ -f "${payload_dir}/fastfetch/raveos-logo.txt" ]]; then install -Dm644 "${payload_dir}/fastfetch/raveos-logo.txt" "${target_home}/.config/fastfetch/raveos-logo.txt" fi if [[ -f "${payload_dir}/konsole/RaveOS.colorscheme" ]]; then install -Dm644 "${payload_dir}/konsole/RaveOS.colorscheme" \ "${target_home}/.local/share/konsole/RaveOS.colorscheme" fi if [[ -f "${payload_dir}/konsole/RaveOS.profile" ]]; then install -Dm644 "${payload_dir}/konsole/RaveOS.profile" \ "${target_home}/.local/share/konsole/RaveOS.profile" fi if [[ -f "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" ]]; then install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ "${target_home}/.local/share/icons/breeze/applets/256/org.kde.plasma.kickoff.svg" install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ "${target_home}/.local/share/icons/breeze-dark/applets/256/org.kde.plasma.kickoff.svg" install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ "${target_home}/.local/share/icons/Adwaita/symbolic/places/start-here-symbolic.svg" for size in 22 32 64 96; do install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ "${target_home}/.local/share/icons/breeze/places/${size}/start-here-kde.svg" install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ "${target_home}/.local/share/icons/breeze-dark/places/${size}/start-here-kde.svg" install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ "${target_home}/.local/share/icons/breeze/places/${size}/start-here.svg" install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ "${target_home}/.local/share/icons/breeze-dark/places/${size}/start-here.svg" done fi write_konsolerc "$target_home" write_plasma_wallpaper_config "$target_home" write_kickoff_config "$target_home" write_kscreenlockerrc "$target_home" write_ksplashrc "$target_home" disable_kmix_autostart "$target_home" ensure_bashrc_hook "${target_home}/.bashrc" chown -R "${target_uid}:${target_gid}" \ "${target_home}/.config" \ "${target_home}/.local" \ "${target_home}/.bashrc" } mkdir -p /etc/skel if [[ -f "${payload_dir}/background" ]]; then install -Dm644 "${payload_dir}/background" "$wallpaper_dst" fi if [[ -f "${payload_dir}/profile.d/raveos-fastfetch.sh" ]]; then install -Dm755 "${payload_dir}/profile.d/raveos-fastfetch.sh" /etc/profile.d/raveos-fastfetch.sh fi if [[ -f "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" ]]; then install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" /usr/share/pixmaps/raveos-logo.svg install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" /usr/share/icons/hicolor/scalable/apps/raveos-logo.svg install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" /usr/share/icons/hicolor/scalable/apps/distributor-logo-raveos.svg for theme in breeze breeze-dark hicolor; do if [[ -d "/usr/share/icons/${theme}" ]]; then find "/usr/share/icons/${theme}" -name "start-here*" -delete 2>/dev/null || true find "/usr/share/icons/${theme}" -name "distributor-logo*" -delete 2>/dev/null || true install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" "/usr/share/icons/${theme}/scalable/places/start-here-kde.svg" install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" "/usr/share/icons/${theme}/scalable/places/start-here.svg" install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" "/usr/share/icons/${theme}/scalable/places/distributor-logo.svg" fi done fi if [[ -d "${payload_dir}/plasma-splash" ]]; then mkdir -p /usr/share/plasma/look-and-feel rm -rf /usr/share/plasma/look-and-feel/org.kde.raveos.desktop cp -r --no-preserve=ownership "${payload_dir}/plasma-splash" /usr/share/plasma/look-and-feel/org.kde.raveos.desktop fi if [[ -f "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" ]]; then install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ /usr/local/share/icons/breeze/applets/256/org.kde.plasma.kickoff.svg install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ /usr/local/share/icons/breeze-dark/applets/256/org.kde.plasma.kickoff.svg install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ /usr/share/icons/breeze/applets/256/org.kde.plasma.kickoff.svg install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ /usr/share/icons/breeze-dark/applets/256/org.kde.plasma.kickoff.svg install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ /usr/local/share/icons/Adwaita/symbolic/places/start-here-symbolic.svg install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ /usr/share/icons/Adwaita/symbolic/places/start-here-symbolic.svg for size in 22 32 64 96; do install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ "/usr/local/share/icons/breeze/places/${size}/start-here-kde.svg" install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ "/usr/local/share/icons/breeze-dark/places/${size}/start-here-kde.svg" install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ "/usr/local/share/icons/breeze/places/${size}/start-here.svg" install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ "/usr/local/share/icons/breeze-dark/places/${size}/start-here.svg" install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ "/usr/share/icons/breeze/places/${size}/start-here-kde.svg" install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ "/usr/share/icons/breeze-dark/places/${size}/start-here-kde.svg" install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ "/usr/share/icons/breeze/places/${size}/start-here.svg" install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ "/usr/share/icons/breeze-dark/places/${size}/start-here.svg" done fi if [[ -f "${payload_dir}/sddm/sddm.conf" ]]; then install -Dm644 "${payload_dir}/sddm/sddm.conf" /etc/sddm.conf.d/raveos-theme.conf fi for candidate in \ "/usr/share/sddm/themes/sddm-astronaut-theme" \ "/usr/share/sddm/themes/astronaut" \ "/usr/share/sddm/themes/sddm-astronaut"; do if [[ -d "$candidate" ]]; then if [[ -f "${payload_dir}/sddm/new-raveos-main-bg.jpeg" ]]; then install -Dm644 "${payload_dir}/sddm/new-raveos-main-bg.jpeg" \ "${candidate}/Backgrounds/new-raveos-main-bg.jpeg" fi if [[ -f "${payload_dir}/sddm/astronaut.conf" ]]; then install -Dm644 "${payload_dir}/sddm/astronaut.conf" \ "${candidate}/Themes/astronaut.conf" fi break fi done mkdir -p \ /etc/skel/.config/kitty \ /etc/skel/.config/fastfetch \ /etc/skel/.config/autostart \ /etc/skel/.local/share/konsole \ /etc/skel/.local/share/icons/breeze/applets/256 \ /etc/skel/.local/share/icons/breeze-dark/applets/256 \ /etc/skel/.local/share/icons/breeze/places/22 \ /etc/skel/.local/share/icons/breeze/places/32 \ /etc/skel/.local/share/icons/breeze/places/64 \ /etc/skel/.local/share/icons/breeze/places/96 \ /etc/skel/.local/share/icons/breeze-dark/places/22 \ /etc/skel/.local/share/icons/breeze-dark/places/32 \ /etc/skel/.local/share/icons/breeze-dark/places/64 \ /etc/skel/.local/share/icons/breeze-dark/places/96 \ /etc/skel/.local/share/icons/Adwaita/symbolic/places if [[ -f "${payload_dir}/background" ]]; then mkdir -p "$(dirname "$wallpaper_dst")" install -m644 "${payload_dir}/background" "$wallpaper_dst" install -Dm644 "${payload_dir}/background" /etc/skel/.config/background fi if [[ -f "${payload_dir}/kitty/kitty.conf" ]]; then install -Dm644 "${payload_dir}/kitty/kitty.conf" /etc/skel/.config/kitty/kitty.conf fi if [[ -f "${payload_dir}/fastfetch/config.jsonc" ]]; then install -Dm644 "${payload_dir}/fastfetch/config.jsonc" /etc/skel/.config/fastfetch/config.jsonc fi if [[ -f "${payload_dir}/fastfetch/config-kitty.jsonc" ]]; then install -Dm644 "${payload_dir}/fastfetch/config-kitty.jsonc" /etc/skel/.config/fastfetch/config-kitty.jsonc fi if [[ -f "${payload_dir}/fastfetch/raveos-logo.png" ]]; then install -Dm644 "${payload_dir}/fastfetch/raveos-logo.png" /etc/skel/.config/fastfetch/raveos-logo.png fi if [[ -f "${payload_dir}/fastfetch/raveos-logo.txt" ]]; then install -Dm644 "${payload_dir}/fastfetch/raveos-logo.txt" /etc/skel/.config/fastfetch/raveos-logo.txt fi if [[ -f "${payload_dir}/konsole/RaveOS.colorscheme" ]]; then install -Dm644 "${payload_dir}/konsole/RaveOS.colorscheme" /etc/skel/.local/share/konsole/RaveOS.colorscheme fi if [[ -f "${payload_dir}/konsole/RaveOS.profile" ]]; then install -Dm644 "${payload_dir}/konsole/RaveOS.profile" /etc/skel/.local/share/konsole/RaveOS.profile fi if [[ -f "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" ]]; then install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ /etc/skel/.local/share/icons/breeze/applets/256/org.kde.plasma.kickoff.svg install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ /etc/skel/.local/share/icons/breeze-dark/applets/256/org.kde.plasma.kickoff.svg install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ /etc/skel/.local/share/icons/Adwaita/symbolic/places/start-here-symbolic.svg for size in 22 32 64 96; do install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ "/etc/skel/.local/share/icons/breeze/places/${size}/start-here-kde.svg" install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ "/etc/skel/.local/share/icons/breeze-dark/places/${size}/start-here-kde.svg" install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ "/etc/skel/.local/share/icons/breeze/places/${size}/start-here.svg" install -Dm644 "${payload_dir}/plasma/org.kde.plasma.kickoff.svg" \ "/etc/skel/.local/share/icons/breeze-dark/places/${size}/start-here.svg" done fi write_konsolerc /etc/skel write_plasma_wallpaper_config /etc/skel write_kickoff_config /etc/skel write_kscreenlockerrc /etc/skel write_ksplashrc /etc/skel disable_kmix_autostart /etc/skel ensure_bashrc_hook /etc/skel/.bashrc while IFS=: read -r user _ uid _ _ home shell; do [[ "$uid" -ge 1000 ]] || continue [[ -d "$home" ]] || continue [[ "$shell" != "/usr/bin/nologin" && "$shell" != "/bin/false" ]] || continue apply_user_payload "$user" done < /etc/passwd if command -v gtk-update-icon-cache >/dev/null 2>&1; then gtk-update-icon-cache -f -t /usr/share/icons/hicolor || true fi echo "Automatic apply finished."