diff --git a/src/app_config.sh b/src/app_config.sh index 3e532fa..6b869ec 100644 --- a/src/app_config.sh +++ b/src/app_config.sh @@ -108,6 +108,8 @@ uninstall_menu() { version_menu ;; "E)") + cachedMenuDomain='' + invalidate_domain_cache if ! [[ "$0" =~ .*"/usr/bin/nightscout-tool" ]]; then okdlg "Opcja niedostępna" \ diff --git a/src/app_main.sh b/src/app_main.sh index f9a7d14..6025dcc 100644 --- a/src/app_main.sh +++ b/src/app_main.sh @@ -95,6 +95,8 @@ main_menu() { case $CHOICE in "S)") + cachedMenuDomain='' + invalidate_domain_cache status_menu ;; "P)") diff --git a/src/lib.sh b/src/lib.sh index 37690f3..28c350c 100644 --- a/src/lib.sh +++ b/src/lib.sh @@ -24,6 +24,8 @@ WATCHDOG_TIME_FILE=/srv/nightscout/data/watchdog_time WATCHDOG_LOG_FILE=/srv/nightscout/data/watchdog.log WATCHDOG_FAILURES_FILE=/srv/nightscout/data/watchdog-failures.log WATCHDOG_CRON_LOG=/srv/nightscout/data/watchdog-cron.log +DOMAIN_NAME_FILE=/srv/nightscout/data/domain_name +DOMAIN_UPDATE_TIMESTAMP=/srv/nightscout/data/domain_update_timestamp SUPPORT_LOG=/srv/nightscout/data/support.log EVENTS_DB=/srv/nightscout/data/events.env UPDATE_CHANNEL_FILE=/srv/nightscout/data/update_channel diff --git a/src/logic_app.sh b/src/logic_app.sh index dae6828..0d393f8 100644 --- a/src/logic_app.sh +++ b/src/logic_app.sh @@ -22,7 +22,7 @@ update_logto() { fi } -get_td_domain() { +get_td_domain_from_api() { local MHOST=$(hostname) if ! [[ "$MHOST" =~ [a-zA-Z]{2,16}[0-9]{3} ]]; then MIKRUS_APIKEY=$(cat "/klucz_api") @@ -35,6 +35,63 @@ get_td_domain() { curl -sd "srv=$MHOST&key=$APIKEY" https://api.mikr.us/domain | jq -r ".[].name" | grep ".ns.techdiab.pl" | head -n 1 } +invalidate_domain_cache() { + echo "" >"$DOMAIN_UPDATE_TIMESTAMP" + echo "" >"$DOMAIN_NAME_FILE" +} + +get_td_domain() { + local domain="" + local cache_age=999999 + local now + now=$(date +%s) + + # Check if we have a valid timestamp and cached domain + if [[ -f "$DOMAIN_UPDATE_TIMESTAMP" && -f "$DOMAIN_NAME_FILE" ]]; then + local last_update + last_update=$(cat "$DOMAIN_UPDATE_TIMESTAMP" | tr -d '[:space:]') + if [[ -n "$last_update" && "$last_update" =~ ^[0-9]+$ ]]; then + cache_age=$((now - last_update)) + fi + fi + + # Use cache if it's less than 24 hours old and contains a valid (non-empty) domain + if ((cache_age < 86400)); then + local cached_domain + cached_domain=$(cat "$DOMAIN_NAME_FILE" 2>/dev/null | tr -d '[:space:]') + if [[ -n "$cached_domain" ]]; then + if [[ "$UPDATE_CHANNEL" == "develop" || "$FORCE_DEBUG_LOG" == "1" ]]; then + echo "domain: from cache (${cache_age}s old): $cached_domain" >>"$DEBUG_LOG_FILE" + fi + echo "$cached_domain" + return + fi + fi + + # Cache miss, stale, or empty cached value - fetch from API + local raw_domain + raw_domain=$(get_td_domain_from_api) + domain=$(echo "$raw_domain" | tr -d '[:space:]') + + # Save result to cache; empty result is also saved so it can be detected as + # "unknown" - empty cached value causes re-check on every subsequent call + echo "$domain" >"$DOMAIN_NAME_FILE" + if [[ -n "$domain" ]]; then + echo "$now" >"$DOMAIN_UPDATE_TIMESTAMP" + if [[ "$UPDATE_CHANNEL" == "develop" || "$FORCE_DEBUG_LOG" == "1" ]]; then + echo "domain: freshly retrieved from API: $domain" >>"$DEBUG_LOG_FILE" + fi + else + # Clear timestamp so next call always retries the API when domain is empty + echo "" >"$DOMAIN_UPDATE_TIMESTAMP" + if [[ "$UPDATE_CHANNEL" == "develop" || "$FORCE_DEBUG_LOG" == "1" ]]; then + echo "domain: API returned empty result, cache cleared" >>"$DEBUG_LOG_FILE" + fi + fi + + echo "$domain" +} + get_domain_status() { local domain=$(get_td_domain) local domainLen=${#domain} diff --git a/src/logic_watchdog.sh b/src/logic_watchdog.sh index c271aae..de36fe0 100644 --- a/src/logic_watchdog.sh +++ b/src/logic_watchdog.sh @@ -261,6 +261,7 @@ watchdog_check() { else WATCHDOG_STATUS="domain_failed" + invalidate_domain_cache fi else