#!/bin/bash
# Get password from Openstack API

source /usr/lib/app-setup-scalet/logging

export VENDORDATA=
export METADATA=

STANDARDS_VERSION='2013-10-17'
VENDORDATA_PATH="/openstack/${STANDARDS_VERSION}/vendor_data.json"
METADATA_PATH="/openstack/${STANDARDS_VERSION}/meta_data.json"
APP="/usr/lib/app-setup-scalet/oneclickapps/${1}"

usage()
{
    cat <<EOF 1>&2
    USAGE: $0 <appname> 

    $0 <appname> - first boot setup for Vscale apps 
EOF
}

debug "Trying to get VendorData from attached ConfigDrive"
if [[ -e /run/configdrive ]]; then
    error "ConfigDrive is already mounted"
    die 3
fi

if [[ ! -e /dev/disk/by-label/config-2 ]]; then
    error "ConfigDrive is not present"
    die 4
fi

if mkdir -p /run/configdrive && \
   mount /dev/disk/by-label/config-2 /run/configdrive -t iso9660 -o norock,mode=0400; then
    debug "Fetching VendorData from ConfigDrive"

    export VENDORDATA=`cat "/run/configdrive/${VENDORDATA_PATH}"`
    export METADATA=`cat "/run/configdrive/${METADATA_PATH}"`

    umount /run/configdrive &> /dev/null
    rmdir /run/configdrive &> /dev/null
else
    error "Failed to mount ConfigDrive"
    umount /run/configdrive &> /dev/null
    rmdir /run/configdrive &> /dev/null
    die 5
fi

source /usr/lib/app-setup-scalet/openstack
source $APP

broadcast()
{
    local msg="$*"
    local gettys=$(ps aux | awk '/getty/ {if (0==match($0,"awk")) print $7}')
    echo -e "Selectel password changer:\n$msg" | wall -n
    for tty in $gettys; do
        [ -w /dev/$tty ] && \
            echo -e "\nSelectel password changer:\n$msg" > /dev/$tty
    done
}



root_pwd() 
{
        if [ -z "$password" ]; then
        info "Deleting root password"
        passwd -d root
        else
        info "Setting root password"
        echo -n "root:$password" | chpasswd -e
        fi
        
        if [ $? != 0 ]; then
            error "ERROR: Failed to set root password..."
            exit 2
        fi
}
get_password()
{
    info "Getting password from API service"
    password=`openstack_get_passwordhash`
    if [ $? != 0 ]; then
        error "Failed to get new password"
        [[ 'manual' == $ACTION ]] && broadcast "Failed to get new password"
        exit 1
    fi
    
    if [ -z "$password" ] || [ "null" == "$password" ]; then
        info "No valid password obtained, no changes made..."
        [[ 'manual' == $ACTION ]] && broadcast "No password change detected"
    fi
}

get_metadata()
{
    info "Getting paneluser from API service"
    paneluser=`openstack_get_paneluser`
    if [ $? != 0 ]; then
        error "Failed to get user for panel from API service"
        [[ 'manual' == $ACTION ]] && broadcast "Failed to get user for panel from API service"
    #    exit 1
    fi

    if [ -z "$paneluser" ] || [ "null" == "$paneluser" ]; then
        info "No user for panel obtained, no changes made..."
        [[ 'manual' == $ACTION ]] && broadcast "No panel user detected"
    #    exit 2
    fi


    info "Getting password from API service"
    panelpassword=`openstack_get_panelpassword`
    if [ $? != 0 ]; then
        error "Failed to get password for panel from API service"
        [[ 'manual' == $ACTION ]] && broadcast "Failed to get password for panel from API service"
        exit 1
    fi

    if [ -z "$panelpassword" ] || [ "null" == "$panelpassword" ]; then
        info "No valid password for panel obtained, no changes made..."
        [[ 'manual' == $ACTION ]] && broadcast "No panel password detected"
        exit 2
    fi
}

case "$1" in
    "root" | "docker" | "redis" | "mongodb" | "nodejs" | "tarantool")
    get_password
    root_pwd
    ;;
    "redmine" | "jenkins" | "fastpanel" | "ajenti" | "vesta" | "bitrix" | "django" | "gitlab" | "gogs" | "lamp" | "vesta" | "wordpress")
    get_password
    root_pwd
    get_metadata
    app_setup
    ;;
    "rails")
    get_password
    root_pwd
    app_setup
    ;;
    "application")
    get_password
    root_pwd
    get_metadata
    app_setup
    ;;
    *)
    usage
    ;;
esac

#### End of script
info "Password successfully set"
[[ 'manual' == $ACTION ]] && broadcast "Passwords successfully updated"
