new scripts freebox: reboot, get token

This commit is contained in:
2026-07-24 21:44:42 +02:00
parent ba336aaf14
commit 5a4b1a3bf1
5 changed files with 168 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
freebox_app_token.txt
+19
View File
@@ -26,6 +26,25 @@ It assumes wireguard connection names start with "wg-"
You can check for DNS leaks with [this website](https://www.dnsleaktest.com/) You can check for DNS leaks with [this website](https://www.dnsleaktest.com/)
## freebox
Scripts to interact with a Freebox OS using the official API.
### get_token.sh
Registers a new application with the Freebox and requests authorisation.
After approving the request on the Freebox, the generated app token is saved to `freebox_app_token.txt`.
By default generates a token for the `APP_ID` `fr.bash.reboot`
curl and jq are needed.
### freebox_reboot.sh
Authenticates using the app token from `freebox_app_token.txt` and sends a reboot request to the Freebox over the HTTPS Freebox OS API.
Requires the Freebox ECC Root CA certificate (`freebox_ecc_root_ca.pem`) to be in the same directory as the script.
By default the token should be for the `APP_ID` `fr.bash.reboot`.
curl, openssl and jq are needed.
By default an app is not allowed to reboot the freebox, to allow it, go in "paramètre de la freebox -> gestion des accès -> application", then modify the permissions for your app and check "modification des réglages de la Freebox".
## Other random scripts ## Other random scripts
### belter_tension_calculator.sh ### belter_tension_calculator.sh
+15
View File
@@ -0,0 +1,15 @@
-----BEGIN CERTIFICATE-----
MIICWTCCAd+gAwIBAgIJAMaRcLnIgyukMAoGCCqGSM49BAMCMGExCzAJBgNVBAYT
AkZSMQ8wDQYDVQQIDAZGcmFuY2UxDjAMBgNVBAcMBVBhcmlzMRMwEQYDVQQKDApG
cmVlYm94IFNBMRwwGgYDVQQDDBNGcmVlYm94IEVDQyBSb290IENBMB4XDTE1MDkw
MTE4MDIwN1oXDTM1MDgyNzE4MDIwN1owYTELMAkGA1UEBhMCRlIxDzANBgNVBAgM
BkZyYW5jZTEOMAwGA1UEBwwFUGFyaXMxEzARBgNVBAoMCkZyZWVib3ggU0ExHDAa
BgNVBAMME0ZyZWVib3ggRUNDIFJvb3QgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNi
AASCjD6ZKn5ko6cU5Vxh8GA1KqRi6p2GQzndxHtuUmwY8RvBbhZ0GIL7bQ4f08ae
JOv0ycWjEW0fyOnAw6AYdsN6y1eNvH2DVfoXQyGoCSvXQNAUxla+sJuLGICRYiZz
mnijYzBhMB0GA1UdDgQWBBTIB3c2GlbV6EIh2ErEMJvFxMz/QTAfBgNVHSMEGDAW
gBTIB3c2GlbV6EIh2ErEMJvFxMz/QTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
/wQEAwIBhjAKBggqhkjOPQQDAgNoADBlAjA8tzEMRVX8vrFuOGDhvZr7OSJjbBr8
gl2I70LeVNGEXZsAThUkqj5Rg9bV8xw3aSMCMQCDjB5CgsLH8EdZmiksdBRRKM2r
vxo6c0dSSNrr7dDN+m2/dRvgoIpGL2GauOGqDFY=
-----END CERTIFICATE-----
+72
View File
@@ -0,0 +1,72 @@
#!/usr/bin/env bash
set -euo pipefail
FREEBOX_HOST="${FREEBOX_HOST:-mafreebox.freebox.fr}"
API_BASE="${API_BASE:-https://${FREEBOX_HOST}/api/v4}"
APP_ID="${APP_ID:-fr.bash.reboot}"
TOKEN_FILE="${TOKEN_FILE:-./freebox_app_token.txt}"
CA_FILE="${CA_FILE:-$(dirname "$0")/freebox_ecc_root_ca.pem}"
for cmd in curl jq openssl; do
command -v "$cmd" >/dev/null 2>&1 || { echo "Missing dependency: $cmd" >&2; exit 1; }
done
if [[ ! -f "$TOKEN_FILE" ]]; then
echo "Missing token file: $TOKEN_FILE" >&2
exit 1
fi
if [[ ! -f "$CA_FILE" ]]; then
echo "Missing CA file: $CA_FILE" >&2
exit 1
fi
APP_TOKEN="$(tr -d '\r\n' < "$TOKEN_FILE")"
if [[ -z "$APP_TOKEN" ]]; then
echo "Empty app token in $TOKEN_FILE" >&2
exit 1
fi
echo "Fetching challenge..."
login_response="$(curl --cacert "$CA_FILE" -fsS "${API_BASE}/login/")"
challenge="$(jq -r '.result.challenge // empty' <<<"$login_response")"
if [[ -z "$challenge" ]]; then
echo "Could not get challenge:" >&2
echo "$login_response" >&2
exit 1
fi
echo "Computing password..."
password="$({ printf '%s' "$challenge" | openssl dgst -sha1 -hmac "$APP_TOKEN"; } | awk '{print $2}')"
echo "Opening session..."
session_response="$({
curl --cacert "$CA_FILE" -fsS -X POST "${API_BASE}/login/session/" \
-H 'Content-Type: application/json' \
-d "{\"app_id\":\"${APP_ID}\",\"password\":\"${password}\"}"
})"
session_token="$(jq -r '.result.session_token // empty' <<<"$session_response")"
if [[ -z "$session_token" ]]; then
echo "Authentication failed:" >&2
echo "$session_response" >&2
exit 1
fi
echo "Rebooting..."
reboot_response="$({
curl --cacert "$CA_FILE" -fsS -X POST "${API_BASE}/system/reboot/" \
-H "X-Fbx-App-Auth: ${session_token}" \
-H 'Content-Type: application/json' \
-d '{}'
})"
if jq -e '.success == true' >/dev/null 2>&1 <<<"$reboot_response"; then
echo "Reboot requested."
else
echo "Reboot failed:" >&2
echo "$reboot_response" >&2
exit 1
fi
+61
View File
@@ -0,0 +1,61 @@
#!/usr/bin/env bash
set -euo pipefail
FREEBOX_HOST="${FREEBOX_HOST:-mafreebox.freebox.fr}"
API_BASE="${API_BASE:-http://${FREEBOX_HOST}/api/v8}"
APP_ID="${APP_ID:-fr.bash.reboot}"
APP_NAME="${APP_NAME:-RebootScript}"
APP_VERSION="${APP_VERSION:-1.0}"
DEVICE_NAME="${DEVICE_NAME:-bash-script}"
TOKEN_FILE="${TOKEN_FILE:-./freebox_app_token.txt}"
command -v curl >/dev/null || { echo "curl is required" >&2; exit 1; }
command -v jq >/dev/null || { echo "jq is required" >&2; exit 1; }
echo "Requesting app authorization..."
auth_response="$(
curl -fsS -X POST "${API_BASE}/login/authorize/" \
-H "Content-Type: application/json" \
-d "{
\"app_id\":\"${APP_ID}\",
\"app_name\":\"${APP_NAME}\",
\"app_version\":\"${APP_VERSION}\",
\"device_name\":\"${DEVICE_NAME}\"
}"
)"
app_token="$(jq -r '.result.app_token // empty' <<<"$auth_response")"
track_id="$(jq -r '.result.track_id // empty' <<<"$auth_response")"
if [[ -z "$app_token" || -z "$track_id" ]]; then
echo "Authorization request failed:"
echo "$auth_response"
exit 1
fi
echo "Approve the request on the Freebox now."
echo "track_id: $track_id"
while true; do
status_response="$(curl -fsS "${API_BASE}/login/authorize/${track_id}")"
status="$(jq -r '.result.status // empty' <<<"$status_response")"
case "$status" in
granted)
echo "$app_token" > "$TOKEN_FILE"
chmod 600 "$TOKEN_FILE" 2>/dev/null || true
echo "App token saved to: $TOKEN_FILE"
echo "APP_ID=$APP_ID"
echo "APP_TOKEN=$app_token"
exit 0
;;
denied)
echo "Authorization denied."
exit 1
;;
*)
sleep 2
;;
esac
done