#!/bin/bash -e

# root dir configuration
RISOTTO_DIR="/var/lib/risotto"
RISOTTO_IMAGE_DIR="$RISOTTO_DIR/images"
# image configuration
IMAGE_BASE_RISOTTO_BASE_DIR="$RISOTTO_IMAGE_DIR/image_bases"

rm -f $IMAGE_BASE_RISOTTO_BASE_DIR*.build

ls /var/lib/risotto/images_files/ | while read image; do
    if [ -d /var/lib/risotto/images_files/"$image" ]; then
        echo
        echo "Install image $image"
        /usr/local/sbin/build_image "$image"
    fi
done
rm -f $IMAGE_BASE_RISOTTO_BASE_DIR*.build

MACHINES=""
for nspawn in $(ls /etc/systemd/nspawn/*.nspawn); do
    nspawn_file=$(basename $nspawn)
    machine=${nspawn_file%.*}
    MACHINES="$MACHINES$machine "
    MACHINE_MACHINES_DIR="/var/lib/machines/$machine"
    echo "Install machine $machine"
    SHA_MACHINE="$RISOTTO_DIR/configurations/sha/$machine".sha
    content=$(cat $SHA_MACHINE)
    IMAGE_NAME_RISOTTO_IMAGE_NAME=${content##* }
    diff -q "$IMAGE_NAME_RISOTTO_IMAGE_NAME".sha "$SHA_MACHINE" || (
        machinectl stop $machine
        while true; do
            machinectl status "$machine" > /dev/null 2>&1 || break
            sleep 1
        done
        rm -rf "$MACHINE_MACHINES_DIR"
        mkdir "$MACHINE_MACHINES_DIR"
        cd "$MACHINE_MACHINES_DIR"
        tar xf "$IMAGE_NAME_RISOTTO_IMAGE_NAME"
        cp -a "$IMAGE_NAME_RISOTTO_IMAGE_NAME".sha "$SHA_MACHINE"
    )
done
machinectl start $MACHINES
STARTED=""
DEGRADED=""
found=true
idx=0
while [ $found = true ]; do
    found=false
    echo "tentative $idx"
    for machine in $MACHINES; do
        if ! echo $STARTED | grep -q " $machine "; then
            status=$(machinectl -q shell $machine /usr/bin/systemctl is-system-running || true)
            if echo "$status" | grep -q degraded; then
                STARTED="$STARTED $machine "
                DEGRADED="$DEGRADED $machine"
            elif echo "$status" | grep -q running; then
                STARTED="$STARTED $machine "
            else
                found=true
                echo "status actuel de $machine : $status"
            fi
        fi
    done
    sleep 2
    idx=$((idx+1))
    if [ $idx = 60 ]; then
        break
    fi
done
retcode=0
for machine in $DEGRADED; do
    echo
    echo "========= $machine"
    machinectl -q shell $machine /usr/bin/systemctl --state=failed --no-legend --no-pager
    retcode=1
done

exit $retcode