frogg_freebox_check/frogg_freebox_check.sh

177 lines
5.6 KiB
Bash
Executable File

#!/bin/bash
# @copyright GEMINI & Frogg
# ==============================================================================
# FONCTIONS REQUISITIONS & AUTHENTIFICATION
# ==============================================================================
# Récupère le challenge d'authentification unique
get_challenge() {
local -r url="$1"
local challenge_req
challenge_req=$(curl -s --max-time 10 "$url/login/")
echo "$challenge_req" | grep -oP '"challenge":"\K[^"]+'
}
# Génère le mot de passe de session sécurisé (HMAC-SHA1)
generate_password() {
local -r challenge="$1"
local -r token="$2"
echo -n "$challenge" | openssl dgst -sha1 -hmac "$token" | awk '{print $2}'
}
# Ouvre la session et retourne le Token de Session unique
open_session() {
local -r url="$1"
local -r app_id="$2"
local -r password="$3"
local session_req
session_req=$(curl -s --max-time 10 -X POST \
-d "{\"app_id\": \"$app_id\", \"password\": \"$password\"}" \
"$url/login/session/")
echo "$session_req" | grep -oP '"session_token":"\K[^"]+'
}
# Ferme la session proprement sur la Freebox
close_session() {
local -r url="$1"
local -r session_token="$2"
curl -s --max-time 5 -X POST \
-H "X-Fbx-App-Auth: $session_token" \
"$url/login/logout/" > /dev/null 2>&1
}
# ==============================================================================
# FONCTION COLLECTE ET EXTRACTION (MOTEUR PRINCIPAL)
# ==============================================================================
collect_freebox_metrics() {
local -r url="$1"
local -r token="$2"
# Récupération brute des blocs de données de l'API
local sys_data
local conn_data
sys_data=$(curl -s --max-time 10 -H "X-Fbx-App-Auth: $token" "$url/system/")
conn_data=$(curl -s --max-time 10 -H "X-Fbx-App-Auth: $token" "$url/connection/")
# --- Extraction et calculs locaux ---
local -i cpu_usage
local -i ram_total
local -i ram_free
local -i ram_usage
local -i temp_cpu
local -i temp_switch
local -i fan_rpm
local -i uptime
cpu_usage=$(echo "$sys_data" | grep -oP '"cpu_usage":\K[0-9]+' || echo "0")
ram_total=$(echo "$sys_data" | grep -oP '"mem_total":\K[0-9]+' || echo "0")
ram_free=$(echo "$sys_data" | grep -oP '"mem_free":\K[0-9]+' || echo "0")
if [ "$ram_total" -gt 0 ]; then
ram_usage=$(( 100 - (ram_free * 100 / ram_total) ))
else
ram_usage=0
fi
temp_cpu=$(echo "$sys_data" | grep -oP '"temp_cpub":\K[0-9]+' || echo "0")
temp_switch=$(echo "$sys_data" | grep -oP '"temp_sw":\K[0-9]+' || echo "0")
fan_rpm=$(echo "$sys_data" | grep -oP '"fan_rpm":\K[0-9]+' || echo "0")
uptime=$(echo "$sys_data" | grep -oP '"uptime_val":\K[0-9]+' || echo "0")
# Extraction Disque
local -i disk_total
local -i disk_free
local -i disk_usage
disk_total=$(echo "$sys_data" | grep -oP '"disk_total":\K[0-9]+' || echo "0")
disk_free=$(echo "$sys_data" | grep -oP '"disk_free":\K[0-9]+' || echo "0")
if [ "$disk_total" -gt 0 ]; then
disk_usage=$(( 100 - (disk_free * 100 / disk_total) ))
else
disk_usage=0
fi
# Extraction Réseau
local -i bw_down
local -i bw_up
local -i rate_down
local -i rate_up
local net_status
local vpn_alive
bw_down=$(echo "$conn_data" | grep -oP '"bandwidth_down":\K[0-9]+' || echo "0")
bw_up=$(echo "$conn_data" | grep -oP '"bandwidth_up":\K[0-9]+' || echo "0")
rate_down=$(echo "$conn_data" | grep -oP '"rate_down":\K[0-9]+' || echo "0")
rate_up=$(echo "$conn_data" | grep -oP '"rate_up":\K[0-9]+' || echo "0")
net_status=$(echo "$conn_data" | grep -oP '"state":"\K[^"]+' || echo "unknown")
vpn_alive=$(echo "$conn_data" | grep -oP '"ipv4_vpn_routed":\K[^, ]+' || echo "false")
# --- Sortie du JSON final ---
cat <<EOF
{
"cpu_usage": $cpu_usage,
"ram_usage": $ram_usage,
"disk_usage": $disk_usage,
"bandwidth_down": $bw_down,
"bandwidth_up": $bw_up,
"rate_down": $rate_down,
"rate_up": $rate_up,
"temp_cpu": $temp_cpu,
"temp_switch": $temp_switch,
"fan_rpm": $fan_rpm,
"uptime": $uptime,
"net_status": "$net_status",
"vpn_alive": $vpn_alive
}
EOF
}
# ==============================================================================
# LOGIQUE PRINCIPALE (MAIN)
# ==============================================================================
main() {
# Récupération des paramètres passés par Zabbix
local -r freebox_url="$1"
local -r app_token="$2"
local -r app_id="$3"
# Contrôle strict de la présence des arguments requis
if [ -z "$freebox_url" ] || [ -z "$app_token" ] || [ -z "$app_id" ]; then
echo '{"error": "missing_arguments", "details": "Usage: freebox_pop.sh <URL> <TOKEN> <APP_ID>"}'
exit 1
fi
local challenge
local password
local session_token
# 1. Étape du Challenge
challenge=$(get_challenge "$freebox_url")
if [ -z "$challenge" ]; then
echo '{"error": "api_unreachable"}'
exit 1
fi
# 2. Sécurité & Calcul d'empreinte
password=$(generate_password "$challenge" "$app_token")
# 3. Récupération de la Session
session_token=$(open_session "$freebox_url" "$app_id" "$password")
if [ -z "$session_token" ]; then
echo '{"error": "authentication_failed"}'
exit 1
fi
# 4. Traitement et extraction
collect_freebox_metrics "$freebox_url" "$session_token"
# 5. Nettoyage de la session active sur la Box
close_session "$freebox_url" "$session_token"
}
# Lancement du script en lui injectant tous les arguments reçus par le processus d'appel
main "$@"