#!/bin/sh

WANCHECK_VERSION=1.1

source /etc/wancheck.conf

recheck_count=0

log_message() {
  if [ $WANCHECK_LOG -gt 0 ]
  then
    ts=`date +'%Y-%m-%d %H:%M:%S'`
    echo "[$ts] (wancheck_v$WANCHECK_VERSION debug-lvl$1) $2" >> $WANCHECK_LOGFILE
  fi
}

parse_yaml() {
   local prefix=$2
   local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '\034')
   sed -ne "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \
        -e "s|^\($s\)\($w\)$s:$s\(.*\)$s\$|\1$fs\2$fs\3|p"  $1 |
   awk -F$fs '{
      indent = length($1);
      vname[indent] = $2;
      for (i in vname) {if (i > indent) {delete vname[i]}}
      if (length($3) > 0) {
         vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")}
         printf("%s%s%s=\"%s\"\n", "'$prefix'",vn, $2, $3);
      }
   }'
}

exec_curl_cmd() {
    log_message 2 "Launch command: curl -sS --user $conf_tunnels_main_auth --insecure --connect-timeout $CONNECT_TIMEOUT $WANCHECK_URL"
    CONTENT=$(curl -sS --user $conf_tunnels_main_auth --insecure --connect-timeout $CONNECT_TIMEOUT $WANCHECK_URL)
    RESULT=$?
    if [ $RESULT -eq 0 ]
    then
        # check content
        if [ -n $WANCHECK_EXPECTED ] # only if WANCHECK_EXPECTED is defined
        then
            if [ "$WANCHECK_EXPECTED" != "$CONTENT" ] # if fetched and expected result differ, return 999
            then
                RESULT=999
            fi
        fi
    fi
    return $RESULT
}

wan_recheck() {
  log_message 1 "Rechecking..."
  recheck_count=$((recheck_count + 1))
  exec_curl_cmd
  if [ 0 -eq $? ]
  then
    log_message 1 "recheck positive again at recheck_count to $recheck_count. Returning."
    recheck_count=0
    return;
  else
    log_message 1 "curl recheck negative"
    if [ $MAX_RECHECK_COUNT -eq $recheck_count ]
    then
      log_message 1 "recheck_count is $MAX_RECHECK_COUNT, that's over."
      log_message 1 "[KO]"
      echo 0 > $WANSTATUS_FILE
    else
      log_message 1 "recheck_count still $recheck_count, rechecking on..."
      wait $RECHECK_PERIOD
      wan_recheck
    fi
  fi
}

wan_check() {
  log_message 1 "nominal curl checking..."
  exec_curl_cmd
  if [ 0 -eq $? ]
  then
      log_message 1 "[OK]"
    echo 1 > $WANSTATUS_FILE
  else
    wan_recheck
  fi
}
eval $(parse_yaml /etc/ngrok.yml "conf_")
wan_check
