#!/bin/bash API_BASE_URL=https://labmanager-api.edu-al.unipmn.it/api/1.0 function getTokenJSON() { echo `curl -s -k --max-time 10 -X POST -H "Content-Type: application/json" -d "{\"login\":\"guest\",\"pwd\":\"\"}" ${API_BASE_URL}/login` } 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 } stop() { echo "STOP ESAME-GET-CONFIG" } getConfigVars() { 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` MACHINE_CONFIGS_ID_PREV='' CONFIG_NAME_PREV='' if [[ -e /local/config_name ]] then CONFIG_NAME_PREV=`cat /local/config_name` fi } getConfigFile() { # 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 } getIpConfigFile() { # 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" ]] then # 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 else echo "Exam!" #systemctl isolate esame.target && exit 0 #/usr/bin/systemctl set-default esame.target /usr/bin/systemctl reboot #--force fi else # at boot time choose the correct target if [[ "$1" == "boot" ]] then # 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 fi fi # Runtime parameters 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." echo -n "Firefox home..." /usr/bin/systemctl restart esame-firefox-home echo " done." echo echo "All done." fi fi } args=("$@") case "$1" in 'boot') start "boot" ;; 'start') start ;; 'stop') stop ;; 'restart') stop start ;; *) echo "Usage: $0 { boot | start | stop | restart }"; exit 1; ;; esac exit 0