diff --git a/files/scripts/example.sh b/files/scripts/example.sh index fdb2e04..1cded87 100644 --- a/files/scripts/example.sh +++ b/files/scripts/example.sh @@ -3,8 +3,4 @@ # Tell this script to exit if there are any errors. # You should have this in every custom script, to ensure that your completed # builds actually ran successfully without any errors! -set -oue pipefail - -# Your code goes here. -echo 'This is an example shell script' -echo 'Scripts here will run during build if specified in recipe.yml' +set -oue pipefail \ No newline at end of file diff --git a/files/system/etc/systemd/system/bluefin-icons-ensure.service b/files/system/etc/systemd/system/bluefin-icons-ensure.service new file mode 100644 index 0000000..6837b20 --- /dev/null +++ b/files/system/etc/systemd/system/bluefin-icons-ensure.service @@ -0,0 +1,14 @@ +[Unit] +Description=Ensure Bluefin GRUB icon is installed when a GRUB theme exists +ConditionPathExists=/boot/grub2/user.cfg +After=local-fs.target + +[Service] +Type=oneshot +ExecStart=/usr/share/bluefin-icons/install.sh +SuccessExitStatus=0 3 +StandardOutput=journal +StandardError=journal + +[Install] +WantedBy=multi-user.target diff --git a/files/system/etc/systemd/system/multi-user.target.wants/bluefin-icons-ensure.service b/files/system/etc/systemd/system/multi-user.target.wants/bluefin-icons-ensure.service new file mode 120000 index 0000000..1ab8174 --- /dev/null +++ b/files/system/etc/systemd/system/multi-user.target.wants/bluefin-icons-ensure.service @@ -0,0 +1 @@ +../bluefin-icons-ensure.service \ No newline at end of file diff --git a/files/system/etc/systemd/system/ostree-finalize-staged.service.d/bluefin-icons.conf b/files/system/etc/systemd/system/ostree-finalize-staged.service.d/bluefin-icons.conf new file mode 100644 index 0000000..c21ab4c --- /dev/null +++ b/files/system/etc/systemd/system/ostree-finalize-staged.service.d/bluefin-icons.conf @@ -0,0 +1,6 @@ +[Service] +ExecStartPost= +ExecStopPost=/usr/bin/bash --noprofile --norc -lc '/usr/local/sbin/bls-add-bluefin.sh' +StandardOutput=journal +StandardError=journal +Environment=STARSHIP_LOG=off diff --git a/files/system/usr/share/bluefin-icons/bls-add-bluefin.sh b/files/system/usr/share/bluefin-icons/bls-add-bluefin.sh new file mode 100755 index 0000000..aae1797 --- /dev/null +++ b/files/system/usr/share/bluefin-icons/bls-add-bluefin.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +set -euo pipefail +shopt -s nullglob + +entries_dir="/boot/loader/entries" + +for f in "$entries_dir"/ostree-*.conf "$entries_dir"/*-ostree-*.conf; do + [ -f "$f" ] || continue + + # Already correct? skip + if grep -qxE 'grub_class[[:space:]]+bluefin' "$f"; then + continue + fi + + tmp="$(mktemp)" + if grep -qE '^grub_class[[:space:]]+' "$f"; then + sed -E 's/^grub_class[[:space:]].*/grub_class bluefin/' "$f" >"$tmp" + else + awk '1; /^title[[:space:]]/{print "grub_class bluefin";}' "$f" >"$tmp" + fi + + if ! cmp -s "$f" "$tmp"; then + chmod --reference="$f" "$tmp" + chown --reference="$f" "$tmp" + command -v chcon >/dev/null 2>&1 && chcon --reference="$f" "$tmp" 2>/dev/null || true + mv -f "$tmp" "$f" + else + rm -f "$tmp" + fi +done diff --git a/files/system/usr/share/bluefin-icons/bluefin-icons.conf b/files/system/usr/share/bluefin-icons/bluefin-icons.conf new file mode 100644 index 0000000..c21ab4c --- /dev/null +++ b/files/system/usr/share/bluefin-icons/bluefin-icons.conf @@ -0,0 +1,6 @@ +[Service] +ExecStartPost= +ExecStopPost=/usr/bin/bash --noprofile --norc -lc '/usr/local/sbin/bls-add-bluefin.sh' +StandardOutput=journal +StandardError=journal +Environment=STARSHIP_LOG=off diff --git a/files/system/usr/share/bluefin-icons/bluefin.png b/files/system/usr/share/bluefin-icons/bluefin.png new file mode 100644 index 0000000..3cd982b Binary files /dev/null and b/files/system/usr/share/bluefin-icons/bluefin.png differ diff --git a/files/system/usr/share/bluefin-icons/install.sh b/files/system/usr/share/bluefin-icons/install.sh new file mode 100755 index 0000000..eeca9b1 --- /dev/null +++ b/files/system/usr/share/bluefin-icons/install.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Ensure we have root privileges before touching system paths. +if [[ "${EUID:-$(id -u)}" -ne 0 ]]; then + exec sudo -E "$0" "$@" +fi + +script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)" + +# Resolve the active GRUB theme's icons directory from user.cfg. +find_icons_dir() { + local theme_line theme_dir + theme_line="$(awk -F= '/set[[:space:]]+theme=/ {print $2; exit}' /boot/grub2/user.cfg 2>/dev/null | tr -d '"' || true)" + [[ -n "$theme_line" ]] || return 1 + theme_dir="${theme_line%/*}" + echo "${theme_dir}/icons" +} + +icons_dir="$(find_icons_dir || true)" + +# Abort (soft) if we cannot locate the theme icons directory. +if [[ -z "$icons_dir" || ! -d "$icons_dir" ]]; then + echo "Could not find GRUB theme icons directory. Ensure /boot/grub2/user.cfg contains a theme= entry. Skipping." >&2 + exit 3 +fi + +# Drop the Bluefin icon into the active theme. +echo "Copying Bluefin icon to ${icons_dir}" +install -m 644 -D "${script_dir}/bluefin.png" "${icons_dir}/bluefin.png" + +# Install the helper that ensures grub_class bluefin exists. +echo "Installing helper script to /usr/local/sbin" +install -m 755 "${script_dir}/bls-add-bluefin.sh" /usr/local/sbin/bls-add-bluefin.sh + +# Add the rpm-ostree hook and reload systemd. +echo "Installing systemd drop-in for rpm-ostree hook" +install -m 644 -D "${script_dir}/bluefin-icons.conf" /etc/systemd/system/ostree-finalize-staged.service.d/bluefin-icons.conf +systemctl daemon-reload + +# Immediately apply the Bluefin class to existing BLS entries. +echo "Applying grub_class bluefin to existing BLS entries" +/usr/local/sbin/bls-add-bluefin.sh + +# Report completion. +echo "Done. New deployments will keep the Bluefin GRUB icon." diff --git a/recipes/recipe.yml b/recipes/recipe.yml index 1dfae5f..933a29d 100644 --- a/recipes/recipe.yml +++ b/recipes/recipe.yml @@ -11,35 +11,48 @@ image-version: latest # latest is also supported if you want new updates ASAP # module configuration, executed in order # you can include multiple instances of the same module -# modules: -# - type: files -# files: -# - source: system -# destination: / # copies files/system/* (* means everything inside it) into your image's root folder / +modules: + - type: files + files: + - source: system + destination: / # copies files/system/* (* means everything inside it) into your image's root folder / -# - type: dnf -# repos: -# copr: -# - atim/starship -# install: -# packages: -# - micro -# - starship -# remove: -# packages: -# # example: removing firefox (in favor of the flatpak) -# # "firefox" is the main package, "firefox-langpacks" is a dependency -# - firefox -# - firefox-langpacks # also remove firefox dependency (not required for all packages, this is a special case) + - type: dnf + install: + packages: + - syncthing + - waydroid + remove: + packages: + - android-tools + - cockpit-bridge + - cockpit-machines + - cockpit-networkmanager + - cockpit-ostree + - cockpit-podman + - cockpit-selinux + - cockpit-storaged + - cockpit-system + - code + - docker-ce + - docker-ce-cli + - docker-ce-rootless-extras + - docker-compose-plugin + - docker-model-plugin + - containerd + - moby-engine -# - type: default-flatpaks -# configurations: -# - notify: true # Send notification after install/uninstall is finished (true/false) -# scope: system -# # If no repo information is specified, Flathub will be used by default -# install: # system flatpaks we want all users to have and not remove -# - org.mozilla.firefox -# - org.gnome.Loupe -# - scope: user # Also add Flathub user repo, but no user packages + - type: default-flatpaks + configurations: + - notify: true # Send notification after install/uninstall is finished (true/false) + scope: system + # If no repo information is specified, Flathub will be used by default + install: # system flatpaks we want all users to have and not remove + - net.waterfox.waterfox + - com.vscodium.codium + - org.telegram.desktop + remove: # replace default Firefox with Waterfox + - org.mozilla.firefox + - scope: user # Also add Flathub user repo, but no user packages - type: signing # this sets up the proper policy & signing files for signed images to work fully