#!/bin/bash

[ $(CreoleGet hapy_init_master) == oui ] || exit 0

function error()
{
    MSG=${1}
    echo "[ERROR][${MSG}]"
    exit 1
}

function get_user_home()
{
    HOMEDIR=$(getent passwd ${1} | cut -d ':' -f 6)
    echo ${HOMEDIR}
}

function get_one_auth()
{
    CMD="cat"
    HOME=$(get_user_home oneadmin)
    FILE="${HOME}/.one/one_auth"
    ${CMD} ${FILE}
}

function runOneCmd()
{
    local cmd=${1}
    local opt=${2}
    local auth=$(get_one_auth)

    $cmd ${opt} --user ${auth%:*} --password ${auth#*:}
    return ${?}
}

#*****************************************************
# Creation d'un disque vide
#*****************************************************
function createEmptyDisk()
{
    local disk_size=${1}
    local disk_name=${2}
    local disk_desc=${3}
    if ! runOneCmd  "oneimage" "show ${disk_name}" &>/dev/null
    then
        echo "***** Création de ${disk_name} *****"

        ## Attention oneimage create --datastore ne fonctionne pas dans runOneCmd ...
        auth=$(get_one_auth)
        oneimage create --datastore $(CreoleGet one_ds_image_name) \
            --name ${disk_name} --type DATABLOCK --description "${disk_desc}" \
            --size $((${disk_size}*1024)) --prefix vd --format qcow2 --user ${auth%:*} --password ${auth#*:}

        runOneCmd "oneimage" "chtype ${disk_name} OS"
    else
        echo "***** ${disk_name} existe déjà *****"
    fi
    echo
}

#*****************************************************
# Image ISO EOLE Latest Stable
#*****************************************************
function addISOImage()
{
    local iso_name=${1}
    local iso_url=${2}
    local iso_desc=${3}

    if ! runOneCmd "oneimage" "show ${iso_name}" &>/dev/null
    then
        echo -ne "***** Création de l'image ${iso_name} *****\n\n"

        FILE=$(mktemp)
        cat > ${FILE} <<EOF
NAME="${iso_name}"
TYPE="CDROM"
DESCRIPTION="${iso_desc}"
DEV_PREFIX="hd"
PATH="${iso_url}"
PERSISTENT="No"
EOF
        runOneCmd "oneimage" "create -d $(CreoleGet one_ds_iso_name) ${FILE}"
        /bin/rm -f ${FILE}

        spin='-\|/'
        i=0
        while :
        do
            imgState=$(runOneCmd "oneimage" "show ${iso_name}" | awk '{if ($1 == "STATE") {print $3}}')
            if [[ ${imgState} == "lock" ]]
            then
                i=$(( (i+1) %4  ))
                printf "\rInitialisation en cours, merci de patienter [${spin:$i:1}]  "
                sleep 2
            else
                printf "\r       Création terminée, l'image a le statut : ${imgState}\n"
                break
            fi
        done
        rm -f "/tmp/${iso_name}"
    else
        echo "***** ${iso_name} existe déjà *****"
    fi
    echo
}

#*****************************************************
# Template EOLEBASE
#*****************************************************
function addTemplate()
{
    local tmpl_name=${1}
    local iso_name=${2}
    local disk_name=${3}
    local tmpl_desc=${4}

    if ! onetemplate show "${tmpl_name}" &>/dev/null
    then
        echo "***** Création de ${tmpl_name} *****"
        FILE=$(mktemp)
        cat > ${FILE} <<EOF
NAME="${tmpl_name}"
DESCRIPTION="${tmpl_desc}"
INPUT=[BUS="usb",TYPE="tablet"]
CPU="0.4"
DISK=[DEV_PREFIX="vd",IMAGE_UNAME="oneadmin",IMAGE="${disk_name}",DRIVER="qcow2"]
DISK=[DEV_PREFIX="hd",IMAGE_UNAME="oneadmin",IMAGE="${iso_name}",DRIVER="raw"]
FEATURES=[ACPI="yes",PAE="no"]
VCPU="1"
GRAPHICS=[LISTEN="0.0.0.0",TYPE="SPICE",KEYMAP="fr"]
OS = [ ARCH = "x86_64", BOOT = "disk0,disk1", FIRMWARE = "/usr/share/OVMF/OVMF_CODE_4M.fd" ]
MEMORY="2048"
EOF

        runOneCmd "onetemplate" "create ${FILE}"
        ret=${?}

        /bin/rm -f ${FILE}
    else
        echo "***** ${tmpl_name} existe déjà *****"
    fi
    echo
    return ${ret}
}

if [ $(CreoleGet activer_proxy_client 'non') = 'oui' ]
then
    PROXY_SERVER=$(CreoleGet proxy_client_adresse)
    PROXY_PORT=$(CreoleGet proxy_client_port)
    PROXY_OPT="--proxy http://${PROXY_SERVER}:${PROXY_PORT}"
fi

#
# Creating all empty disks
#
DISKSSIZES=($(CreoleGet hapy_init_master_disks_size))
for size in ${DISKSSIZES[@]}
do
    name="DSK-${size}-Go"
    desc="Disque vide de ${size} Go"

    createEmptyDisk ${size} ${name} ${desc} \
	|| echo "ERREUR lors de la création du disque vide : ${desc}"
done

#
# Creating all iso images
#
ISOVERSIONS=($(CreoleGet hapy_init_master_iso_versions))
for iso in ${ISOVERSIONS[@]}
do
    MAJORVERSION=${iso:0:3}
    POINT_RELEASE=$(eole-iso ${PROXY_OPT} --release ${iso} get-last-point-release || true)
    if [ -z "${POINT_RELEASE}" ]
    then
        echo "No ISO image for version ${iso}"
        echo
        continue
    fi
    ISONAME=$(eole-iso ${PROXY_OPT} --release ${iso} get-iso-name)
    ISODESC="Image ISO EOLE ${POINT_RELEASE} 64 bits"
    ISOURL=$(eole-iso ${PROXY_OPT} --release ${iso} get-iso-url)

    addISOImage "${ISONAME}" "${ISOURL}" "${ISODESC}" \
	|| echo "ERREUR lors de la création de l'iso : ${ISODESC}"

    TMPLNAME="install-eole-${POINT_RELEASE}-amd64"
    TMPLDESC="Modèle de VM permettant d'installer un module EOLE ${POINT_RELEASE} 64 bits (non persistente)"
    DISKNAME="DSK-${DISKSSIZES[0]}-Go"

    addTemplate "${TMPLNAME}" "${ISONAME}" "${DISKNAME}" "${TMPLDESC}" \
	|| echo "ERREUR lors de ${ISODESC}"
done

exit 0
