Add size checking and retry for diagnostics

previous
Dominik Dzienia 9 months ago committed by dominik
parent b26ff0c2a7
commit f7cffdf5cc

@ -428,6 +428,7 @@ aptGetWasUpdated=0
freshInstall=0 freshInstall=0
cachedMenuDomain='' cachedMenuDomain=''
lastTimeSpaceInfo=0 lastTimeSpaceInfo=0
diagnosticsSizeOk=0
MIKRUS_APIKEY='' MIKRUS_APIKEY=''
MIKRUS_HOST='' MIKRUS_HOST=''
@ -1499,22 +1500,22 @@ do_cleanup_sys() {
ohai "Sprzątanie dziennik systemowego..." ohai "Sprzątanie dziennik systemowego..."
journalctl --vacuum-size=50M >>$LOGTO 2>&1 journalctl --vacuum-size=50M >>$LOGTO 2>&1
ohai "Czyszczenie systemu apt..." ohai "Czyszczenie systemu apt..."
msgnote "Ta operacja może TROCHĘ potrwać (od kilku do kilkudziesięciu minut...)" msgnote "Ta operacja może TROCHĘ potrwać (od kilku do kilkudziesięciu minut...)"
apt-get -y autoremove >>$LOGTO 2>&1 && apt-get -y clean >>$LOGTO 2>&1 apt-get -y autoremove >>$LOGTO 2>&1 && apt-get -y clean >>$LOGTO 2>&1
msgcheck "Czyszczenie dziennika i apt zakończono" msgcheck "Czyszczenie dziennika i apt zakończono"
} }
do_cleanup_docker() { do_cleanup_docker() {
ohai "Usuwanie nieużywanych obrazów Dockera..." ohai "Usuwanie nieużywanych obrazów Dockera..."
msgnote "Ta operacja może TROCHĘ potrwać (do kilku minut...)" msgnote "Ta operacja może TROCHĘ potrwać (do kilku minut...)"
docker image prune -af >>$LOGTO 2>&1 docker image prune -af >>$LOGTO 2>&1
msgcheck "Czyszczenie Dockera zakończono" msgcheck "Czyszczenie Dockera zakończono"
} }
do_cleanup_db() { do_cleanup_db() {
ohai "Usuwanie kopii zapasowych bazy danych..." ohai "Usuwanie kopii zapasowych bazy danych..."
find /srv/nightscout/data/dbbackup ! -type d -delete find /srv/nightscout/data/dbbackup ! -type d -delete
msgcheck "Czyszczenie kopii zapasowych zakończono" msgcheck "Czyszczenie kopii zapasowych zakończono"
} }
cleanup_menu() { cleanup_menu() {
@ -1532,7 +1533,7 @@ cleanup_menu() {
local savedB=$((nowB - lastTimeB)) local savedB=$((nowB - lastTimeB))
local savedTxt=$(echo "$savedB" | numfmt --to iec-i --suffix=B) local savedTxt=$(echo "$savedB" | numfmt --to iec-i --suffix=B)
if (( savedB < 1)); then if ((savedB < 1)); then
savedTxt="---" savedTxt="---"
fi fi
@ -1559,10 +1560,10 @@ cleanup_menu() {
noyesdlg "Posprzątać wszystko?" "$uni_confirm_del" "$uni_resign" \ noyesdlg "Posprzątać wszystko?" "$uni_confirm_del" "$uni_resign" \
"Czy chcesz posprzątać i usunąć:" \ "Czy chcesz posprzątać i usunąć:" \
"$(pad_multiline \ "$(pad_multiline \
"${NL}${uni_bullet}nieużywane pliki apt i dziennika" \ "${NL}${uni_bullet}nieużywane pliki apt i dziennika" \
"${NL}${uni_bullet}nieużywane obrazy Dockera" \ "${NL}${uni_bullet}nieużywane obrazy Dockera" \
"${NL} ${uni_bullet}kopie zapasowe bazy danych")" \ "${NL} ${uni_bullet}kopie zapasowe bazy danych")" \
"${TL}(ta operacja może potrwać od kilku do kilkudziesięciu minut)" "${TL}(ta operacja może potrwać od kilku do kilkudziesięciu minut)"
if ! [ $? -eq 1 ]; then if ! [ $? -eq 1 ]; then
do_cleanup_sys do_cleanup_sys
do_cleanup_docker do_cleanup_docker
@ -1572,7 +1573,7 @@ cleanup_menu() {
"S)") "S)")
noyesdlg "Posprzątać zasoby systemowe?" "$uni_confirm_del" "$uni_resign" \ noyesdlg "Posprzątać zasoby systemowe?" "$uni_confirm_del" "$uni_resign" \
"Czy chcesz usunąć nieużywane pakiety apt i poprzątać dziennik systemowy?" \ "Czy chcesz usunąć nieużywane pakiety apt i poprzątać dziennik systemowy?" \
"${TL}(ta operacja może potrwać od kilku do kilkudziesięciu minut)" "${TL}(ta operacja może potrwać od kilku do kilkudziesięciu minut)"
if ! [ $? -eq 1 ]; then if ! [ $? -eq 1 ]; then
do_cleanup_sys do_cleanup_sys
fi fi
@ -1580,7 +1581,7 @@ cleanup_menu() {
"D)") "D)")
noyesdlg "Posprzątać obrazy Dockera?" "$uni_confirm_del" "$uni_resign" \ noyesdlg "Posprzątać obrazy Dockera?" "$uni_confirm_del" "$uni_resign" \
"Czy chcesz usunąć nieużywane obrazy Dockera?" \ "Czy chcesz usunąć nieużywane obrazy Dockera?" \
"${TL}(ta operacja może potrwać kilka minut)" "${TL}(ta operacja może potrwać kilka minut)"
if ! [ $? -eq 1 ]; then if ! [ $? -eq 1 ]; then
do_cleanup_docker do_cleanup_docker
fi fi
@ -1606,8 +1607,8 @@ cleanup_menu() {
update_menu() { update_menu() {
while :; do while :; do
local CHOICE=$(whiptail --title "Aktualizuj" --menu "\n" 11 40 4 \ local CHOICE=$(whiptail --title "Aktualizuj" --menu "\n" 11 40 4 \
"S)" "Aktualizuj system" \
"N)" "Aktualizuj to narzędzie" \ "N)" "Aktualizuj to narzędzie" \
"S)" "Aktualizuj system" \
"K)" "Aktualizuj kontenery" \ "K)" "Aktualizuj kontenery" \
"M)" "Powrót do menu" \ "M)" "Powrót do menu" \
--ok-button="$uni_select" --cancel-button="$uni_back" \ --ok-button="$uni_select" --cancel-button="$uni_back" \
@ -1755,115 +1756,153 @@ get_domain_status() {
fi fi
} }
send_diagnostics() { gather_diagnostics() {
LOG_KEY=$(<$LOG_ENCRYPTION_KEY_FILE)
yesnodlg "Wysyłać diagnostykę?" \ local maxNsLogs=$1
"$uni_send" "$uni_resign" \ local maxDbLogs=$2
"Czy chcesz zgromadzić i wysłać sobie mailem dane diagnostyczne?" \ local curr_time=$3
"\n$(
pad_multiline \
"\n${uni_bullet}diagnostyka zawiera logi i informacje o serwerze i usługach" \
"\n${uni_bullet}wysyłka na e-mail na który zamówiono serwer Mikr.us" \
"\n${uni_bullet}dane będą skompresowane i zaszyfrowane" \
"\n${uni_bullet}maila prześlij dalej do zaufanej osoby wspierającej" \
"\n${uni_bullet_pad}(z którą to wcześniej zaplanowano i uzgodniono!!!)" \
"\n${uni_bullet}hasło przekaż INNĄ DROGĄ (komunikatorem, SMSem, osobiście)" \
"\n\n${uni_bullet_pad}Hasło do logów: $LOG_KEY"
)"
if ! [ $? -eq 1 ]; then diagnosticsSizeOk=0
ohai "Zbieranie diagnostyki" ohai "Zbieranie diagnostyki"
local domain=$(get_td_domain) local domain=$(get_td_domain)
local curr_time=$(date -u +"%Y-%m-%dT%H:%M:%SZ") local ns_tag=$(dotenv-tool -r get -f $ENV_FILE_DEP "NS_NIGHTSCOUT_TAG")
local ns_tag=$(dotenv-tool -r get -f $ENV_FILE_DEP "NS_NIGHTSCOUT_TAG") local mikrus_h=$(hostname)
local mikrus_h=$(hostname)
local LOG_DIVIDER="=======================================================" local LOG_DIVIDER="======================================================="
rm -f $SUPPORT_LOG rm -f $SUPPORT_LOG
rm -f "$SUPPORT_LOG.gz" rm -f "$SUPPORT_LOG.gz"
rm -f "$SUPPORT_LOG.gz.asc" rm -f "$SUPPORT_LOG.gz.asc"
{ {
echo "Dane diagnostyczne zebrane $curr_time" echo "Dane diagnostyczne zebrane $curr_time"
echo " serwer : $mikrus_h" echo " serwer : $mikrus_h"
echo " domena : $domain" echo " domena : $domain"
echo " wersja NS : $ns_tag" echo " wersja NS : $ns_tag"
} >$SUPPORT_LOG } >$SUPPORT_LOG
ohai "Zbieranie statusu usług"
ohai "Zbieranie statusu usług" {
echo "$LOG_DIVIDER"
echo " Statusy usług"
echo "$LOG_DIVIDER"
echo " Nightscout: $(get_container_status 'ns-server')"
echo " Baza danych: $(get_container_status 'ns-database')"
echo " Backup: $(get_container_status 'ns-backup')"
echo " Watchdog: $(get_watchdog_status "$(get_watchdog_status_code)" "$uni_watchdog_ok")"
} >>$SUPPORT_LOG
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}')
{
echo "$LOG_DIVIDER"
echo " Miejsce na dysku"
echo "$LOG_DIVIDER"
echo " Dostępne: ${remainingTxt}"
echo " Zajęte: ${percTxt} (z ${totalTxt})"
} >>$SUPPORT_LOG
ohai "Zbieranie logów watchdoga"
if [[ -f $WATCHDOG_LOG_FILE ]]; then
{ {
echo "$LOG_DIVIDER" echo "$LOG_DIVIDER"
echo " Statusy usług" echo " Watchdog log"
echo "$LOG_DIVIDER" echo "$LOG_DIVIDER"
echo " Nightscout: $(get_container_status 'ns-server')" timeout -k 15 10 cat $WATCHDOG_LOG_FILE
echo " Baza danych: $(get_container_status 'ns-database')"
echo " Backup: $(get_container_status 'ns-backup')"
echo " Watchdog: $(get_watchdog_status "$(get_watchdog_status_code)" "$uni_watchdog_ok")"
} >>$SUPPORT_LOG } >>$SUPPORT_LOG
fi
ohai "Zbieranie informacji o zasobach" if [[ -f $WATCHDOG_FAILURES_FILE ]]; then
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}')
{ {
echo "$LOG_DIVIDER" echo "$LOG_DIVIDER"
echo " Miejsce na dysku" echo " Watchdog failures log"
echo "$LOG_DIVIDER" echo "$LOG_DIVIDER"
echo " Dostępne: ${remainingTxt}" timeout -k 15 10 cat $WATCHDOG_FAILURES_FILE
echo " Zajęte: ${percTxt} (z ${totalTxt})"
} >>$SUPPORT_LOG } >>$SUPPORT_LOG
fi
ohai "Zbieranie logów watchdoga" ohai "Zbieranie logów usług"
if [[ -f $WATCHDOG_LOG_FILE ]]; then {
{ echo "$LOG_DIVIDER"
echo "$LOG_DIVIDER" echo " Nightscout log"
echo " Watchdog log" echo "$LOG_DIVIDER"
echo "$LOG_DIVIDER" timeout -k 15 10 docker logs ns-server --tail "$maxNsLogs" >>$SUPPORT_LOG 2>&1
timeout -k 15 10 cat $WATCHDOG_LOG_FILE echo "$LOG_DIVIDER"
} >>$SUPPORT_LOG echo " MongoDB database log"
fi echo "$LOG_DIVIDER"
timeout -k 15 10 docker logs ns-database --tail "$maxDbLogs" >>$SUPPORT_LOG 2>&1
} >>$SUPPORT_LOG
if [[ -f $WATCHDOG_FAILURES_FILE ]]; then ohai "Kompresowanie i szyfrowanie raportu"
{
echo "$LOG_DIVIDER"
echo " Watchdog failures log"
echo "$LOG_DIVIDER"
timeout -k 15 10 cat $WATCHDOG_FAILURES_FILE
} >>$SUPPORT_LOG
fi
ohai "Zbieranie logów usług" gzip -9 $SUPPORT_LOG
{ local logkey=$(<$LOG_ENCRYPTION_KEY_FILE)
echo "$LOG_DIVIDER"
echo " Nightscout log" gpg --passphrase "$logkey" --batch --quiet --yes -a -c "$SUPPORT_LOG.gz"
echo "$LOG_DIVIDER" }
timeout -k 15 10 docker logs ns-server --tail 500 >>$SUPPORT_LOG 2>&1
echo "$LOG_DIVIDER" retry_diagnostics() {
echo " MongoDB database log" local maxNsLogs=$1
echo "$LOG_DIVIDER" local maxDbLogs=$2
timeout -k 15 10 docker logs ns-database --tail 100 >>$SUPPORT_LOG 2>&1 local curr_time=$3
} >>$SUPPORT_LOG
if ((diagnosticsSizeOk == 0)); then
ohai "Sprawdzanie rozmiaru raportu"
local logSize=$(stat --printf="%s" "$SUPPORT_LOG.gz.asc")
local allowedTxt=$(echo "18000" | numfmt --to si --suffix=B)
local currentTxt=$(echo "$logSize" | numfmt --to si --suffix=B)
if ((logSize > 18000)); then
msgerr "Zebrana diagnostyka jest zbyt duża do wysłania (${currentTxt})"
ohai "Spróbuję zebrać mniej danych aby zmieścić się w limicie (${allowedTxt})"
gather_diagnostics "$maxNsLogs" "$maxDbLogs" "$curr_time"
else
diagnosticsSizeOk=1
msgok "Raport ma rozmiar ${currentTxt} i mieści się w limicie ${allowedTxt} dla usługi pusher-a"
fi
fi
}
send_diagnostics() {
LOG_KEY=$(<$LOG_ENCRYPTION_KEY_FILE)
ohai "Kompresowanie i szyfrowanie raportu" yesnodlg "Wysyłać diagnostykę?" \
"$uni_send" "$uni_resign" \
"Czy chcesz zgromadzić i wysłać sobie mailem dane diagnostyczne?" \
"\n$(
pad_multiline \
"\n${uni_bullet}diagnostyka zawiera logi i informacje o serwerze i usługach" \
"\n${uni_bullet}wysyłka na e-mail na który zamówiono serwer Mikr.us" \
"\n${uni_bullet}dane będą skompresowane i zaszyfrowane" \
"\n${uni_bullet}maila prześlij dalej do zaufanej osoby wspierającej" \
"\n${uni_bullet_pad}(z którą to wcześniej zaplanowano i uzgodniono!!!)" \
"\n${uni_bullet}hasło przekaż INNĄ DROGĄ (komunikatorem, SMSem, osobiście)" \
"\n\n${uni_bullet_pad}Hasło do logów: $LOG_KEY"
)"
gzip $SUPPORT_LOG if ! [ $? -eq 1 ]; then
local logkey=$(<$LOG_ENCRYPTION_KEY_FILE) local curr_time=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
gpg --passphrase "$logkey" --batch --quiet --yes -a -c "$SUPPORT_LOG.gz" gather_diagnostics 500 100 "$curr_time"
retry_diagnostics 200 50 "$curr_time"
retry_diagnostics 100 50 "$curr_time"
retry_diagnostics 50 50 "$curr_time"
ohai "Wysyłanie maila" ohai "Wysyłanie maila"
{ local sentStatus=$({
echo "Ta wiadomość zawiera poufne dane diagnostyczne Twojego serwera Nightscout." echo "Ta wiadomość zawiera poufne dane diagnostyczne Twojego serwera Nightscout."
echo "Mogą one pomóc Tobie lub zaufanej osobie w identyfikacji problemu." echo "Mogą one pomóc Tobie lub zaufanej osobie w identyfikacji problemu."
echo " " echo " "
@ -1877,12 +1916,21 @@ send_diagnostics() {
echo " " echo " "
echo " " echo " "
cat "$SUPPORT_LOG.gz.asc" cat "$SUPPORT_LOG.gz.asc"
} | pusher "Diagnostyka_serwera_Nightscout_-_$curr_time" } | pusher "Diagnostyka_serwera_Nightscout_-_$curr_time")
okdlg "Diagnostyka wysłana" \ local regexEm='Email sent'
"Sprawdź swoją skrzynkę pocztową,\n" \ if [[ "$sentStatus" =~ $regexEm ]]; then
"otrzymanego maila przekaż zaufanemu wspierającemu.\n\n" \ okdlg "Diagnostyka wysłana" \
"Komunikatorem lub SMS przekaż hasło do logów:\n\n$LOG_KEY" "Sprawdź swoją skrzynkę pocztową,\n" \
"otrzymanego maila przekaż zaufanemu wspierającemu.\n\n" \
"Komunikatorem lub SMS przekaż hasło do logów:\n\n$LOG_KEY"
else
msgerr "Błąd podczas wysyłki maila: $sentStatus"
okdlg "Błąd wysyłki maila" \
"Nieststy nie udało się wysłać diagnostyki" \
"${NL}zgłoś poniższy błąd twórcom narzędzia (na grupie Technologie Diabetyka)" \
"${TL}$sentStatus"
fi
fi fi
} }

@ -412,6 +412,7 @@ aptGetWasUpdated=0
freshInstall=0 freshInstall=0
cachedMenuDomain='' cachedMenuDomain=''
lastTimeSpaceInfo=0 lastTimeSpaceInfo=0
diagnosticsSizeOk=0
MIKRUS_APIKEY='' MIKRUS_APIKEY=''
MIKRUS_HOST='' MIKRUS_HOST=''
@ -1483,22 +1484,22 @@ do_cleanup_sys() {
ohai "Sprzątanie dziennik systemowego..." ohai "Sprzątanie dziennik systemowego..."
journalctl --vacuum-size=50M >>$LOGTO 2>&1 journalctl --vacuum-size=50M >>$LOGTO 2>&1
ohai "Czyszczenie systemu apt..." ohai "Czyszczenie systemu apt..."
msgnote "Ta operacja może TROCHĘ potrwać (od kilku do kilkudziesięciu minut...)" msgnote "Ta operacja może TROCHĘ potrwać (od kilku do kilkudziesięciu minut...)"
apt-get -y autoremove >>$LOGTO 2>&1 && apt-get -y clean >>$LOGTO 2>&1 apt-get -y autoremove >>$LOGTO 2>&1 && apt-get -y clean >>$LOGTO 2>&1
msgcheck "Czyszczenie dziennika i apt zakończono" msgcheck "Czyszczenie dziennika i apt zakończono"
} }
do_cleanup_docker() { do_cleanup_docker() {
ohai "Usuwanie nieużywanych obrazów Dockera..." ohai "Usuwanie nieużywanych obrazów Dockera..."
msgnote "Ta operacja może TROCHĘ potrwać (do kilku minut...)" msgnote "Ta operacja może TROCHĘ potrwać (do kilku minut...)"
docker image prune -af >>$LOGTO 2>&1 docker image prune -af >>$LOGTO 2>&1
msgcheck "Czyszczenie Dockera zakończono" msgcheck "Czyszczenie Dockera zakończono"
} }
do_cleanup_db() { do_cleanup_db() {
ohai "Usuwanie kopii zapasowych bazy danych..." ohai "Usuwanie kopii zapasowych bazy danych..."
find /srv/nightscout/data/dbbackup ! -type d -delete find /srv/nightscout/data/dbbackup ! -type d -delete
msgcheck "Czyszczenie kopii zapasowych zakończono" msgcheck "Czyszczenie kopii zapasowych zakończono"
} }
cleanup_menu() { cleanup_menu() {
@ -1516,7 +1517,7 @@ cleanup_menu() {
local savedB=$((nowB - lastTimeB)) local savedB=$((nowB - lastTimeB))
local savedTxt=$(echo "$savedB" | numfmt --to iec-i --suffix=B) local savedTxt=$(echo "$savedB" | numfmt --to iec-i --suffix=B)
if (( savedB < 1)); then if ((savedB < 1)); then
savedTxt="---" savedTxt="---"
fi fi
@ -1543,10 +1544,10 @@ cleanup_menu() {
noyesdlg "Posprzątać wszystko?" "$uni_confirm_del" "$uni_resign" \ noyesdlg "Posprzątać wszystko?" "$uni_confirm_del" "$uni_resign" \
"Czy chcesz posprzątać i usunąć:" \ "Czy chcesz posprzątać i usunąć:" \
"$(pad_multiline \ "$(pad_multiline \
"${NL}${uni_bullet}nieużywane pliki apt i dziennika" \ "${NL}${uni_bullet}nieużywane pliki apt i dziennika" \
"${NL}${uni_bullet}nieużywane obrazy Dockera" \ "${NL}${uni_bullet}nieużywane obrazy Dockera" \
"${NL} ${uni_bullet}kopie zapasowe bazy danych")" \ "${NL} ${uni_bullet}kopie zapasowe bazy danych")" \
"${TL}(ta operacja może potrwać od kilku do kilkudziesięciu minut)" "${TL}(ta operacja może potrwać od kilku do kilkudziesięciu minut)"
if ! [ $? -eq 1 ]; then if ! [ $? -eq 1 ]; then
do_cleanup_sys do_cleanup_sys
do_cleanup_docker do_cleanup_docker
@ -1556,7 +1557,7 @@ cleanup_menu() {
"S)") "S)")
noyesdlg "Posprzątać zasoby systemowe?" "$uni_confirm_del" "$uni_resign" \ noyesdlg "Posprzątać zasoby systemowe?" "$uni_confirm_del" "$uni_resign" \
"Czy chcesz usunąć nieużywane pakiety apt i poprzątać dziennik systemowy?" \ "Czy chcesz usunąć nieużywane pakiety apt i poprzątać dziennik systemowy?" \
"${TL}(ta operacja może potrwać od kilku do kilkudziesięciu minut)" "${TL}(ta operacja może potrwać od kilku do kilkudziesięciu minut)"
if ! [ $? -eq 1 ]; then if ! [ $? -eq 1 ]; then
do_cleanup_sys do_cleanup_sys
fi fi
@ -1564,7 +1565,7 @@ cleanup_menu() {
"D)") "D)")
noyesdlg "Posprzątać obrazy Dockera?" "$uni_confirm_del" "$uni_resign" \ noyesdlg "Posprzątać obrazy Dockera?" "$uni_confirm_del" "$uni_resign" \
"Czy chcesz usunąć nieużywane obrazy Dockera?" \ "Czy chcesz usunąć nieużywane obrazy Dockera?" \
"${TL}(ta operacja może potrwać kilka minut)" "${TL}(ta operacja może potrwać kilka minut)"
if ! [ $? -eq 1 ]; then if ! [ $? -eq 1 ]; then
do_cleanup_docker do_cleanup_docker
fi fi
@ -1590,8 +1591,8 @@ cleanup_menu() {
update_menu() { update_menu() {
while :; do while :; do
local CHOICE=$(whiptail --title "Aktualizuj" --menu "\n" 11 40 4 \ local CHOICE=$(whiptail --title "Aktualizuj" --menu "\n" 11 40 4 \
"S)" "Aktualizuj system" \
"N)" "Aktualizuj to narzędzie" \ "N)" "Aktualizuj to narzędzie" \
"S)" "Aktualizuj system" \
"K)" "Aktualizuj kontenery" \ "K)" "Aktualizuj kontenery" \
"M)" "Powrót do menu" \ "M)" "Powrót do menu" \
--ok-button="$uni_select" --cancel-button="$uni_back" \ --ok-button="$uni_select" --cancel-button="$uni_back" \
@ -1739,115 +1740,153 @@ get_domain_status() {
fi fi
} }
send_diagnostics() { gather_diagnostics() {
LOG_KEY=$(<$LOG_ENCRYPTION_KEY_FILE)
yesnodlg "Wysyłać diagnostykę?" \ local maxNsLogs=$1
"$uni_send" "$uni_resign" \ local maxDbLogs=$2
"Czy chcesz zgromadzić i wysłać sobie mailem dane diagnostyczne?" \ local curr_time=$3
"\n$(
pad_multiline \
"\n${uni_bullet}diagnostyka zawiera logi i informacje o serwerze i usługach" \
"\n${uni_bullet}wysyłka na e-mail na który zamówiono serwer Mikr.us" \
"\n${uni_bullet}dane będą skompresowane i zaszyfrowane" \
"\n${uni_bullet}maila prześlij dalej do zaufanej osoby wspierającej" \
"\n${uni_bullet_pad}(z którą to wcześniej zaplanowano i uzgodniono!!!)" \
"\n${uni_bullet}hasło przekaż INNĄ DROGĄ (komunikatorem, SMSem, osobiście)" \
"\n\n${uni_bullet_pad}Hasło do logów: $LOG_KEY"
)"
if ! [ $? -eq 1 ]; then diagnosticsSizeOk=0
ohai "Zbieranie diagnostyki" ohai "Zbieranie diagnostyki"
local domain=$(get_td_domain) local domain=$(get_td_domain)
local curr_time=$(date -u +"%Y-%m-%dT%H:%M:%SZ") local ns_tag=$(dotenv-tool -r get -f $ENV_FILE_DEP "NS_NIGHTSCOUT_TAG")
local ns_tag=$(dotenv-tool -r get -f $ENV_FILE_DEP "NS_NIGHTSCOUT_TAG") local mikrus_h=$(hostname)
local mikrus_h=$(hostname)
local LOG_DIVIDER="=======================================================" local LOG_DIVIDER="======================================================="
rm -f $SUPPORT_LOG rm -f $SUPPORT_LOG
rm -f "$SUPPORT_LOG.gz" rm -f "$SUPPORT_LOG.gz"
rm -f "$SUPPORT_LOG.gz.asc" rm -f "$SUPPORT_LOG.gz.asc"
{ {
echo "Dane diagnostyczne zebrane $curr_time" echo "Dane diagnostyczne zebrane $curr_time"
echo " serwer : $mikrus_h" echo " serwer : $mikrus_h"
echo " domena : $domain" echo " domena : $domain"
echo " wersja NS : $ns_tag" echo " wersja NS : $ns_tag"
} >$SUPPORT_LOG } >$SUPPORT_LOG
ohai "Zbieranie statusu usług"
ohai "Zbieranie statusu usług" {
echo "$LOG_DIVIDER"
echo " Statusy usług"
echo "$LOG_DIVIDER"
echo " Nightscout: $(get_container_status 'ns-server')"
echo " Baza danych: $(get_container_status 'ns-database')"
echo " Backup: $(get_container_status 'ns-backup')"
echo " Watchdog: $(get_watchdog_status "$(get_watchdog_status_code)" "$uni_watchdog_ok")"
} >>$SUPPORT_LOG
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}')
{
echo "$LOG_DIVIDER"
echo " Miejsce na dysku"
echo "$LOG_DIVIDER"
echo " Dostępne: ${remainingTxt}"
echo " Zajęte: ${percTxt} (z ${totalTxt})"
} >>$SUPPORT_LOG
ohai "Zbieranie logów watchdoga"
if [[ -f $WATCHDOG_LOG_FILE ]]; then
{ {
echo "$LOG_DIVIDER" echo "$LOG_DIVIDER"
echo " Statusy usług" echo " Watchdog log"
echo "$LOG_DIVIDER" echo "$LOG_DIVIDER"
echo " Nightscout: $(get_container_status 'ns-server')" timeout -k 15 10 cat $WATCHDOG_LOG_FILE
echo " Baza danych: $(get_container_status 'ns-database')"
echo " Backup: $(get_container_status 'ns-backup')"
echo " Watchdog: $(get_watchdog_status "$(get_watchdog_status_code)" "$uni_watchdog_ok")"
} >>$SUPPORT_LOG } >>$SUPPORT_LOG
fi
ohai "Zbieranie informacji o zasobach" if [[ -f $WATCHDOG_FAILURES_FILE ]]; then
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}')
{ {
echo "$LOG_DIVIDER" echo "$LOG_DIVIDER"
echo " Miejsce na dysku" echo " Watchdog failures log"
echo "$LOG_DIVIDER" echo "$LOG_DIVIDER"
echo " Dostępne: ${remainingTxt}" timeout -k 15 10 cat $WATCHDOG_FAILURES_FILE
echo " Zajęte: ${percTxt} (z ${totalTxt})"
} >>$SUPPORT_LOG } >>$SUPPORT_LOG
fi
ohai "Zbieranie logów watchdoga" ohai "Zbieranie logów usług"
if [[ -f $WATCHDOG_LOG_FILE ]]; then {
{ echo "$LOG_DIVIDER"
echo "$LOG_DIVIDER" echo " Nightscout log"
echo " Watchdog log" echo "$LOG_DIVIDER"
echo "$LOG_DIVIDER" timeout -k 15 10 docker logs ns-server --tail "$maxNsLogs" >>$SUPPORT_LOG 2>&1
timeout -k 15 10 cat $WATCHDOG_LOG_FILE echo "$LOG_DIVIDER"
} >>$SUPPORT_LOG echo " MongoDB database log"
fi echo "$LOG_DIVIDER"
timeout -k 15 10 docker logs ns-database --tail "$maxDbLogs" >>$SUPPORT_LOG 2>&1
} >>$SUPPORT_LOG
if [[ -f $WATCHDOG_FAILURES_FILE ]]; then ohai "Kompresowanie i szyfrowanie raportu"
{
echo "$LOG_DIVIDER"
echo " Watchdog failures log"
echo "$LOG_DIVIDER"
timeout -k 15 10 cat $WATCHDOG_FAILURES_FILE
} >>$SUPPORT_LOG
fi
ohai "Zbieranie logów usług" gzip -9 $SUPPORT_LOG
{ local logkey=$(<$LOG_ENCRYPTION_KEY_FILE)
echo "$LOG_DIVIDER"
echo " Nightscout log" gpg --passphrase "$logkey" --batch --quiet --yes -a -c "$SUPPORT_LOG.gz"
echo "$LOG_DIVIDER" }
timeout -k 15 10 docker logs ns-server --tail 500 >>$SUPPORT_LOG 2>&1
echo "$LOG_DIVIDER" retry_diagnostics() {
echo " MongoDB database log" local maxNsLogs=$1
echo "$LOG_DIVIDER" local maxDbLogs=$2
timeout -k 15 10 docker logs ns-database --tail 100 >>$SUPPORT_LOG 2>&1 local curr_time=$3
} >>$SUPPORT_LOG
if ((diagnosticsSizeOk == 0)); then
ohai "Sprawdzanie rozmiaru raportu"
local logSize=$(stat --printf="%s" "$SUPPORT_LOG.gz.asc")
local allowedTxt=$(echo "18000" | numfmt --to si --suffix=B)
local currentTxt=$(echo "$logSize" | numfmt --to si --suffix=B)
if ((logSize > 18000)); then
msgerr "Zebrana diagnostyka jest zbyt duża do wysłania (${currentTxt})"
ohai "Spróbuję zebrać mniej danych aby zmieścić się w limicie (${allowedTxt})"
gather_diagnostics "$maxNsLogs" "$maxDbLogs" "$curr_time"
else
diagnosticsSizeOk=1
msgok "Raport ma rozmiar ${currentTxt} i mieści się w limicie ${allowedTxt} dla usługi pusher-a"
fi
fi
}
send_diagnostics() {
LOG_KEY=$(<$LOG_ENCRYPTION_KEY_FILE)
ohai "Kompresowanie i szyfrowanie raportu" yesnodlg "Wysyłać diagnostykę?" \
"$uni_send" "$uni_resign" \
"Czy chcesz zgromadzić i wysłać sobie mailem dane diagnostyczne?" \
"\n$(
pad_multiline \
"\n${uni_bullet}diagnostyka zawiera logi i informacje o serwerze i usługach" \
"\n${uni_bullet}wysyłka na e-mail na który zamówiono serwer Mikr.us" \
"\n${uni_bullet}dane będą skompresowane i zaszyfrowane" \
"\n${uni_bullet}maila prześlij dalej do zaufanej osoby wspierającej" \
"\n${uni_bullet_pad}(z którą to wcześniej zaplanowano i uzgodniono!!!)" \
"\n${uni_bullet}hasło przekaż INNĄ DROGĄ (komunikatorem, SMSem, osobiście)" \
"\n\n${uni_bullet_pad}Hasło do logów: $LOG_KEY"
)"
gzip $SUPPORT_LOG if ! [ $? -eq 1 ]; then
local logkey=$(<$LOG_ENCRYPTION_KEY_FILE) local curr_time=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
gpg --passphrase "$logkey" --batch --quiet --yes -a -c "$SUPPORT_LOG.gz" gather_diagnostics 500 100 "$curr_time"
retry_diagnostics 200 50 "$curr_time"
retry_diagnostics 100 50 "$curr_time"
retry_diagnostics 50 50 "$curr_time"
ohai "Wysyłanie maila" ohai "Wysyłanie maila"
{ local sentStatus=$({
echo "Ta wiadomość zawiera poufne dane diagnostyczne Twojego serwera Nightscout." echo "Ta wiadomość zawiera poufne dane diagnostyczne Twojego serwera Nightscout."
echo "Mogą one pomóc Tobie lub zaufanej osobie w identyfikacji problemu." echo "Mogą one pomóc Tobie lub zaufanej osobie w identyfikacji problemu."
echo " " echo " "
@ -1861,12 +1900,21 @@ send_diagnostics() {
echo " " echo " "
echo " " echo " "
cat "$SUPPORT_LOG.gz.asc" cat "$SUPPORT_LOG.gz.asc"
} | pusher "Diagnostyka_serwera_Nightscout_-_$curr_time" } | pusher "Diagnostyka_serwera_Nightscout_-_$curr_time")
okdlg "Diagnostyka wysłana" \ local regexEm='Email sent'
"Sprawdź swoją skrzynkę pocztową,\n" \ if [[ "$sentStatus" =~ $regexEm ]]; then
"otrzymanego maila przekaż zaufanemu wspierającemu.\n\n" \ okdlg "Diagnostyka wysłana" \
"Komunikatorem lub SMS przekaż hasło do logów:\n\n$LOG_KEY" "Sprawdź swoją skrzynkę pocztową,\n" \
"otrzymanego maila przekaż zaufanemu wspierającemu.\n\n" \
"Komunikatorem lub SMS przekaż hasło do logów:\n\n$LOG_KEY"
else
msgerr "Błąd podczas wysyłki maila: $sentStatus"
okdlg "Błąd wysyłki maila" \
"Nieststy nie udało się wysłać diagnostyki" \
"${NL}zgłoś poniższy błąd twórcom narzędzia (na grupie Technologie Diabetyka)" \
"${TL}$sentStatus"
fi
fi fi
} }

@ -1 +1 @@
2024-10-06T07:12:57.316Z 2024-10-06T08:06:29.319Z
Loading…
Cancel
Save