#!/bin/bash

if [ -z "${ONE_LOCATION}" ]; then
    LIB_LOCATION=/usr/lib/one
else
    LIB_LOCATION=$ONE_LOCATION/lib
fi

. $LIB_LOCATION/sh/scripts_common.sh

DRIVER_PATH=$(dirname $0)
source ${DRIVER_PATH}/../../datastore/libfs.sh

UTILS_PATH="${DRIVER_PATH}/../../datastore"


# # # get arguments

DRV_ACTION=$1
ID=$2

XPATH="$UTILS_PATH/xpath.rb -b $DRV_ACTION"
unset i XPATH_ELEMENTS
while IFS= read -r -d '' element; do
    XPATH_ELEMENTS[i++]="$element"
done < <($XPATH /MARKET_DRIVER_ACTION_DATA/MARKETPLACEAPP/NAME \
                /MARKET_DRIVER_ACTION_DATA/MARKETPLACEAPP/TEMPLATE/VMTEMPLATE64 \
                /MARKET_DRIVER_ACTION_DATA/MARKETPLACEAPP/DESCRIPTION \
                /MARKET_DRIVER_ACTION_DATA/IMAGE/TYPE \
                /MARKET_DRIVER_ACTION_DATA/IMAGE/ID \
                /MARKET_DRIVER_ACTION_DATA/IMAGE/NAME \
                /MARKET_DRIVER_ACTION_DATA/IMAGE/SOURCE \
                /MARKET_DRIVER_ACTION_DATA/DATASTORE/DS_MAD \
                /MARKET_DRIVER_ACTION_DATA/IMAGE/TEMPLATE/DEV_PREFIX \
                /MARKET_DRIVER_ACTION_DATA/IMPORT_SOURCE \
                /MARKET_DRIVER_ACTION_DATA/FORMAT \
                /MARKET_DRIVER_ACTION_DATA/SIZE \
                /MARKET_DRIVER_ACTION_DATA/MD5 \
                /MARKET_DRIVER_ACTION_DATA/MARKETPLACE/TEMPLATE/ENDPOINT)
unset i
NAME="${XPATH_ELEMENTS[i++]}"
VMTEMPLATE64="${XPATH_ELEMENTS[i++]}"
DESCRIPTION="${XPATH_ELEMENTS[i++]}"
IMAGE_TYPE="${XPATH_ELEMENTS[i++]}"
IMAGE_ID="${XPATH_ELEMENTS[i++]}"
IMAGE_NAME="${XPATH_ELEMENTS[i++]}"
IMAGE_SOURCE="${XPATH_ELEMENTS[i++]}"
DS_MAD="${XPATH_ELEMENTS[i++]}"

IMAGE_DEV_PREFIX="${XPATH_ELEMENTS[i++]}"
IMPORT_SOURCE="${XPATH_ELEMENTS[i++]}"
IMAGE_FORMAT="${XPATH_ELEMENTS[i++]}"
SIZE="${XPATH_ELEMENTS[i++]}"
MD5="${XPATH_ELEMENTS[i++]}"
ENDPOINT="${XPATH_ELEMENTS[i++]}"

# default
OS_ARCH="x86_64"
HYPERVISOR="kvm"
GRAPHICS_TYPE="vnc"
TEMPL_CONTEXT='CONTEXT = [ NETWORK = "YES",SSH_PUBLIC_KEY = "$USER[SSH_PUBLIC_KEY]"]'



case $IMAGE_TYPE in
    '0') IMAGE_TYPE="OS";;
    '1') IMAGE_TYPE="CDROM";;
    '2') IMAGE_TYPE="DATABLOCK";;
    *) IMAGE_TYPE="$(/usr/bin/oneimage show ${image_id} | awk '/^TYPE/ {print $NF}')";;
esac


if [ -z "$VMTEMPLATE64" ]; then

    # template from template (if the image is used in only one template)
    if [ "$IMAGE_TYPE" != "CDROM" ]; then
        ID_TEMPL=($(/usr/bin/onetemplate list -x | xmlstarlet sel -t -v "VMTEMPLATE_POOL/VMTEMPLATE[TEMPLATE/DISK/IMAGE_ID=${IMAGE_ID} or TEMPLATE/DISK/IMAGE=\"$IMAGE_NAME\"]/ID"))
        if [ -n "$ID_TEMPL" -a ${#ID_TEMPL[@]} -eq 1 ];then
            TMPL_XML="$(/usr/bin/onetemplate show -x ${ID_TEMPL[0]})"
            XPATH="$UTILS_PATH/xpath.rb  --stdin"
            unset i XPATH_ELEMENTS
            while IFS= read -r -d '' element; do
                XPATH_ELEMENTS[i++]="$element"
            done < <(echo "$TMPL_XML" | $XPATH  /VMTEMPLATE/TEMPLATE/CPU \
                                                /VMTEMPLATE/TEMPLATE/GRAPHICS/TYPE \
                                                /VMTEMPLATE/TEMPLATE/HYPERVISOR \
                                                /VMTEMPLATE/TEMPLATE/MEMORY \
                                                /VMTEMPLATE/TEMPLATE/VROUTER)
            unset i
            TEMPL_CPU="${XPATH_ELEMENTS[i++]}"
            TEMPL_GRAPHICS_TYPE="${XPATH_ELEMENTS[i++]}"
            TEMPL_HYPERVISOR="${XPATH_ELEMENTS[i++]:-${HYPERVISOR}}"
            TEMPL_MEMORY="${XPATH_ELEMENTS[i++]}"
            TEMPL_VROUTER="${XPATH_ELEMENTS[i++]}"

            [ -n "$TEMPL_VROUTER" ] && TEMPL_VROUTER="VROUTER = \"$TEMPL_VROUTER\""
            #default
            TEMPL_INPUTS_ORDER=
            TEMPL_USER_INPUTS=
            user_inputs=$(xmlstarlet sel -T -t -m '/VMTEMPLATE/TEMPLATE/USER_INPUTS/*' -v "concat(name(), '=\"',normalize-space(.), '\",')" <<< ${TMPL_XML} | sed 's/,$//' )
            if [ -n "$user_inputs" ];then
                TEMPL_USER_INPUTS="USER_INPUTS = [ ${user_inputs}]"
                user_inputs_for_context=$(xmlstarlet sel -T -t -m "/VMTEMPLATE/TEMPLATE/USER_INPUTS/*" -v "concat(name(), '=\"$', name(), '\",')" <<< ${TMPL_XML})
                TEMPL_CONTEXT='CONTEXT = [ NETWORK = "YES",'${user_inputs_for_context}'SSH_PUBLIC_KEY = "$USER[SSH_PUBLIC_KEY]"]'
                for_inputs_order=$(xmlstarlet sel -T -t -m "/VMTEMPLATE/TEMPLATE/USER_INPUTS/*" -v "concat(name(), ',')" <<< ${TMPL_XML} | sed 's/,$//')
                TEMPL_INPUTS_ORDER='INPUTS_ORDER = "'${for_inputs_order}'"'
            fi

            VMTEMPLATE64="$(echo "$(cat << EOF
${TEMPL_CONTEXT}
CPU = "${TEMPL_CPU}"
GRAPHICS = [ LISTEN = "0.0.0.0",TYPE = "${TEMPL_GRAPHICS_TYPE:-$GRAPHICS_TYPE}" ]
${TEMPL_INPUTS_ORDER}
HYPERVISOR = "${TEMPL_HYPERVISOR,,}"
MEMORY = "${TEMPL_MEMORY}"
OS = [ ARCH = "${OS_ARCH}" ]
${TEMPL_USER_INPUTS}
${TEMPL_VROUTER}
EOF
)" | base64 -w 0)"

        # default template (if more than one template is using the image)
        else
            VMTEMPLATE64="$(echo "$(cat << EOF
${TEMPL_CONTEXT}
GRAPHICS = [ LISTEN = "0.0.0.0",TYPE = "${GRAPHICS_TYPE}" ]
HYPERVISOR = "${HYPERVISOR}"
OS = [ ARCH = "${OS_ARCH}" ]
EOF
)" | base64 -w 0)"
        fi
    fi

# user template
else
    VMTEMPLATE="$(echo "$VMTEMPLATE64" | base64 -d)"
    if ! echo "$VMTEMPLATE" | sed -e '/ *GRAPHICS *=/,/.*\]/!d' | grep -wq 'TYPE *='; then
        VMTEMPLATE="$(echo "$VMTEMPLATE" | sed -e '/ *GRAPHICS *=/,/.*\]/d')"
        VMTEMPLATE="$(cat << EOF
${VMTEMPLATE}
GRAPHICS = [ LISTEN = "0.0.0.0",TYPE = "${GRAPHICS_TYPE}" ]
EOF
)"
    fi
    if ! echo "$VMTEMPLATE" | grep -wq 'HYPERVISOR *='; then
        VMTEMPLATE="$(cat << EOF
${VMTEMPLATE}
HYPERVISOR="${HYPERVISOR}"
EOF
)"
    fi
    VMTEMPLATE64="$(echo "${VMTEMPLATE}" | base64 -w 0)"
fi


# # # image and market info

imageName=$(generate_image_hash)
MARKET_FQDN="$(echo ${ENDPOINT} | awk -F/ '{print $3}')"
market_img_url="http://${MARKET_FQDN}/brest-marketplace/data/"
IMG_URL="${market_img_url}${imageName}"
market_path="/var/www/html/brest-marketplace"
market_img_path="${market_path}/data/"
market_html_path="${market_path}/index.html"


# # # checking SSH connection

CHECK_SSH=$(cat <<EOF
ssh -o BatchMode=yes -o ConnectTimeout=5 root@${MARKET_FQDN} "exit 0"
EOF
)
exec_and_log "eval $CHECK_SSH" "Access is denied. No SSH connection to the marketplace"


# # # checking control key

loc_controlkey_path="/var/lib/one/remotes/market/brest/controlkey"
controlkey="$([ -f $loc_controlkey_path ] && cat $loc_controlkey_path)"
controlkey_path="${market_path}/data/controlkey"
if ! ssh -o BatchMode=yes -o ConnectTimeout=5 root@${MARKET_FQDN} "test -f ${controlkey_path} || exit \$? ; [ \"\$(cat ${controlkey_path} | head -n 1)\" == \"${controlkey}\" ]; exit \$?" > /dev/null 2>&1;then
    error_message "Access is denied."
    exit 1
fi


# # # checking free space

if [ -n "$SIZE" ] && [ $SIZE -eq $SIZE ] 2>/dev/null; then
    # disk size + 10MB
    let IMG_SIZE=$SIZE*1024+10240
    CHECK_MSPACE=$(cat <<EOF
ssh -o BatchMode=yes -o ConnectTimeout=5 root@${MARKET_FQDN} "market_space=\$(df $market_img_path  | awk 'NR>1 {print \$4}'); if [ \$market_space -lt $IMG_SIZE ]; then exit -1;fi"
EOF
)
    exec_and_log "eval $CHECK_MSPACE" "There is not enough space on the marketplace"
else
  error_message "Failed to get image size"
  exit -1
fi


# # # import app to marketplace

# checking APP name
AppList="$(curl -sSL "$ENDPOINT")"
ArrayApp=($(echo "$AppList" | cut -d\" -f2))
for App in ${ArrayApp[@]}; do
    decApp="$(echo "$App" | base64 -d)"
    nameApp="$(echo "$decApp" | grep ^NAME=\" | cut -d\" -f2)"
  if [ "$nameApp" == "${NAME}" ];then
    error_message "An app named \"$NAME\" already exists"
    exit -1
  fi
done

# check image
CHECK_IMG=$(cat <<EOF
ssh -o BatchMode=yes -o ConnectTimeout=5 root@${MARKET_FQDN} "mkdir -p ${market_img_path} || exit \$?; test -f ${market_img_path}${imageName}; exit \$?"
EOF
)
exec_and_log "eval $CHECK_IMG" "    The image \"$imageName\" already exists"

# copy image to market
case ${DS_MAD,,} in
    'ceph') COPY_CMD="rbd export ${IMAGE_SOURCE} - -p one --id libvirt  | ssh root@${MARKET_FQDN} \"cat > ${market_img_path}${imageName}\"";;
    'lvm'|'lvm_thin') COPY_CMD="${SUDO} ${DD} if=${IMAGE_SOURCE} | ssh root@${MARKET_FQDN} \"${DD} of=${market_img_path}${imageName}\"";;
    'fs'|*) COPY_CMD="scp ${IMPORT_SOURCE} root@${MARKET_FQDN}:${market_img_path}${imageName}";;
esac
if [ "${DS_MAD,,}" == "brest_lvm" ];then
    ${SUDO} lvchange -ay ${IMAGE_SOURCE}
    tmp_image_source=/var/tmp/one-dump/${imageName}
    ${SUDO} qemu-img convert -O qcow ${IMAGE_SOURCE} ${tmp_image_source}
    MD5=$(${SUDO} ${MD5SUM} ${tmp_image_source} | cut -f1 -d' ')
    scp ${tmp_image_source} root@${MARKET_FQDN}:${market_img_path}${imageName}
    RC=$?
    ${SUDO} lvchange -an ${IMAGE_SOURCE}
    ${SUDO} ${RM} -f ${tmp_image_source}
    if [ $RC -ne 0 ]; then
        log_error "   Error copy image to marketplace (brest_lvm)"
        error_message "   Error copy image to marketplace"
        exit -1
    fi
else
    CP_IMG_CMD=$(cat <<EOF
if ! ${COPY_CMD}; then ssh -o BatchMode=yes -o ConnectTimeout=5 root@${MARKET_FQDN} "rm -f ${market_img_path}$imageName"; exit -1; fi
EOF
)
    exec_and_log "eval $CP_IMG_CMD" "   Error copy image to marketplace"
fi

# create taemplate (base64)
APPTEMPLATE64="$(echo "$(cat << EOF
DEV_PREFIX = "${IMAGE_DEV_PREFIX}"
DRIVER = "${IMAGE_FORMAT}"
TYPE = "${IMAGE_TYPE}"
EOF
)" | base64 -w 0)"

TEMPLATE64="$(echo "$(cat << EOF
NAME="${NAME}"
SOURCE="${IMG_URL}"

ORIGIN_ID="-1"
TYPE="IMAGE"
PUBLISHER="Brest"
FORMAT="${IMAGE_FORMAT}"
DESCRIPTION="${DESCRIPTION}"

TAGS="brest"
REGTIME="$(date +%s)"
SIZE="${SIZE}"
MD5="${MD5}"
APPTEMPLATE64="$APPTEMPLATE64"
VMTEMPLATE64="$VMTEMPLATE64"
EOF
)" | base64 -w 0)"


# copy template (base64) to index.html
CP_TEMPLATE64_CMD=$(cat <<EOF
ssh -o BatchMode=yes -o ConnectTimeout=5 root@${MARKET_FQDN} "chmod 644 ${market_img_path}${imageName}; grep -w "${TEMPLATE64}" ${market_html_path} || echo 'APP=\"${TEMPLATE64}\"' >> ${market_html_path}"
EOF
)
exec_and_log "eval $CP_TEMPLATE64_CMD" "    Error copy app to marketplace"


# # # temporary app

# # keep status LOCKED
# CMD_SLEEP=$(cat <<EOF
# sleep 25
# EOF
# )
# exec_and_log "eval $CMD_SLEEP"

# data for temporary app
cat << EOF
SOURCE="${IMG_URL}"
MD5="${MD5}"
SIZE="${SIZE}"
FORMAT="${IMAGE_FORMAT}"
EOF

# del temporary app
/usr/bin/onemarketapp delete $ID
