frogg_freebox_check/freebox_token.sh

246 lines
8.6 KiB
Bash
Executable File

#!/bin/bash
#
# freebox_create_token.sh
#
# Crée une nouvelle application sur la Freebox et génère un App Token
# utilisable ensuite dans vos scripts API.
#
# Usage :
# ./freebox_create_token.sh
#
# Prérequis :
# - curl
# - jq
#
# Installation :
# apt install curl jq
#
set -e
# ─────────────────────────────────────────────
# CONSTANTES GLOBALES
# ─────────────────────────────────────────────
readonly FREEBOX_URL="http://mafreebox.freebox.fr"
readonly CONFIG_FILE="freebox_api.conf"
readonly DEFAULT_APP_ID="zabbix.frogg.fr"
readonly DEFAULT_APP_NAME="FroggBox API"
readonly DEFAULT_APP_VERSION="1.0"
readonly DEFAULT_DEVICE_NAME="zabbix.frogg.fr"
# ─────────────────────────────────────────────
# COULEURS & STYLES
# ─────────────────────────────────────────────
readonly C_RESET='\033[0m'
readonly C_BOLD='\033[1m'
readonly C_DIM='\033[2m'
readonly C_CYAN='\033[0;36m'
readonly C_GREEN='\033[0;32m'
readonly C_YELLOW='\033[0;33m'
readonly C_RED='\033[0;31m'
readonly C_WHITE='\033[0;97m'
# ─────────────────────────────────────────────
# FONCTIONS D'AFFICHAGE
# ─────────────────────────────────────────────
print_banner() {
echo
echo -e "${C_CYAN}${C_BOLD}"
echo " ╔══════════════════════════════════════════════╗"
echo " ║ 🟠 FREEBOX TOKEN GENERATOR ║"
echo " ║ Autorisation d'application via API ║"
echo " ╚══════════════════════════════════════════════╝"
echo -e "${C_RESET}"
}
print_step() {
local step="$1"
local label="$2"
echo
echo -e "${C_CYAN}${C_BOLD} ┌─ ÉTAPE ${step} ─────────────────────────────────${C_RESET}"
echo -e "${C_CYAN}${C_BOLD}${C_WHITE}${label}${C_RESET}"
echo -e "${C_CYAN}${C_BOLD} └────────────────────────────────────────────${C_RESET}"
echo
}
print_info() {
local label="$1"
local value="$2"
printf " ${C_DIM}%-18s${C_RESET} ${C_WHITE}%s${C_RESET}\n" "${label}" "${value}"
}
print_success() {
echo -e " ${C_GREEN}${C_BOLD}$1${C_RESET}"
}
print_warning() {
echo -e " ${C_YELLOW}${C_BOLD}$1${C_RESET}"
}
print_error() {
echo -e " ${C_RED}${C_BOLD}$1${C_RESET}"
}
print_waiting() {
echo -e " ${C_CYAN}$1${C_RESET}"
}
print_separator() {
echo -e " ${C_DIM}────────────────────────────────────────────${C_RESET}"
}
print_token_box() {
local app_id="$1"
local app_token="$2"
echo
echo -e "${C_GREEN}${C_BOLD}"
echo " ╔══════════════════════════════════════════════╗"
echo " ║ ✅ TOKEN GÉNÉRÉ ║"
echo " ╚══════════════════════════════════════════════╝"
echo -e "${C_RESET}"
echo -e " ${C_DIM}APP_ID ${C_RESET} ${C_YELLOW}${C_BOLD}${app_id}${C_RESET}"
echo -e " ${C_DIM}APP_TOKEN ${C_RESET} ${C_GREEN}${C_BOLD}${app_token}${C_RESET}"
echo
}
# ─────────────────────────────────────────────
# SAISIE UTILISATEUR
# ─────────────────────────────────────────────
collect_app_info() {
echo -e " ${C_DIM}Appuyez sur Entrée pour utiliser la valeur par défaut.${C_RESET}"
echo
read -rp "$(echo -e " ${C_BOLD}App ID${C_RESET} ${C_DIM}[${DEFAULT_APP_ID}]${C_RESET} : ")" APP_ID
APP_ID="${APP_ID:-$DEFAULT_APP_ID}"
read -rp "$(echo -e " ${C_BOLD}App Name${C_RESET} ${C_DIM}[${DEFAULT_APP_NAME}]${C_RESET} : ")" APP_NAME
APP_NAME="${APP_NAME:-$DEFAULT_APP_NAME}"
read -rp "$(echo -e " ${C_BOLD}App Version${C_RESET} ${C_DIM}[${DEFAULT_APP_VERSION}]${C_RESET} : ")" APP_VERSION
APP_VERSION="${APP_VERSION:-$DEFAULT_APP_VERSION}"
read -rp "$(echo -e " ${C_BOLD}Device Name${C_RESET} ${C_DIM}[${DEFAULT_DEVICE_NAME}]${C_RESET} : ")" DEVICE_NAME
DEVICE_NAME="${DEVICE_NAME:-$DEFAULT_DEVICE_NAME}"
echo
print_separator
echo
print_info "App ID" "$APP_ID"
print_info "App Name" "$APP_NAME"
print_info "Version" "$APP_VERSION"
print_info "Device" "$DEVICE_NAME"
print_info "Freebox URL" "$FREEBOX_URL"
echo
}
# ─────────────────────────────────────────────
# LOGIQUE FREEBOX API
# ─────────────────────────────────────────────
request_authorization() {
# Retourne APP_TOKEN et TRACK_ID via les variables globales
local response
response=$(curl -s -X POST "${FREEBOX_URL}/api/v10/login/authorize/" \
-H "Content-Type: application/json" \
-d "{
\"app_id\": \"${APP_ID}\",
\"app_name\": \"${APP_NAME}\",
\"app_version\": \"${APP_VERSION}\",
\"device_name\": \"${DEVICE_NAME}\"
}")
local success
success=$(echo "$response" | jq -r '.success')
if [ "$success" != "true" ]; then
print_error "Échec de la demande d'autorisation :"
echo "$response" | jq . >&2
exit 1
fi
APP_TOKEN=$(echo "$response" | jq -r '.result.app_token')
TRACK_ID=$(echo "$response" | jq -r '.result.track_id')
}
wait_for_user_approval() {
print_info "Track ID" "$TRACK_ID"
echo
print_warning "Une notification est apparue sur votre Freebox Delta / Player."
echo -e " ${C_DIM}Acceptez-la, puis appuyez sur ${C_BOLD}Entrée${C_RESET}${C_DIM} pour continuer...${C_RESET}"
read -r
}
poll_authorization_status() {
while true; do
local status_response
status_response=$(curl -s "${FREEBOX_URL}/api/v10/login/authorize/${TRACK_ID}")
local status
status=$(echo "$status_response" | jq -r '.result.status')
case "$status" in
granted)
print_success "Autorisation accordée !"
return 0
;;
denied)
print_error "Autorisation refusée par l'utilisateur."
exit 1
;;
timeout)
print_error "Délai d'autorisation expiré."
exit 1
;;
pending)
print_waiting "En attente de validation..."
sleep 2
;;
*)
print_error "Statut inattendu : ${status}"
echo "$status_response" | jq . >&2
exit 1
;;
esac
done
}
save_config() {
cat > "$CONFIG_FILE" <<EOF
APP_ID="${APP_ID}"
APP_TOKEN="${APP_TOKEN}"
FREEBOX_URL="${FREEBOX_URL}"
EOF
chmod 600 "$CONFIG_FILE"
print_success "Configuration sauvegardée dans : ${C_BOLD}${CONFIG_FILE}${C_RESET}"
echo -e " ${C_DIM}Permissions : 600 (lecture propriétaire uniquement)${C_RESET}"
}
# ─────────────────────────────────────────────
# POINT D'ENTRÉE
# ─────────────────────────────────────────────
main() {
print_banner
print_step "1" "Informations de l'application"
collect_app_info
print_step "2" "Demande d'autorisation à la Freebox"
request_authorization
print_success "Requête envoyée avec succès."
wait_for_user_approval
print_step "3" "Vérification du statut d'autorisation"
poll_authorization_status
print_token_box "$APP_ID" "$APP_TOKEN"
print_step "4" "Sauvegarde de la configuration"
save_config
echo
}
main "$@"