#!/bin/bash

MEMORY_448_MB=448
MEMORY_1792_MB=1792
MEMORY_4096_MB=4096

detect_model_token() {
  local version_path="/usr/lib/version"
  if [ ! -r "$version_path" ]; then
    echo ""
    return
  fi
  local version_line
  version_line=$(head -n 1 "$version_path" 2>/dev/null | tr -d '[:space:]')
  local model_token="${version_line%%.*}"
  echo "$model_token" | tr '[:lower:]' '[:upper:]'
}

MODEL_TOKEN=$(detect_model_token)

# set max old space size to a fraction of system memory:
# 1/6 on small gateway consoles, 1/5 elsewhere
osmem_divisor=5
case "$MODEL_TOKEN" in
  # UDM SE, UDM Pro, UDM Pro SE, UCG Max, UCG Fiber: <=4GB RAM gateway consoles
  "UDMSE"|"UDMPRO"|"UDMPROSE"|"UCGMAX"|"UCGF") osmem_divisor=6 ;;
esac

osmem_kb=$( grep MemTotal /proc/meminfo | awk '{print $2}' )
heap_kb=$(( osmem_kb / osmem_divisor ))
to_mb=$(( heap_kb / 1024 ))
mem_alignment=$(( to_mb / 4 * 4 ))

if [[ "$MODEL_TOKEN" == "ENVRCORE" ]]; then
  echo "$MEMORY_4096_MB"
elif [[ "$mem_alignment" -gt "$MEMORY_1792_MB" ]]; then
  # 448 MB is the minimum
  # 1792 MB is the maximum
  echo "$MEMORY_1792_MB"
elif [[ "$mem_alignment" -lt "$MEMORY_448_MB" ]]; then
  echo "$MEMORY_448_MB"
else
  echo "$mem_alignment"
fi
