Skip to content
Snippets Groups Projects
get-config 6.67 KiB
Newer Older
Alberto LIVIO BECCARIA's avatar
Alberto LIVIO BECCARIA committed
#!/bin/bash

API_BASE_URL=https://labmanager-api.edu-al.unipmn.it/api/1.0
Alberto LIVIO BECCARIA's avatar
Alberto LIVIO BECCARIA committed

function getTokenJSON() {
    # store the whole response with the status at the end
    HTTP_RESPONSE=$(curl -s -k -w "HTTPSTATUS:%{http_code}" --max-time 10 -X POST -H "Content-Type: application/json" -d "{\"login\":\"guest\",\"pwd\":\"\"}" ${API_BASE_URL}/login)
    # extract the body
    HTTP_BODY=$(echo "$HTTP_RESPONSE" | sed -e 's/HTTPSTATUS\:.*//g')
    # extract the status
    HTTP_STATUS=$(echo "$HTTP_RESPONSE" | tr -d '\n' | sed -e 's/.*HTTPSTATUS://')

    # check the status
    if [[ $HTTP_STATUS -ne 200  ]]
    then
        echo "Error authenticating to server (http_status=$HTTP_STATUS)"
        exit 1
    else
        echo $HTTP_BODY
    fi
Alberto LIVIO BECCARIA's avatar
Alberto LIVIO BECCARIA committed
}


function jsonValue() {
    KEY=$1
    num=$2
    awk -F"[,:}]" '{for(i=1;i<=NF;i++){if($i~/\042'$KEY'\042/){print $(i+1)}}}' | tr -d '"' | sed -n ${num}p
Alberto LIVIO BECCARIA's avatar
Alberto LIVIO BECCARIA committed
}


stop() {
    echo "STOP ESAME-GET-CONFIG"
}


Alberto LIVIO BECCARIA's avatar
Alberto LIVIO BECCARIA committed
    TOKEN_JSON=$(getTokenJSON)
    TOKEN=`echo ${TOKEN_JSON} | jsonValue token 1`
    MACHINE_NAME=`hostname`
    MACHINE_JSON=`/usr/bin/curl -s -k --max-time 10 -H "Authorization: Bearer ${TOKEN}" -X GET ${API_BASE_URL}/machines/name/${MACHINE_NAME}`
    MACHINE_ID=`echo $MACHINE_JSON | jsonValue id 1`
    MACHINE_CONFIGS_ID=`echo $MACHINE_JSON | jsonValue configs_id 1`
    CONFIG_NAME=`echo $MACHINE_JSON | jsonValue name 2`

Alberto LIVIO BECCARIA's avatar
Alberto LIVIO BECCARIA committed
    MACHINE_CONFIGS_ID_PREV=''
    CONFIG_NAME_PREV=''
    if [[ -e /local/config_name ]]
Alberto LIVIO BECCARIA's avatar
Alberto LIVIO BECCARIA committed
    then
        CONFIG_NAME_PREV=`cat /local/config_name`
    # get configuration file
    HTTP_STATUS=`/usr/bin/curl -s -k -w "%{http_code}" -o /local/esame-machine.conf --max-time 10 --header "Authorization: Bearer ${TOKEN}" -X GET ${API_BASE_URL}/machines/${MACHINE_ID}/configfile`
    if [[ $HTTP_STATUS -ne 200 ]]
    then
        echo "Error downloading config file (http_status=$HTTP_STATUS)"
        exit 1
    else
        echo "Downloaded config file (http_status=$HTTP_STATUS)"
    fi
    # get ipconfig file
    HTTP_STATUS=`/usr/bin/curl -s -k -w "%{http_code}" -o /local/iptables --max-time 10 --header "Authorization: Bearer ${TOKEN}" -X GET ${API_BASE_URL}/machines/${MACHINE_ID}/ipconfigfile`
    if [[ $HTTP_STATUS -ne 200 ]]
    then
        echo "Error downloading iptables config file (http_status=$HTTP_STATUS)"
        exit 1
    else
        echo "Downloaded iptables config file (http_status=$HTTP_STATUS)"
    fi
}


updateCurrentConfigId() {
    # Update this machine's current config id
    HTTP_STATUS=`/usr/bin/curl -s -k -w "%{http_code}" -o /dev/null --max-time 10 -H "Content-Type: application/json" -H "Authorization: Bearer ${TOKEN}" \
        -X PUT -d "{\"current_configs_id\":\"$MACHINE_CONFIGS_ID\"}" ${API_BASE_URL}/machines/${MACHINE_ID}/currentconfig`

    if [[ $HTTP_STATUS -ne 200 ]]
    then
        echo "Error updating current config (http_status=$HTTP_STATUS)"
        exit 1
    else
        echo "Updated current config (http_status=$HTTP_STATUS)"
    fi
}


start() {
    echo "START ESAME-GET-CONFIG"

    getConfigVars

    #echo "TOKEN_JSON: $TOKEN_JSON"
    #echo "TOKEN: $TOKEN"
    #echo "MACHINE_NAME: $MACHINE_NAME"
    #echo "MACHINE_JSON: $MACHINE_JSON"
    #echo "MACHINE_ID: $MACHINE_ID"
    #echo "MACHINE_CONFIGS_ID: $MACHINE_CONFIGS_ID"
    #echo "MACHINE_CONFIGS_ID_PREV: $MACHINE_CONFIGS_ID_PREV"
    echo "Configuration: $CONFIG_NAME"

    # non sono riuscito a contattare il ws
    if [[ "$CONFIG_NAME" == "" ]]
    then
        echo "Error: WS unreachable or wrong credentials"
	exit 1
    fi

    # back config files up
    cp -f /local/esame-machine.conf /local/esame-machine.conf.prev 2>&1
    cp -f /local/iptables /local/iptables.prev 2>&1

    getConfigFile

    getIpConfigFile

    # configuration profile is changed
    if [[ "$CONFIG_NAME" != "$CONFIG_NAME_PREV" ]]
        # stop the timer to avoid executing this script again before the boot
        #/usr/bin/systemctl stop esame-apply-config.timer
        # update config_name file
        echo ${CONFIG_NAME} > /local/config_name
    
        # no exam, set normal target
        if [[ "$CONFIG_NAME" == "normale" ]]
        then
            # stop some services to revert system files
            #/usr/bin/systemctl stop esame-kioskmode
            #/usr/bin/systemctl stop esame-kdm-autologin
            #/usr/bin/systemctl stop esame-virtualbox
            rm /local/esame-machine.conf 2>&1
            rm /local/esame-machine.conf.prev 2>&1
            rm /local/iptables 2>&1
            rm /local/iptables.prev 2>&1
	    echo "Normal!"
            #systemctl isolate graphical && exit 0
            #/usr/bin/systemctl set-default graphical.target
            /usr/bin/systemctl reboot
            #--force
	    #systemctl isolate esame.target && exit 0
            #/usr/bin/systemctl set-default esame.target
            /usr/bin/systemctl reboot
            #--force
        # at boot time choose the correct target
        if [[ "$1" == "boot" ]]
            # we have just rebooted, update the current configuration via web service
            updateCurrentConfigId
            case "$CONFIG_NAME" in
                'normale') # normal
                    systemctl isolate graphical.target && exit 0
                    ;;
                'kiosk-dir' | 'kiosk-dir-esami' | 'kiosk-escher' | 'kiosk-freebrowsing' | 'kiosk-teco') # kiosk mode
                    systemctl isolate esamekiosk.target && exit 0
                    ;;
                *) # all full desktop exams
                    systemctl isolate esame.target && exit 0
                    ;;
            esac
    if [[ "$CONFIG_NAME" != "normale" ]]
    then
        # check if parameters are changed
        cmp --silent /local/esame-machine.conf /local/esame-machine.conf.prev
        if [[ $? -ne 0 ]]
        then
            /usr/bin/systemctl daemon-reload
            echo "Configuration parameters changed: restart some services... "
            # restart some exam services
            echo -n "USB..."
            /usr/bin/systemctl restart esame-usb
            echo " done."
            /usr/bin/systemctl restart esame-firefox-home
            echo " done."
            echo -n "Desktop Wallpaper..."
            /usr/bin/systemctl restart esame-desktop-wallpaper
            echo " done."
Alberto LIVIO BECCARIA's avatar
Alberto LIVIO BECCARIA committed
}


args=("$@")

case "$1" in
Alberto LIVIO BECCARIA's avatar
Alberto LIVIO BECCARIA committed
'start')
Alberto LIVIO BECCARIA's avatar
Alberto LIVIO BECCARIA committed
'stop')
Alberto LIVIO BECCARIA's avatar
Alberto LIVIO BECCARIA committed
'restart')
    echo "Usage: $0 { boot | start | stop | restart }";
Alberto LIVIO BECCARIA's avatar
Alberto LIVIO BECCARIA committed
esac
exit 0