#!/bin/bash

# called by dracut
check() {
    [[ $mount_needs ]] && return 1

    # If the binary(s) requirements are not fulfilled the module can't be installed
    require_binaries "$systemdutildir"/systemd || return 1

    return 0
}

# due to the dependencies below, this dracut module needs to be ordered later than systemd-initrd, systemd-ask-password and the crypt dracut modules

# called by dracut
depends() {
    local deps
    deps="systemd-initrd systemd-ask-password"

    # when systemd and crypt are both included
    # systemd-cryptsetup is mandatory dependency
    # see https://github.com/dracut-ng/dracut-ng/issues/563
    if dracut_module_included "crypt"; then
        module_check systemd-cryptsetup > /dev/null 2>&1
        if [[ $? == 255 ]]; then
            deps+=" systemd-cryptsetup"
        fi
    fi

    echo "$deps"
    return 0
}

# called by dracut
install() {
    inst_script "$moddir/dracut-emergency.sh" /usr/bin/dracut-emergency
    inst_simple "$moddir/emergency.service" "${systemdsystemunitdir}"/emergency.service
    inst_simple "$moddir/dracut-emergency.service" "${systemdsystemunitdir}"/dracut-emergency.service
    inst_simple "$moddir/emergency.service" "${systemdsystemunitdir}"/rescue.service

    ln_r "${systemdsystemunitdir}/initrd.target" "${systemdsystemunitdir}/default.target"

    inst_script "$moddir/dracut-cmdline.sh" /usr/bin/dracut-cmdline
    inst_script "$moddir/dracut-cmdline-ask.sh" /usr/bin/dracut-cmdline-ask
    inst_script "$moddir/dracut-pre-udev.sh" /usr/bin/dracut-pre-udev
    inst_script "$moddir/dracut-pre-trigger.sh" /usr/bin/dracut-pre-trigger
    inst_script "$moddir/dracut-pre-mount.sh" /usr/bin/dracut-pre-mount
    inst_script "$moddir/dracut-mount.sh" /usr/bin/dracut-mount
    inst_script "$moddir/dracut-pre-pivot.sh" /usr/bin/dracut-pre-pivot

    inst_script "$moddir/rootfs-generator.sh" "$systemdutildir"/system-generators/dracut-rootfs-generator

    inst_hook cmdline 00 "$moddir/parse-root.sh"

    for i in \
        dracut-cmdline.service \
        dracut-cmdline-ask.service \
        dracut-mount.service \
        dracut-pre-mount.service \
        dracut-pre-pivot.service \
        dracut-pre-trigger.service \
        dracut-pre-udev.service; do
        inst_simple "$moddir/${i}" "$systemdsystemunitdir/${i}"
        $SYSTEMCTL -q --root "$initdir" add-wants initrd.target "$i"
    done

    inst_simple "$moddir/dracut-tmpfiles.conf" "$tmpfilesdir/dracut-tmpfiles.conf"

    inst_multiple sulogin

    [ -e "${initdir}/usr/lib" ] || mkdir -m 0755 -p "${initdir}"/usr/lib

    local VERSION=""
    local PRETTY_NAME=""
    # Derive an os-release file from the host, if it exists
    if [[ -e "${dracutsysrootdir-}/etc/os-release" ]]; then
        # shellcheck disable=SC1090
        . "${dracutsysrootdir-}"/etc/os-release
        grep -hE -ve '^VERSION=' -ve '^PRETTY_NAME' "${dracutsysrootdir-}"/etc/os-release > "${initdir}"/usr/lib/initrd-release
        [[ -n ${VERSION} ]] && VERSION+=" "
        [[ -n ${PRETTY_NAME} ]] && PRETTY_NAME+=" "
    fi
    VERSION+="dracut-$DRACUT_VERSION"
    PRETTY_NAME+="dracut-$DRACUT_VERSION (Initramfs)"
    {
        echo "VERSION=\"$VERSION\""
        echo "PRETTY_NAME=\"$PRETTY_NAME\""
        # This addition is relatively new, intended to allow software
        # to easily detect the dracut version if need be without
        # having it mixed in with the real underlying OS version.
        echo "DRACUT_VERSION=\"${DRACUT_VERSION}\""
    } >> "$initdir"/usr/lib/initrd-release
    ln -sf ../usr/lib/initrd-release "$initdir"/etc/initrd-release
    ln -sf initrd-release "$initdir"/usr/lib/os-release
    ln -sf initrd-release "$initdir"/etc/os-release

}
