#!/bin/bash

set -eu

on_exit()
{
    local exitval=$?

    if [ -n "${tmpdir}" ]; then
        rm -rf "${tmpdir}"
    fi

    return $exitval
}

usage_error()
{
    echo "error: $1" >&2
    echo "Try '$0 --help' for more information". >&2
    return 1
}

do_print_header=true

while [ $# -gt 0 ]; do
    case $1 in
        -h|--help)
            shift
            echo "Usage: $0"
            echo
            echo "Show image information."
            echo
            echo "Options:"
            echo "    -h, --help                   print help and exit"
            echo "    --no-header                  do not print header"
            echo
            exit 0
            ;;
        --no-header)
            shift
            do_print_header=false
            break
            ;;
        --)
            shift
            break
            ;;
        -*)
            usage_error "invalid argument '$1'"
            ;;
        *)
            break
            ;;
    esac
done

if [ $# -ne 0 ]; then
    usage_error "invalid number of arguments ($#), expected 0"
fi

[ $(id -u) -eq 0 ] || usage_error 'must be run as root'

tmpdir=

trap on_exit EXIT

tmpdir=$(mktemp -d --tmpdir)

cd "${tmpdir}"

(
    puavo_hostname=$(cat /etc/puavo/hostname)
    puavo_apiserver=$(puavo-resolve-api-server --no-cloud-fallback)

    curl --cacert /etc/puavo-conf/rootca.pem \
	--header 'Authorization: Bootserver' \
	--silent --show-error \
	"${puavo_apiserver}/v3/device_images?boot_server=${puavo_hostname}" \
	>referenced_images.json

    jq -r '.[]' referenced_images.json
) >referenced_imgs

(
    lsof -u nbd | while read _ _ _ _ filetype _ _ _ filepath; do
	if [ "${filetype}" != "REG" ]; then
            continue
	fi
	filepath=${filepath% (deleted)}
	if [[ "${filepath}" =~ ^/images/(.*)\.img$ ]]; then
            echo ${BASH_REMATCH[1]}
	fi
    done
) >connected_imgs

find /images -maxdepth 1 -type f -name '*.img' \
    -and '!' '(' -name ltsp.img -or -name ltsp-backup.img ')' \
    -exec basename {} .img \; >existing_imgs

first_col_len=$(awk '{ print length($0) }' \
    referenced_imgs \
    connected_imgs \
    existing_imgs \
    | sort -n | tail -n1)

fmt="%-${first_col_len}s | %-5s | %-4s | %s\n"

if ${do_print_header}; then
    header=$(printf "${fmt}" 'IMAGE' 'FILE?' 'NBD?' 'LDAP?')
    echo "${header}"
    for i in $(seq ${#header}); do
	echo -n '='
    done
    echo
fi

cat referenced_imgs connected_imgs existing_imgs | sort -u | while read img; do
    exists=yes
    connected=yes
    referenced=yes

    grep -x -q "${img}" connected_imgs  || connected=no
    grep -x -q "${img}" referenced_imgs || referenced=no
    grep -x -q "${img}" existing_imgs || exists=no

    printf "${fmt}" "${img}" "${exists}" "${connected}" "${referenced}"
done
