Fixed non-interactive cleanup

develop
Dominik Dzienia 3 weeks ago
parent 0f65830c5e
commit 67407f07c7

@ -16,7 +16,7 @@
# This file is automatically generated. Do not modify it directly! # This file is automatically generated. Do not modify it directly!
# Instead, modify the source files in the src directory and run the build script! # Instead, modify the source files in the src directory and run the build script!
# #
# Build time: 2026.01.05 22:19 # Build time: 2026.01.06 01:30
@ -29,7 +29,8 @@
REQUIRED_NODE_VERSION=18.0.0 REQUIRED_NODE_VERSION=18.0.0
REQUIRED_DOTENV_VERSION=1.3.0 REQUIRED_DOTENV_VERSION=1.3.0
LOGTO=/srv/nightscout/data/debug.log LOGTO=/dev/null
DEBUG_LOG_FILE=/srv/nightscout/data/debug.log
NIGHTSCOUT_ROOT_DIR=/srv/nightscout NIGHTSCOUT_ROOT_DIR=/srv/nightscout
CONFIG_ROOT_DIR=/srv/nightscout/config CONFIG_ROOT_DIR=/srv/nightscout/config
DATA_ROOT_DIR=/srv/nightscout/data DATA_ROOT_DIR=/srv/nightscout/data
@ -61,7 +62,9 @@ DISK_CRITICAL_WARNING=104857600 # == 100 MiB
DISK_CRITICAL_MAIL=604800 # == 7 days in seconds DISK_CRITICAL_MAIL=604800 # == 7 days in seconds
DOCKER_DOWN_MAIL=604800 # == 7 days in seconds DOCKER_DOWN_MAIL=604800 # == 7 days in seconds
SCRIPT_VERSION="1.10.2" #auto-update SCRIPT_VERSION="1.10.2" #auto-update
SCRIPT_BUILD_TIME="2026.01.05" #auto-update SCRIPT_BUILD_TIME="2026.01.06" #auto-update
FORCE_DEBUG_LOG=""
NONINTERACTIVE_MODE="false"
#======================================= #=======================================
# DOWNLOAD CONFIG # DOWNLOAD CONFIG
@ -69,7 +72,7 @@ SCRIPT_BUILD_TIME="2026.01.05" #auto-update
GITHUB_BASE_URL="https://raw.githubusercontent.com/dlvoy/mikrus-installer" GITHUB_BASE_URL="https://raw.githubusercontent.com/dlvoy/mikrus-installer"
GITEA_BASE_URL="https://gitea.dzienia.pl/shared/mikrus-installer/raw/branch" GITEA_BASE_URL="https://gitea.dzienia.pl/shared/mikrus-installer/raw/branch"
GITHUB_UNAVAILABLE="" # Empty string = GitHub is available, set to "1" if GitHub fails GITHUB_UNAVAILABLE="" # Empty string = GitHub is available, set to "1" if GitHub fails
#======================================= #=======================================
@ -166,6 +169,7 @@ emoji_check="\U2705"
emoji_ok="\U1F197" emoji_ok="\U1F197"
emoji_err="\U274C" emoji_err="\U274C"
emoji_note="\U1F4A1" emoji_note="\U1F4A1"
emoji_debug="\U1F4DC"
uni_bullet=" $(printf '\u2022') " uni_bullet=" $(printf '\u2022') "
uni_copyright="$(printf '\uA9\uFE0F')" uni_copyright="$(printf '\uA9\uFE0F')"
@ -215,31 +219,80 @@ chomp() {
} }
ohai() { ohai() {
printf "${tty_blue}==>${tty_bold} %s${tty_reset}\n" "$(shell_join "$@")" if [ "$NONINTERACTIVE_MODE" = "true" ]; then
# shellcheck disable=SC2059
printf "==> %s\n" "$(shell_join "$@")"
else
printf "${tty_blue}==>${tty_bold} %s${tty_reset}\n" "$(shell_join "$@")"
fi
} }
msgok() { msgok() {
# shellcheck disable=SC2059 if [ "$NONINTERACTIVE_MODE" = "true" ]; then
printf "$emoji_ok $1\n" # shellcheck disable=SC2059
printf "$1\n"
else
# shellcheck disable=SC2059
printf "$emoji_ok $1\n"
fi
} }
msgnote() { msgnote() {
# shellcheck disable=SC2059 if [ "$NONINTERACTIVE_MODE" = "true" ]; then
printf "$emoji_note $1\n" # shellcheck disable=SC2059
printf "$1\n"
else
# shellcheck disable=SC2059
printf "$emoji_note $1\n"
fi
} }
msgcheck() { msgcheck() {
# shellcheck disable=SC2059 if [ "$NONINTERACTIVE_MODE" = "true" ]; then
printf "$emoji_check $1\n" # shellcheck disable=SC2059
printf "$1\n"
else
# shellcheck disable=SC2059
printf "$emoji_check $1\n"
fi
} }
msgerr() { msgerr() {
# shellcheck disable=SC2059 if [ "$NONINTERACTIVE_MODE" = "true" ]; then
printf "$emoji_err $1\n" # shellcheck disable=SC2059
printf "$1\n"
else
# shellcheck disable=SC2059
printf "$emoji_err $1\n"
fi
}
msgdebug() {
if [[ "$UPDATE_CHANNEL" == "develop" || "$FORCE_DEBUG_LOG" == "1" ]]; then
if [ "$NONINTERACTIVE_MODE" = "true" ]; then
# shellcheck disable=SC2059
printf "$1\n"
else
printf "$emoji_debug $1\n"
fi
fi
}
hline() {
if [ "$NONINTERACTIVE_MODE" = "true" ]; then
printf "%s\n" "-------------------------------------------------------"
else
printf "${tty_bold}%s${tty_reset}\n" "-------------------------------------------------------"
fi
} }
warn() { warn() {
printf "${tty_red}Warning${tty_reset}: %s\n" "$(chomp "$1")" >&2 if [ "$NONINTERACTIVE_MODE" = "true" ]; then
# shellcheck disable=SC2059
printf "Warning: %s\n" "$(chomp "$1")" >&2
else
printf "${tty_red}Warning${tty_reset}: %s\n" "$(chomp "$1")" >&2
fi
} }
@ -612,13 +665,48 @@ event_count() {
else else
local eventsJSON=$(dotenv-tool parse -r -f "${EVENTS_DB}") local eventsJSON=$(dotenv-tool parse -r -f "${EVENTS_DB}")
local eventsKeysStr=$(echo "${eventsJSON}" | jq -r ".values | keys[]") local eventsKeysStr=$(echo "${eventsJSON}" | jq -r ".values | keys[]")
local eventsCount=${#eventsKeysStr}
if ((eventsCount > 0)); then if [[ -z "$eventsKeysStr" ]]; then
mapfile -t eventList < <(echo "${eventsKeysStr}")
echo "${#eventList[@]}"
else
echo "0" echo "0"
return
fi fi
mapfile -t eventList < <(echo "${eventsKeysStr}")
local count=0
local processedNames=()
for eventId in "${eventList[@]}"; do
# Parse eventName and eventTail (suffix)
mapfile -t -d '_' eventIdSplit <<<"${eventId}"
local eventTail=$(echo "${eventIdSplit[-1]}" | tr -d '\n')
unset "eventIdSplit[-1]"
printf -v eventBase '%s_' "${eventIdSplit[@]}"
local eventName="${eventBase%_}"
if [ ${#eventIdSplit[@]} -eq 0 ]; then
eventName="$eventTail"
eventTail=""
fi
if [[ "$eventTail" == "start" ]] || [[ "$eventTail" == "end" ]]; then
# Group start/end as one
if [[ ! " ${processedNames[*]} " =~ [[:space:]]${eventName}[[:space:]] ]]; then
processedNames+=("${eventName}")
((count++))
fi
elif [[ "$eventTail" == "set" ]]; then
((count++))
elif [[ "$eventTail" == "clear" ]]; then
# Count clear only if set exists
local hasSet=$(echo "$eventsJSON" | jq -r ".values.${eventName}_set")
if [[ "$hasSet" != "null" ]]; then
((count++))
fi
else
# Lone event (no suffix)
((count++))
fi
done
echo "$count"
fi fi
} }
@ -663,10 +751,16 @@ event_list() {
fi fi
else else
if [[ "$eventTail" == "set" ]] || [[ "$eventTail" == "clear" ]]; then if [[ "$eventTail" == "set" ]] || [[ "$eventTail" == "clear" ]]; then
local startVar=$(echo "$eventsJSON" | jq -r ".values.${eventName}_set")
local endVar=$(echo "$eventsJSON" | jq -r ".values.${eventName}_clear")
# Filter out orphaned clear events (clear exists but set does not)
if [[ "$startVar" == "null" ]] && [[ "$endVar" != "null" ]]; then
continue
fi
if [[ ! " ${namesTab[*]} " =~ [[:space:]]${eventName}[[:space:]] ]]; then if [[ ! " ${namesTab[*]} " =~ [[:space:]]${eventName}[[:space:]] ]]; then
namesTab+=("${eventName}") namesTab+=("${eventName}")
local startVar=$(echo "$eventsJSON" | jq -r ".values.${eventName}_set")
local endVar=$(echo "$eventsJSON" | jq -r ".values.${eventName}_clear")
local joinedVar="od: $startVar zdjęto: $endVar" local joinedVar="od: $startVar zdjęto: $endVar"
local fixedVar=$(echo "$joinedVar" | sed -E -e "s/ ?(od|zdjęto): null ?//g") local fixedVar=$(echo "$joinedVar" | sed -E -e "s/ ?(od|zdjęto): null ?//g")
if [[ "$fixedVar" =~ od: ]] && [[ "$fixedVar" =~ zdjęto: ]]; then if [[ "$fixedVar" =~ od: ]] && [[ "$fixedVar" =~ zdjęto: ]]; then
@ -1376,7 +1470,9 @@ get_watchdog_status() {
} }
watchdog_check() { watchdog_check() {
echo "Nightscout Watchdog mode" echo "---------------------------"
echo " Nightscout Watchdog mode"
echo "---------------------------"
WATCHDOG_LAST_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ") WATCHDOG_LAST_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
WATCHDOG_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ") WATCHDOG_TIME=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
@ -1463,7 +1559,7 @@ watchdog_check() {
if [ "$WATCHDOG_STATUS" = "detection_failed" ]; then if [ "$WATCHDOG_STATUS" = "detection_failed" ]; then
{ {
echo "----------------------------------------------------------------" hline
echo "[$WATCHDOG_TIME] Unknown server failure:" echo "[$WATCHDOG_TIME] Unknown server failure:"
echo "CONTAINERS:" echo "CONTAINERS:"
docker stats --no-stream docker stats --no-stream
@ -1531,6 +1627,7 @@ watchdog_check() {
} }
#======================================= #=======================================
# CLEANUP LOGIC # CLEANUP LOGIC
#======================================= #=======================================
@ -1599,6 +1696,39 @@ do_cleanup_app_logs() {
rm -f "$WATCHDOG_CRON_LOG" rm -f "$WATCHDOG_CRON_LOG"
} }
cleanup_stats() {
local spaceInfo=$(get_space_info)
local remainingTxt=$(echo "$spaceInfo" | awk '{print $3}' | numfmt --to iec-i --suffix=B)
local totalTxt=$(echo "$spaceInfo" | awk '{print $2}' | numfmt --to iec-i --suffix=B)
local percTxt=$(echo "$spaceInfo" | awk '{print $4}')
local fixedPerc=$percTxt
local nowB=$(echo "$spaceInfo" | awk '{print $3}')
local lastTimeB=$(echo "$lastTimeSpaceInfo" | awk '{print $3}')
local savedB=$((nowB - lastTimeB))
local savedTxt=$(echo "$savedB" | numfmt --to iec-i --suffix=B)
if ((savedB < 1)); then
savedTxt="---"
fi
hline
printf " Dostępne: %s\n Zwolniono: %s\n Zajęte: %s (z %s)\n" "${remainingTxt}" "${savedTxt}" "${fixedPerc}" "${totalTxt}"
hline
}
do_cleanup_all() {
echo "Sprzątanie..."
lastTimeSpaceInfo=$(get_space_info)
hline
do_cleanup_container_logs
do_cleanup_sys
do_cleanup_docker
do_cleanup_db
do_cleanup_diagnostics
cleanup_stats
}
#======================================= #=======================================
@ -1618,36 +1748,83 @@ source_admin() {
# UPGRADE # UPGRADE
#======================================= #=======================================
mark_github_unavailable() {
GITHUB_UNAVAILABLE="1"
}
get_url_branch() {
local branch="$1"
local path="$2"
if [[ -n "$GITHUB_UNAVAILABLE" ]]; then
echo "${GITEA_BASE_URL}/${branch}/${path}"
else
echo "${GITHUB_BASE_URL}/${branch}/${path}"
fi
}
get_url() {
get_url_branch "$UPDATE_CHANNEL" "$1"
}
download_file() {
local label="$1"
local target="$2"
local path="$3"
local branch="${4:-$UPDATE_CHANNEL}"
local url=$(get_url_branch "$branch" "$path")
if ! curl -fsSL -o "$target" "$url" 2>>"$LOGTO"; then
if [[ -z "$GITHUB_UNAVAILABLE" ]]; then
mark_github_unavailable
url=$(get_url_branch "$branch" "$path")
ohai "GitHub failed, retrying with Gitea ($label)..."
curl -fsSL -o "$target" "$url" 2>>"$LOGTO"
else
return 1
fi
fi
}
download_if_not_exists() { download_if_not_exists() {
if [[ -f $2 ]]; then local label="$1"
msgok "Found $1" local target="$2"
local path="$3"
local branch="${4:-$UPDATE_CHANNEL}"
if [[ -f "$target" ]]; then
msgok "Found $label"
else else
ohai "Downloading $1..." ohai "Downloading $label..."
curl -fsSL -o "$2" "$3" if download_file "$label" "$target" "$path" "$branch"; then
msgcheck "Downloaded $1" msgcheck "Downloaded $label"
else
msgerr "Failed to download $label"
return 1
fi
fi fi
} }
download_conf() { download_conf() {
download_if_not_exists "deployment config" "$ENV_FILE_DEP" "https://gitea.dzienia.pl/shared/mikrus-installer/raw/branch/$UPDATE_CHANNEL/templates/deployment.env" download_if_not_exists "deployment config" "$ENV_FILE_DEP" "templates/deployment.env"
download_if_not_exists "nightscout config" "$ENV_FILE_NS" "https://gitea.dzienia.pl/shared/mikrus-installer/raw/branch/$UPDATE_CHANNEL/templates/nightscout.env" download_if_not_exists "nightscout config" "$ENV_FILE_NS" "templates/nightscout.env"
download_if_not_exists "docker compose file" "$DOCKER_COMPOSE_FILE" "https://gitea.dzienia.pl/shared/mikrus-installer/raw/branch/$UPDATE_CHANNEL/templates/docker-compose.yml" download_if_not_exists "docker compose file" "$DOCKER_COMPOSE_FILE" "templates/docker-compose.yml"
download_if_not_exists "profanity database" "$PROFANITY_DB_FILE" "https://gitea.dzienia.pl/shared/mikrus-installer/raw/branch/profanity/templates/profanity.db" download_if_not_exists "profanity database" "$PROFANITY_DB_FILE" "templates/profanity.db" "profanity"
download_if_not_exists "reservation database" "$RESERVED_DB_FILE" "https://gitea.dzienia.pl/shared/mikrus-installer/raw/branch/profanity/templates/reserved.db" download_if_not_exists "reservation database" "$RESERVED_DB_FILE" "templates/reserved.db" "profanity"
} }
download_tools() { download_tools() {
download_if_not_exists "update stamp" "$UPDATES_DIR/updated" "https://gitea.dzienia.pl/shared/mikrus-installer/raw/branch/$UPDATE_CHANNEL/updated" download_if_not_exists "update stamp" "$UPDATES_DIR/updated" "updated"
if ! [[ -f $TOOL_FILE ]]; then if ! [[ -f "$TOOL_FILE" ]]; then
download_if_not_exists "nightscout-tool file" "$TOOL_FILE" "https://gitea.dzienia.pl/shared/mikrus-installer/raw/branch/$UPDATE_CHANNEL/install.sh" download_if_not_exists "nightscout-tool file" "$TOOL_FILE" "install.sh"
local timestamp=$(date +%s) local timestamp=$(date +%s)
echo "$timestamp" >"$UPDATES_DIR/timestamp" echo "$timestamp" >"$UPDATES_DIR/timestamp"
else else
msgok "Found nightscout-tool" msgok "Found nightscout-tool"
fi fi
if ! [[ -f $TOOL_LINK ]]; then if ! [[ -f "$TOOL_LINK" ]]; then
ohai "Linking nightscout-tool" ohai "Linking nightscout-tool"
ln -s "$TOOL_FILE" "$TOOL_LINK" ln -s "$TOOL_FILE" "$TOOL_LINK"
fi fi
@ -1658,14 +1835,24 @@ download_tools() {
download_updates() { download_updates() {
ohai "Downloading updated scripts and config files" ohai "Downloading updated scripts and config files"
local onlineUpdated="$(curl -fsSL "https://gitea.dzienia.pl/shared/mikrus-installer/raw/branch/$UPDATE_CHANNEL/updated")"
local url=$(get_url "updated")
local onlineUpdated=$(curl -fsSL "$url" 2>>"$LOGTO")
if [[ -z "$onlineUpdated" && -z "$GITHUB_UNAVAILABLE" ]]; then
mark_github_unavailable
url=$(get_url "updated")
ohai "GitHub failed, retrying with Gitea (update check)..."
onlineUpdated=$(curl -fsSL "$url" 2>>"$LOGTO")
fi
if [ ! "$onlineUpdated" == "" ]; then if [ ! "$onlineUpdated" == "" ]; then
curl -fsSL -o "$UPDATES_DIR/install.sh" "https://gitea.dzienia.pl/shared/mikrus-installer/raw/branch/$UPDATE_CHANNEL/install.sh" download_file "install script" "$UPDATES_DIR/install.sh" "install.sh"
curl -fsSL -o "$UPDATES_DIR/deployment.env" "https://gitea.dzienia.pl/shared/mikrus-installer/raw/branch/$UPDATE_CHANNEL/templates/deployment.env" download_file "deployment info" "$UPDATES_DIR/deployment.env" "templates/deployment.env"
curl -fsSL -o "$UPDATES_DIR/nightscout.env" "https://gitea.dzienia.pl/shared/mikrus-installer/raw/branch/$UPDATE_CHANNEL/templates/nightscout.env" download_file "nightscout info" "$UPDATES_DIR/nightscout.env" "templates/nightscout.env"
curl -fsSL -o "$UPDATES_DIR/docker-compose.yml" "https://gitea.dzienia.pl/shared/mikrus-installer/raw/branch/$UPDATE_CHANNEL/templates/docker-compose.yml" download_file "docker compose" "$UPDATES_DIR/docker-compose.yml" "templates/docker-compose.yml"
curl -fsSL -o "$PROFANITY_DB_FILE" "https://gitea.dzienia.pl/shared/mikrus-installer/raw/branch/profanity/templates/profanity.db" download_file "profanity db" "$PROFANITY_DB_FILE" "templates/profanity.db" "profanity"
curl -fsSL -o "$RESERVED_DB_FILE" "https://gitea.dzienia.pl/shared/mikrus-installer/raw/branch/profanity/templates/reserved.db" download_file "reserved db" "$RESERVED_DB_FILE" "templates/reserved.db" "profanity"
else else
onlineUpdated="error" onlineUpdated="error"
fi fi
@ -1680,7 +1867,16 @@ download_if_needed() {
if (((timestampNow - lastCheck) > updateCheck)) || [ "$lastDownload" == "" ] || [ "$lastDownload" == "error" ] || ((forceUpdateCheck == 1)) || [ $# -eq 1 ]; then if (((timestampNow - lastCheck) > updateCheck)) || [ "$lastDownload" == "" ] || [ "$lastDownload" == "error" ] || ((forceUpdateCheck == 1)) || [ $# -eq 1 ]; then
echo "$timestampNow" >"$UPDATES_DIR/timestamp" echo "$timestampNow" >"$UPDATES_DIR/timestamp"
ohai "Checking if new version is available..." ohai "Checking if new version is available..."
local onlineUpdated="$(curl -fsSL "https://gitea.dzienia.pl/shared/mikrus-installer/raw/branch/$UPDATE_CHANNEL/updated")" local url=$(get_url "updated")
local onlineUpdated=$(curl -fsSL "$url" 2>>"$LOGTO")
if [[ -z "$onlineUpdated" && -z "$GITHUB_UNAVAILABLE" ]]; then
mark_github_unavailable
url=$(get_url "updated")
ohai "GitHub failed, retrying with Gitea (version check)..."
onlineUpdated=$(curl -fsSL "$url" 2>>"$LOGTO")
fi
local lastDownload=$(read_or_default "$UPDATES_DIR/downloaded") local lastDownload=$(read_or_default "$UPDATES_DIR/downloaded")
if [ "$onlineUpdated" == "$lastDownload" ] && ((forceUpdateCheck == 0)); then if [ "$onlineUpdated" == "$lastDownload" ] && ((forceUpdateCheck == 0)); then
msgok "Latest update already downloaded" msgok "Latest update already downloaded"
@ -1692,40 +1888,6 @@ download_if_needed() {
fi fi
} }
update_background_check() {
download_if_needed
local lastDownload=$(read_or_default "$UPDATES_DIR/downloaded" "")
local updateInstalled=$(read_or_default "$UPDATES_DIR/updated" "")
if [ ! "$lastDownload" == "$updateInstalled" ] && [ ! "$lastDownload" == "" ] && [ ! "$lastDownload" == "error" ]; then
echo "Update needed"
local lastCalled=$(get_since_last_time "update_needed")
if ((lastCalled == -1)) || ((lastCalled > UPDATE_MAIL)); then
set_last_time "update_needed"
echo "Sending mail to user - tool update needed"
{
echo "✨ Na Twoim serwerze mikr.us z Nightscoutem można zaktualizować narzędzie nightscout-tool!"
echo " "
echo "🐕 Watchdog wykrył że dostępna jest nowa aktualizacja nightscout-tool."
echo "Na Twoim serwerze zainstalowana jest starsza wersja narzędzia - zaktualizuj go by poprawić stabilność systemu i uzyskać dostęp do nowych funkcji."
echo " "
echo "Aby zaktualizować narzędzie:"
echo " "
echo "1. Zaloguj się do panelu administracyjnego mikrusa i zaloguj się do WebSSH:"
echo " https://mikr.us/panel/?a=webssh"
echo " "
echo "2. Uruchom narzędzie komendą:"
echo " nightscout-tool"
echo " "
echo "3. Potwierdź naciskając przycisk:"
echo " 【 Aktualizacja 】"
echo " "
} | pusher "✨_Na_Twoim_serwerze_Nightscout_dostępna_jest_aktualizacja"
fi
fi
}
#======================================= #=======================================
@ -1864,6 +2026,14 @@ retry_diagnostics() {
# APP LOGIC # APP LOGIC
#======================================= #=======================================
update_logto() {
if [[ "$UPDATE_CHANNEL" == "develop" || "$FORCE_DEBUG_LOG" == "1" ]]; then
LOGTO="$DEBUG_LOG_FILE"
else
LOGTO=/dev/null
fi
}
get_td_domain() { get_td_domain() {
local MHOST=$(hostname) local MHOST=$(hostname)
if ! [[ "$MHOST" =~ [a-zA-Z]{2,16}[0-9]{3} ]]; then if ! [[ "$MHOST" =~ [a-zA-Z]{2,16}[0-9]{3} ]]; then
@ -1890,7 +2060,7 @@ get_domain_status() {
load_update_channel() { load_update_channel() {
if [[ -f $UPDATE_CHANNEL_FILE ]]; then if [[ -f $UPDATE_CHANNEL_FILE ]]; then
UPDATE_CHANNEL=$(cat "$UPDATE_CHANNEL_FILE") UPDATE_CHANNEL=$(cat "$UPDATE_CHANNEL_FILE")
msgok "Loaded update channel: $UPDATE_CHANNEL" update_logto
fi fi
} }
@ -1900,6 +2070,15 @@ startup_version() {
msgnote "build ${updateInstalled}" msgnote "build ${updateInstalled}"
msgnote "$uni_copyright 2023-2026 Dominik Dzienia" msgnote "$uni_copyright 2023-2026 Dominik Dzienia"
msgnote "Licensed under CC BY-NC-ND 4.0" msgnote "Licensed under CC BY-NC-ND 4.0"
if [[ -f $UPDATE_CHANNEL_FILE ]]; then
msgok "Loaded update channel: $UPDATE_CHANNEL"
fi
}
startup_debug() {
if [[ "$UPDATE_CHANNEL" == "develop" || "$FORCE_DEBUG_LOG" == "1" ]]; then
msgdebug "Debug logging enabled - see: $DEBUG_LOG_FILE"
fi
} }
@ -2337,16 +2516,78 @@ mail_restart_needed() {
} | pusher "🛟_Twoj_serwer_Nightscout_potrzebuje_ręcznego_restartu!" } | pusher "🛟_Twoj_serwer_Nightscout_potrzebuje_ręcznego_restartu!"
} }
update_background_check() {
download_if_needed
local lastDownload=$(read_or_default "$UPDATES_DIR/downloaded" "")
local updateInstalled=$(read_or_default "$UPDATES_DIR/updated" "")
if [ ! "$lastDownload" == "$updateInstalled" ] && [ ! "$lastDownload" == "" ] && [ ! "$lastDownload" == "error" ]; then
echo "Update needed"
local lastCalled=$(get_since_last_time "update_needed")
if ((lastCalled == -1)) || ((lastCalled > UPDATE_MAIL)); then
set_last_time "update_needed"
echo "Sending mail to user - tool update needed"
{
echo "✨ Na Twoim serwerze mikr.us z Nightscoutem można zaktualizować narzędzie nightscout-tool!"
echo " "
echo "🐕 Watchdog wykrył że dostępna jest nowa aktualizacja nightscout-tool."
echo "Na Twoim serwerze zainstalowana jest starsza wersja narzędzia - zaktualizuj go by poprawić stabilność systemu i uzyskać dostęp do nowych funkcji."
echo " "
echo "Aby zaktualizować narzędzie:"
echo " "
echo "1. Zaloguj się do panelu administracyjnego mikrusa i zaloguj się do WebSSH:"
echo " https://mikr.us/panel/?a=webssh"
echo " "
echo "2. Uruchom narzędzie komendą:"
echo " nightscout-tool"
echo " "
echo "3. Potwierdź naciskając przycisk:"
echo " 【 Aktualizacja 】"
echo " "
} | pusher "✨_Na_Twoim_serwerze_Nightscout_dostępna_jest_aktualizacja"
fi
fi
}
#======================================= #=======================================
# COMMANDLINE PARSER # COMMANDLINE PARSER
#======================================= #=======================================
help() {
cat <<EOF
Usage: nightscout-tool [options]
Description:
Nightscout-tool is a command-line tool for managing Nightscout.
In UI mode, tool provides a menu-driven interface for managing
Nightscout server, its configuration, updates, cleanup, and diagnostics.
In watchdog mode, it can be used to monitor the status of Nightscout
and send an email alert if the service is down.
Options:
-w, --watchdog Run in watchdog mode
-v, --version Show version
-l, --loud Enable debug logging
-d, --develop Switch to DEVELOP update channel
-p, --production Switch to PRODUCTION update channel
-u, --update Force update check
-c, --channel Switch to specified update channel
-s, --cleanup Perform cleanup
-h, --help Show this help message
EOF
}
parse_commandline_args() { parse_commandline_args() {
load_update_channel load_update_channel
CMDARGS=$(getopt --quiet -o wvdpuc: --long watchdog,version,develop,production,update,channel: -n 'nightscout-tool' -- "$@") CMDARGS=$(getopt --quiet -o wvldpuc:sh --long watchdog,version,loud,develop,production,update,channel:,cleanup,help -n 'nightscout-tool' -- "$@")
# shellcheck disable=SC2181 # shellcheck disable=SC2181
if [ $? != 0 ]; then if [ $? != 0 ]; then
@ -2358,21 +2599,30 @@ parse_commandline_args() {
eval set -- "$CMDARGS" eval set -- "$CMDARGS"
WATCHDOGMODE=false WATCHDOGMODE=false
NONINTERACTIVE_MODE=false
while true; do while true; do
case "$1" in case "$1" in
-w | --watchdog) -w | --watchdog)
WATCHDOGMODE=true WATCHDOGMODE=true
NONINTERACTIVE_MODE=true
shift shift
;; ;;
-v | --version) -v | --version)
echo "$SCRIPT_VERSION" echo "$SCRIPT_VERSION"
exit 0 exit 0
;; ;;
-l | --loud)
warn "Loud mode, enabling debug logging"
FORCE_DEBUG_LOG="1"
update_logto
shift
;;
-d | --develop) -d | --develop)
warn "Switching to DEVELOP update channel" warn "Switching to DEVELOP update channel"
UPDATE_CHANNEL=develop UPDATE_CHANNEL=develop
forceUpdateCheck=1 forceUpdateCheck=1
echo "$UPDATE_CHANNEL" >"$UPDATE_CHANNEL_FILE" echo "$UPDATE_CHANNEL" >"$UPDATE_CHANNEL_FILE"
update_logto
shift shift
;; ;;
-p | --production) -p | --production)
@ -2380,6 +2630,7 @@ parse_commandline_args() {
UPDATE_CHANNEL=master UPDATE_CHANNEL=master
forceUpdateCheck=1 forceUpdateCheck=1
echo "$UPDATE_CHANNEL" >"$UPDATE_CHANNEL_FILE" echo "$UPDATE_CHANNEL" >"$UPDATE_CHANNEL_FILE"
update_logto
shift shift
;; ;;
-u | --update) -u | --update)
@ -2400,8 +2651,18 @@ parse_commandline_args() {
warn "Switching to $UPDATE_CHANNEL_CANDIDATE update channel" warn "Switching to $UPDATE_CHANNEL_CANDIDATE update channel"
UPDATE_CHANNEL="$UPDATE_CHANNEL_CANDIDATE" UPDATE_CHANNEL="$UPDATE_CHANNEL_CANDIDATE"
echo "$UPDATE_CHANNEL" >"$UPDATE_CHANNEL_FILE" echo "$UPDATE_CHANNEL" >"$UPDATE_CHANNEL_FILE"
update_logto
shift shift
;; ;;
-s | --cleanup)
NONINTERACTIVE_MODE=true
do_cleanup_all
exit 0
;;
-h | --help)
help
exit 0
;;
--) --)
shift shift
break break
@ -2411,6 +2672,8 @@ parse_commandline_args() {
done done
if [ "$WATCHDOGMODE" = "true" ]; then if [ "$WATCHDOGMODE" = "true" ]; then
startup_version
startup_debug
watchdog_check watchdog_check
fi fi
@ -2440,7 +2703,7 @@ show_watchdog_logs() {
{ {
echo "Ostatnie uruchomienie watchdoga:" echo "Ostatnie uruchomienie watchdoga:"
get_watchdog_age_string get_watchdog_age_string
echo "-------------------------------------------------------" hline
if [[ -f $WATCHDOG_LOG_FILE ]]; then if [[ -f $WATCHDOG_LOG_FILE ]]; then
echo "Statusy ostatnich przebiegów watchdoga:" echo "Statusy ostatnich przebiegów watchdoga:"
@ -2448,7 +2711,7 @@ show_watchdog_logs() {
else else
echo "Brak logów z ostatnich przebiegów watchdoga" echo "Brak logów z ostatnich przebiegów watchdoga"
fi fi
echo "-------------------------------------------------------" hline
if [[ -f $WATCHDOG_CRON_LOG ]]; then if [[ -f $WATCHDOG_CRON_LOG ]]; then
echo "Log ostatniego przebiegu watchdoga:" echo "Log ostatniego przebiegu watchdoga:"
@ -3209,26 +3472,6 @@ install_or_menu() {
#=======================================
# ACTIONS AND STEPS
#=======================================
@ -3237,8 +3480,9 @@ install_or_menu() {
# MAIN SCRIPT # MAIN SCRIPT
#======================================= #=======================================
startup_version
parse_commandline_args "$@" parse_commandline_args "$@"
startup_version
startup_debug
# check_interactive # check_interactive
check_git check_git
check_docker check_docker

@ -71,7 +71,7 @@ cleanup_stats() {
local remainingTxt=$(echo "$spaceInfo" | awk '{print $3}' | numfmt --to iec-i --suffix=B) local remainingTxt=$(echo "$spaceInfo" | awk '{print $3}' | numfmt --to iec-i --suffix=B)
local totalTxt=$(echo "$spaceInfo" | awk '{print $2}' | numfmt --to iec-i --suffix=B) local totalTxt=$(echo "$spaceInfo" | awk '{print $2}' | numfmt --to iec-i --suffix=B)
local percTxt=$(echo "$spaceInfo" | awk '{print $4}') local percTxt=$(echo "$spaceInfo" | awk '{print $4}')
local fixedPerc=${percTxt/[%]/=} local fixedPerc=$percTxt
local nowB=$(echo "$spaceInfo" | awk '{print $3}') local nowB=$(echo "$spaceInfo" | awk '{print $3}')
local lastTimeB=$(echo "$lastTimeSpaceInfo" | awk '{print $3}') local lastTimeB=$(echo "$lastTimeSpaceInfo" | awk '{print $3}')
@ -82,25 +82,19 @@ cleanup_stats() {
savedTxt="---" savedTxt="---"
fi fi
local statusTitle="\n$(center_multiline 45 "$( hline
pad_multiline \ printf " Dostępne: %s\n Zwolniono: %s\n Zajęte: %s (z %s)\n" "${remainingTxt}" "${savedTxt}" "${fixedPerc}" "${totalTxt}"
" Dostępne: ${remainingTxt}" \ hline
"\n Zwolniono: ${savedTxt}" \
"\n Zajęte: ${fixedPerc} (z ${totalTxt})"
)")\n"
hline
echo "${statusTitle/=/%}"
hline
} }
do_cleanup_all() { do_cleanup_all() {
echo "Cleanup" echo "Sprzątanie..."
hline lastTimeSpaceInfo=$(get_space_info)
hline
do_cleanup_container_logs do_cleanup_container_logs
do_cleanup_sys do_cleanup_sys
do_cleanup_docker do_cleanup_docker
do_cleanup_db do_cleanup_db
do_cleanup_diagnostics do_cleanup_diagnostics
cleanup_stats cleanup_stats
} }

@ -78,9 +78,9 @@ msgdebug() {
hline() { hline() {
if [ "$NONINTERACTIVE_MODE" = "true" ]; then if [ "$NONINTERACTIVE_MODE" = "true" ]; then
printf "-------------------------------------------------------\n" printf "%s\n" "-------------------------------------------------------"
else else
printf "${tty_bold}-------------------------------------------------------${tty_reset}\n" printf "${tty_bold}%s${tty_reset}\n" "-------------------------------------------------------"
fi fi
} }

@ -1 +1 @@
2026-01-05T21:19:43.286Z 2026-01-06T01:30:06.751Z
Loading…
Cancel
Save