246 lines
8.6 KiB
Bash
Executable File
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 "$@" |