#!/bin/bash

######## GLOBAL VARIABLES ########
_JSON_DATA=
_JSON_DECODE_DATA_KEYS=
_JSON_DECODE_DATA_VALUES=

case "$OSTYPE" in
    darwin*) SED_REX='-E' ;;
    *) SED_REX='-r' ;;
esac

if echo "test string" | egrep -ao --color=never "test" &>/dev/null; then
    GREP='egrep -ao --color=never'
else
    GREP='egrep -ao'
fi

######## FUNCTIONS ########

######## FUNCTIONS FROM JSON.SH ########
# This is from https://github.com/dominictarr/JSON.sh
# See LICENSE for more info.

_throw () {
    echo "$*" >&2
    exit 1
}

_tokenize_json () {
    local ESCAPE='(\\[^u[:cntrl:]]|\\u[0-9a-fA-F]{4})'
    local CHAR='[^[:cntrl:]"\\]'
    local STRING="\"$CHAR*($ESCAPE$CHAR*)*\""
    # The Freebox api don't put quote between string values
    # STRING2 solve this problem
    local STRING2="[^:,][a-zA-Z][a-zA-Z0-9_-]*[^],}]"
    local NUMBER='-?(0|[1-9][0-9]*)([.][0-9]*)?([eE][+-]?[0-9]*)?'
    local KEYWORD='null|false|true'
    local SPACE='[[:space:]]+'

    $GREP "$STRING|$STRING2|$NUMBER|$KEYWORD|$SPACE|." | egrep -v "^$SPACE$"
    # " Fix xemacs fontification
}

_parse_array () {
    local index=0
    local ary=''
    read -r token
    case "$token" in
        ']') ;;
        *)
           while : ; do
               _parse_value "${1%*.}" "[$index]."
               index=$((index+1))
               ary="$ary""$value"
               read -r token
               case "$token" in
                   ']') break ;;
                   ',') ary="$ary," ;;
                   *) _throw "EXPECTED , or ] GOT ${token:-EOF}" ;;
               esac
               read -r token
           done
           ;;
    esac
    value=$(printf '[%s]' "$ary")
}

_parse_object () {
    local key
    local obj=''
    read -r token
    case "$token" in
        '}') ;;
        *)
           while : ; do
               case "$token" in
                   '"'*'"') key=$token;;
                   *) _throw "EXPECTED string GOT ${token:-EOF}" ;;
               esac
               read -r token
               case "$token" in
                   ':') ;;
                   *) _throw "EXPECTED : GOT ${token:-EOF}" ;;
               esac
               read -r token
               _parse_value "$1" "$key"
               obj="$obj$key:$value"
               read -r token
               case "$token" in
                   '}') break ;;
                   ',') obj="$obj," ;;
                   *) _throw "EXPECTED , or } GOT ${token:-EOF}" ;;
               esac
               read -r token
           done
           ;;
    esac
    value=$(printf '{%s}' "$obj")
}

_parse_value () {
    local jpath="${1:-}${2:-}"
    case "$token" in
        '{') _parse_object "$jpath" ;;
        '[') _parse_array  "$jpath";;
        # At this point, the only valid single-character tokens are digits.
        ''|[!0-9]) _throw "EXPECTED value GOT ${token:-EOF}" ;;
        *) value=$token ;;
    esac
    [ "${value:-}" = '' ] && return
    jpath=${jpath//\"\"/.}
    jpath=${jpath//\"/}
    local key="${jpath%*.}"
    [[ "$key" = '' ]] && return
    _JSON_DECODE_DATA_KEYS+=("$key")
    value=${value#\"}  # Remove leading "
    value=${value%*\"} # Remove trailing "
    value=${value//\\\///} # convert \/ to /
    _JSON_DECODE_DATA_VALUES+=("$value")
}

_parse_json () {
    read -r token
    _parse_value
    read -r token
    case "$token" in
        '') ;;
        *) _throw "EXPECTED EOF GOT $token" ;;
    esac
}

######## END OF FUNCTIONS FROM JSON.SH ########

function _parse_and_cache_json {
    if [[ "$_JSON_DATA" != "$1" ]]; then
        _JSON_DATA="$1"
        _JSON_DECODE_DATA_KEYS=("")
        _JSON_DECODE_DATA_VALUES=("")
        _parse_json < <(echo "$_JSON_DATA" | _tokenize_json)
    fi
}

function get_json_value_for_key {
    _parse_and_cache_json "$1"
    local key i=1 max_index=${#_JSON_DECODE_DATA_KEYS[@]};
    while [[ $i -lt $max_index ]]; do
        if [[ "${_JSON_DECODE_DATA_KEYS[$i]}" = "$2" ]]; then
            echo ${_JSON_DECODE_DATA_VALUES[$i]}
            return 0
        fi
        ((i++))
    done
    return 1
}

function dump_json_keys_values {
    _parse_and_cache_json "$1"
    local key i=1 max_index=${#_JSON_DECODE_DATA_KEYS[@]};
    while [[ $i -lt $max_index ]]; do
        printf "%s = %s\n" "${_JSON_DECODE_DATA_KEYS[$i]}" "${_JSON_DECODE_DATA_VALUES[$i]}"
        ((i++))
    done
}

answer=$(/usr/bin/curl -ksm 30 https://mabbox.bytel.fr/api/v1/device/mem)
if [ $? -eq 28 ]; then
        echo "CRITICAL: timeout"
        exit 2
fi
MEM_TOTAL=$(get_json_value_for_key "$answer" '[0].device.mem.total')
MEM_FREE=$(get_json_value_for_key "$answer" '[0].device.mem.free')
MEM_CACHED=$(get_json_value_for_key "$answer" '[0].device.mem.cached')
MEM_COMMITTEDAS=$(get_json_value_for_key "$answer" '[0].device.mem.committedas')

MEM_USAGE=$(echo "$MEM_TOTAL-$MEM_FREE" | /usr/bin/bc)
MEM_USAGE_PCT=$(echo "scale=1;100*$MEM_USAGE/$MEM_TOTAL" | /usr/bin/bc)
MEM_CACHED_PCT=$(echo "scale=1;100*$MEM_CACHED/$MEM_TOTAL" | /usr/bin/bc)
MEM_COMMITTEDAS_PCT=$(echo "scale=1;100*$MEM_COMMITTEDAS/$MEM_TOTAL" | /usr/bin/bc)

MEM_TOTAL_MO=$(echo "$MEM_TOTAL/1024" | /usr/bin/bc)
MEM_FREE_MO=$(echo "$MEM_FREE/1024" | /usr/bin/bc)
MEM_CACHED_MO=$(echo "$MEM_CACHED/1024" | /usr/bin/bc)
MEM_COMMITTEDAS_MO=$(echo "$MEM_COMMITTEDAS/1024" | /usr/bin/bc)

STATUS=0
MSG=""

if [ $MEM_COMMITTEDAS_PCT -gt 93 ]; then
	STATUS=1
fi

if [ $MEM_COMMITTEDAS_PCT -gt 94 ]; then
        STATUS=2
fi

if [ $STATUS -eq 0 ]; then
	MSG="Free memory: $MEM_FREE_MO/$MEM_TOTAL_MO Mo., Cached: $MEM_CACHED_MO Mo., Committed_AS: $MEM_COMMITTEDAS_MO Mo.|'Usage'=${MEM_USAGE_PCT}%;80;95;0;100 'Cached'=${MEM_CACHED_PCT}%;0;100;0;100 'Committedas'=${MEM_COMMITTEDAS_PCT}%;0;100;0;100"
fi
if [ $STATUS -eq 1 ]; then
        echo -n "WARN: Free memory: $MEM_FREE_MO/$MEM_TOTAL_MO Mo., Cached: $MEM_CACHED_MO Mo., Committed_AS: $MEM_COMMITTEDAS_MO Mo.|'Usage'=${MEM_USAGE_PCT}%;80;95;0;100 'Cached'=${MEM_CACHED_PCT}%;0;100;0;100 'Committedas'=${MEM_COMMITTEDAS_PCT}%;0;100;0;100"
fi
if [ $STATUS -eq 2 ]; then
        echo -n "CRITICAL: Free memory: $MEM_FREE_MO/$MEM_TOTAL_MO Mo., Cached: $MEM_CACHED_MO Mo., Committed_AS: $MEM_COMMITTEDAS_MO Mo.|'Usage'=${MEM_USAGE_PCT}%;80;95;0;100 'Cached'=${MEM_CACHED_PCT}%;0;100;0;100 'Committedas'=${MEM_COMMITTEDAS_PCT}%;0;100;0;100"
fi

echo $MSG
exit $STATUS
