#!/bin/bash

CACHE_FILE="/tmp/ip_public_cache.txt"
[ ! -f "$CACHE_FILE" ] && touch "$CACHE_FILE"
IP_PUBLIC=$(dig +short myip.opendns.com @resolver1.opendns.com)

if [[ "$IP_PUBLIC" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
    echo "$IP_PUBLIC" > "$CACHE_FILE"
else
    IP_PUBLIC=$(cat "$CACHE_FILE")
    [ -z "$IP_PUBLIC" ] && exit 1
fi

SERVER_IDENTIFIER=$(echo "${IP_PUBLIC}-$(hostname)" | tr -cd '[:alnum:]-._')
HOSTNAME=$(hostname)
OS_INFO=$(grep "PRETTY_NAME" /etc/os-release | cut -d'"' -f2)
ARCHITECTURE=$(uname -m)
KERNEL=$(uname -r)
CPU_MODEL=$(grep "model name" /proc/cpuinfo | head -1 | cut -d':' -f2 | sed 's/^ //')
CPU_CORES=$(nproc)
TOTAL_RAM_MB=$(free -m | awk 'NR==2 {print $2}')
TOTAL_RAM_GB=$(awk '/MemTotal/ {printf "%.2f", $2/1024/1024}' /proc/meminfo)
TOTAL_STORAGE=$(df -h / | awk 'NR==2 {print $2}')
AVAILABLE_STORAGE=$(df -h / | awk 'NR==2 {print $4}')
DISK_INFO=$(lsblk -d -o NAME,SIZE,MODEL | grep -v "loop" | sed ':a;N;$!ba;s/\n/, /g')
IP_LOCAL=$(hostname -I | awk '{print $1}')
INTERFACES=$(ip -o -4 addr show | awk '{print $2, $4}' | sed ':a;N;$!ba;s/\n/, /g')
UPTIME=$(uptime -p)
LOAD_AVG=$(cat /proc/loadavg | awk '{print $1,$2,$3}')
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
MEMORY_USAGE=$(free -m | awk 'NR==2{printf "%.2f", $3*100/$2 }')
DISK_USAGE=$(df -h / | awk 'NR==2{print $5}' | tr -d '%')
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

URL="https://monitoring.medan.go.id/push/monitor"

curl -G "${URL}" \
  --data-urlencode "server_identifier=${SERVER_IDENTIFIER}" \
  --data-urlencode "hostname=${HOSTNAME}" \
  --data-urlencode "os=${OS_INFO}" \
  --data-urlencode "architecture=${ARCHITECTURE}" \
  --data-urlencode "kernel=${KERNEL}" \
  --data-urlencode "cpu_model=${CPU_MODEL}" \
  --data-urlencode "cpu_cores=${CPU_CORES}" \
  --data-urlencode "total_ram_mb=${TOTAL_RAM_MB}" \
  --data-urlencode "total_ram_gb=${TOTAL_RAM_GB}" \
  --data-urlencode "total_storage=${TOTAL_STORAGE}" \
  --data-urlencode "available_storage=${AVAILABLE_STORAGE}" \
  --data-urlencode "disk_info=${DISK_INFO}" \
  --data-urlencode "ip_local=${IP_LOCAL}" \
  --data-urlencode "ip_public=${IP_PUBLIC}" \
  --data-urlencode "interfaces=${INTERFACES}" \
  --data-urlencode "uptime=${UPTIME}" \
  --data-urlencode "load_avg=${LOAD_AVG}" \
  --data-urlencode "cpu_usage=${CPU_USAGE}" \
  --data-urlencode "memory_usage=${MEMORY_USAGE}" \
  --data-urlencode "disk_usage=${DISK_USAGE}" \
  --data-urlencode "timestamp=${TIMESTAMP}" \
  --data-urlencode "no_captcha=yes"
