From 2b426998ffbbce8d58c34cd0adee11fe96bb62ad Mon Sep 17 00:00:00 2001 From: Steven Baltakatei Sandoval Date: Thu, 31 Dec 2020 21:13:00 +0000 Subject: [PATCH] fix(bkdstcountdown):Fix error when script run after last discont Script was giving erroneous output if run during time period after a year's last timezone discontinuity (e.g. PDT>PST in November in America/Los_Angeles) and before the next year starts. --- unitproc/bkdstcountdown | 43 +++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/unitproc/bkdstcountdown b/unitproc/bkdstcountdown index ee3b094..4e3efe8 100755 --- a/unitproc/bkdstcountdown +++ b/unitproc/bkdstcountdown @@ -1,7 +1,5 @@ #!/bin/bash -# Date: 2020-02-13T23:14Z; baltakatei> - # Description: This script outputs days until the next time zone # discontinuity using 'zdump' and 'date'. @@ -9,25 +7,28 @@ SCRIPT_TZ="America/Los_Angeles" # Timezone to check for discontinuities #================================================= -echoerr() { - echo "$@" 1>&2; -} +yell() { echo "$0: $*" >&2; } # Yell, Die, Try Three-Fingered Claw technique; # Ref/Attrib: https://stackoverflow.com/a/25515370 +die() { yell "$*"; exit 111; } +try() { "$@" || die "cannot $*"; } # Declare variables declare -a datesDiscontArray #array SCRIPT_YEAR=$(date +%Y) SCRIPT_YEAR_NEXT=$(( $(date +%Y) + 1)) +SCRIPT_YEAR_NEXT2=$(( $(date +%Y) + 2)) SCRIPT_RUN_DATE_SECONDS=$(date +%s) # Save zdump output for SCRIPT_YEAR (for how multiline data saved in variable, see https://stackoverflow.com/a/613580 ) -datesDiscont="$(zdump -c $SCRIPT_YEAR_NEXT -v $SCRIPT_TZ | grep $SCRIPT_YEAR | awk '{ print $2 " " $3 " " $4 " " $5 " " $6 " " $7 }'; echo)" +datesDiscont="$(zdump -c "$SCRIPT_YEAR","$SCRIPT_YEAR_NEXT2" -v $SCRIPT_TZ | grep "$SCRIPT_YEAR\|$SCRIPT_YEAR_NEXT" | awk '{ print $2 " " $3 " " $4 " " $5 " " $6 " " $7 }'; echo)" if [ -z "$datesDiscont" ]; then - echo "No time discontinuity this year." - exit 1 -fi + echo "No time discontinuity this year."; + exit 1; +fi; -###echoerr "datesDiscont:--""$datesDiscont""--" +###yell "DEBUG:datesDiscont----------"; +###echo "$datesDiscont" 1>&2; +###yell "DEBUG:-----------"; # Count lines in datesDiscont (for counting lines in a variable, see https://stackoverflow.com/a/6314682 ) #datesDiscontLineCount=$(echo "$datesDiscont" | wc -l) @@ -39,21 +40,35 @@ while IFS= read -r line; do datesDiscontArray+=($(date --date="$line" +%s)) #echo ${datesDiscontArray[-1]} done <<< "$datesDiscont" -#echoerr ${datesDiscontArray[@]} +#yell ${datesDiscontArray[@]} # Sort datesDiscontArray (see https://stackoverflow.com/a/11789688 ) IFS=$'\n' datesDiscontArray=($(sort <<<"${datesDiscontArray[*]}")) unset IFS +###yell "DEBUG:"; +###yell "DEBUG:datesDiscontArray:"; +###yell "${datesDiscontArray[@]}"; +###yell "DEBUG:"; + # Get earliest date in datesDiscontArray that isn't in the past. for discontinuityDate in "${datesDiscontArray[@]}"; do - ###echoerr "Discontinuity date (seconds):"$discontinuityDate - ###echoerr "SCRIPT_RUN_DATE_SECONDS :"$SCRIPT_RUN_DATE_SECONDS + ###yell "DEBUG:Discontinuity date (seconds):"$discontinuityDate + ###yell "DEBUG:SCRIPT_RUN_DATE_SECONDS :"$SCRIPT_RUN_DATE_SECONDS if [ $discontinuityDate -gt $SCRIPT_RUN_DATE_SECONDS ]; then - ###echoerr "DEBUG:Date in future." + ###yell "DEBUG:Date in future." nextDiscontDate="$discontinuityDate" break fi done +# Check that nextDiscontDate is not empty +if [ -z "$nextDiscontDate" ]; then + echo "ERROR:nextDiscontDate empty" +fi; + + +###yell "DEBUG:nextDiscontDate:$nextDiscontDate"; +###yell "DEBUG:SCRIPT_RUN_DATE_SECONDS:$SCRIPT_RUN_DATE_SECONDS"; + echo $(( ( $nextDiscontDate - $SCRIPT_RUN_DATE_SECONDS )/86400 ))" days" # Days until next discontinuity date -- 2.30.2