#!/bin/bash
# SPDX-FileCopyrightText: 2023 SUSE LLC
# SPDX-License-Identifier: GPL-2.0-or-later
set -euo pipefail

config_mount="/run/catalyst/mount"
# Use /dev/shm for data exchange
exchangedir="/dev/shm/catalyst/"
config_dir="${exchangedir}/config"

rm -rf "${exchangedir}"
mkdir "${exchangedir}"

# Try fw_cfg next
if [ -e "/sys/firmware/qemu_fw_cfg/by_name/opt/org.opensuse.catalyst" ]; then
    mkdir -p "${config_dir}"
    if ! cp /sys/firmware/qemu_fw_cfg/by_name/opt/org.opensuse.catalyst/script/raw \
            "${config_dir}/script"; then
        echo "Failed to copy script from fw_cfg!"
        exit 1
    fi
    # TODO: Support other files, e.g. with a tarball or fs image?
fi

# Try VMware guestinfo next
if ! [ -d "${config_dir}" ] && [ "$(systemd-detect-virt)" = "vmware" ]; then
    mkdir -p "${config_dir}"
    # The exit code isn't really useful or documented. Print all errors and only treat
    # a zero exit code + nonempty stdout as success.
    echo "Trying vmware-rpctool"
    if ! vmware-rpctool "info-get guestinfo.catalyst.script" > "${config_dir}/script.gz.b64" \
       || ! [ -s "${config_dir}/script.gz.b64" ] \
       || ! base64 -d < "${config_dir}/script.gz.b64" | gzip -cd > "${config_dir}/script" \
       || ! [ -s "${config_dir}/script" ]; then
        # vmware-rpctool failed or the script is empty
        rm -f "${config_dir}/script.gz.b64" "${config_dir}/script"
        rmdir "${config_dir}"
    fi
    rm -f "${config_dir}/script.gz.b64"
fi

# Try disks next - both lower and upper case
# "LIVE" is used as label for UC installer .isos. Try those as fallback.
for label in catalyst CATALYST ignition IGNITION live LIVE; do
    [ -d "${config_dir}" ] && break
    [ -e "/dev/disk/by-label/${label}" ] || continue

    mkdir -p "${config_mount}"
    if ! mount -o ro /dev/disk/by-label/${label} "${config_mount}"; then
        echo "Failed to mount config drive!"
        rmdir "${config_mount}"
        exit 1
    fi

    if [ -d "${config_mount}/catalyst" ]; then
        if ! cp -R "${config_mount}/catalyst" "${config_dir}"; then
            echo "Failed to copy config!"
            rm -rf "${config_dir}"
            umount "${config_mount}"
            rmdir "${config_mount}"
            exit 1
        fi
    else
        echo "No config found on drive."
    fi

    umount "${config_mount}"
    rmdir "${config_mount}"
done

if ! [ -d "${config_dir}" ]; then
    echo "No config source found"
    exit 0
fi

if [ -e "${config_dir}/script" ]; then
    chmod a+x "${config_dir}/script"
fi

exit 0
