#
# Podman specific functions
#
################################################################
#
# Copyright (c) 2023 Dirk Mueller
# Copyright (c) 2023 SUSE, LLC
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 or 3 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program (see the file COPYING); if not, write to the
# Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
#
################################################################


podmanvm_create_extract_hook() {
    local hook_dir="$1"
    local extract_tar="$2"
    cat > "$hook_dir/create.sh" << EOF
#!/bin/sh
exec "$BUILD_ROOT/.build/unpackarchive" --tar --try-chroot < "$extract_tar"
EOF
    chmod 755 "$hook_dir/create.sh"
    cat > "$hook_dir/create.json" << EOF
{
    "version": "1.0.0",
    "hook": { "path": "$hook_dir/create.sh" },
    "when": { "always": true },
    "stages": [ "createContainer" ]
}
EOF
}

vm_verify_options_podman() {
    VM_ROOT=
    VM_SWAP=
}

vm_startup_podman() {
    local name="build_${RECIPEFILE//:/-}"
    podman rm "$name" >/dev/null 2>&1 || true
    local podman_opts=
    test -n "$VM_TYPE_PRIVILEGED" && podman_opts="--privileged --cap-add=SYS_ADMIN --cap-add=MKNOD"
    test -n "$RUN_SHELL" -o -n "$RUN_SHELL_AFTER_FAIL" && podman_opts="$podman_opts -it"
    mkdir -p "$BUILD_ROOT/home"
    local mounts=()
    local non_mounts=()
    local d
    for d in $BUILD_ROOT/* $BUILD_ROOT/.??*; do
	d="${d##*/}"
	case $d in
	    proc | dev | sys | installed-pkg) continue ;;
	    .build.log | .build.podman-oci-hooks) continue ;;
	    *,*) continue ;;
	esac
	if test -d "$BUILD_ROOT/$d" -a ! -L "$BUILD_ROOT/$d" ; then
	    mounts[${#mounts[@]}]="--mount"
	    mounts[${#mounts[@]}]="type=bind,source=$BUILD_ROOT/$d,destination=/$d"
	else
	    non_mounts[${#non_mounts[@]}]="$d"
	fi
    done
    rm -f "$BUILD_ROOT/.build/.toextract.tar"
    rm -rf "$BUILD_ROOT/.build.podman-oci-hooks"
    mkdir -p "$BUILD_ROOT/.build.podman-oci-hooks"
    if test -n "${non_mounts[*]}" ; then
	tar -C "$BUILD_ROOT" -cf - -- "${non_mounts[@]}" > "$BUILD_ROOT/.build/.podman-toextract.tar"
	podmanvm_create_extract_hook "$BUILD_ROOT/.build.podman-oci-hooks" "$BUILD_ROOT/.build/.podman-toextract.tar"
    fi
    podman --hooks-dir="$BUILD_ROOT/.build.podman-oci-hooks" run \
        --runtime=runc \
        --rm --name "$name" --net=none $podman_opts \
        "${mounts[@]}" \
        "$@" build-scratch:latest "$vm_init_script"
    BUILDSTATUS="$?"
    test "$BUILDSTATUS" != 255 || BUILDSTATUS=3
    # clean up and copyout the .build.packages link
    rm -rf "$BUILD_ROOT/.build.podman-oci-hooks"
    rm -f "$BUILD_ROOT/.build.packages"
    test -L "$BUILD_ROOT/.build/.build.packages" && cp -a "$BUILD_ROOT/.build/.build.packages" "$BUILD_ROOT/.build.packages"
    cleanup_and_exit "$BUILDSTATUS"
}

vm_kill_podman() {
    local name="build_${RECIPEFILE//:/-}"
    podman stop -t 2 "$name" || true
}

vm_fixup_podman() {
    # create a scratch image for our build environment
    if ! podman image exists build-scratch:latest ; then
        echo "FROM scratch"  | podman build -t build-scratch:latest  -
    fi
}

vm_attach_root_podman() {
    :
}

vm_attach_swap_podman() {
    :
}

vm_detach_root_podman() {
    :
}

vm_detach_swap_podman() {
    :
}

vm_cleanup_podman() {
    :
}

vm_sysrq_podman() {
    :
}

vm_wipe_podman() {
    local name="build_${RECIPEFILE//:/-}"
    podman rm "$name" >/dev/null 2>&1 || true

    echo "Wiping build root: '$BUILD_ROOT'"
    unmount_build_root
    # calling 'podman unshare' is required because podman creates the files with SubUIDs/SubGIDs
    # that differ from user's UID/GID and removing them would normally end up with
    # a permission error for any user that is not root
    podman unshare rm -rf "$BUILD_ROOT"
}
