#!/bin/bash
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh

# Originally this was known as 'ignition-generator' found in ignition-dracut.
# With Ignition v 2.5.0, ignition-dracut was merged into Ignition and the CoreOS
# specific bits were deposited here.

set -e

# Generators don't have logging right now
# https://github.com/systemd/systemd/issues/15638
exec 1>/dev/kmsg; exec 2>&1

UNIT_DIR="${1:-/tmp}"

cmdline=( $(</proc/cmdline) )
cmdline_arg() {
    local name="$1" value="$2"
    for arg in "${cmdline[@]}"; do
        if [[ "${arg%%=*}" == "${name}" ]]; then
            value="${arg#*=}"
        fi
    done
    echo "${value}"
}

cmdline_bool() {
    local value=$(cmdline_arg "$@")
    case "$value" in
        ""|0|no|off) return 1;;
        *) return 0;;
    esac
}

add_requires() {
    local name="$1"; shift
    local target="$1"; shift
    local requires_dir="${UNIT_DIR}/${target}.requires"
    mkdir -p "${requires_dir}"
    ln -sf "../${name}" "${requires_dir}/${name}"
}

if ! $(cmdline_bool 'ignition.firstboot' 0); then
    exit 0
fi

if ! is-live-image; then
    # coreos-ignition-setup-user.service should depend on the boot device node
    # only on diskful boots
    mkdir -p "${UNIT_DIR}/coreos-ignition-setup-user.service.d"
    cat > "${UNIT_DIR}/coreos-ignition-setup-user.service.d/diskful.conf" <<EOF
[Unit]
Requires=dev-disk-by\x2dlabel-boot.device
After=dev-disk-by\x2dlabel-boot.device

Requires=coreos-gpt-setup.service
After=coreos-gpt-setup.service
EOF

    # create symlink for udev rule
    mkdir -p /run/udev/rules.d/
    ln -sf /usr/lib/coreos/80-coreos-boot-disk.rules \
          /run/udev/rules.d/80-coreos-boot-disk.rules

    # IBM Secure Execution case
    # During firstboot we have to reencrypt '/boot' and '/', to do that an Ignition config
    # is injected. 'coreos-boot-disk' is required for this
    secure_execution=0
    if [[ $(uname -m) == s390x ]] && [[ -e /sys/firmware/uv/prot_virt_guest ]]; then
        secure_execution=$(cat /sys/firmware/uv/prot_virt_guest)
    fi
    if [[ "${secure_execution}" = "1" ]]; then
        mkdir -p /run/coreos/
        touch /run/coreos/secure-execution
    fi
fi
