#!/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" <