From 3395ae224838d372dbb3422c0f3870b005cb494b Mon Sep 17 00:00:00 2001 From: Steven Baltakatei Sandoval Date: Thu, 2 Jul 2020 20:13:03 +0000 Subject: [PATCH] feat(bkgpslog): Consolidate VERSION writing, update functions Bump version to 0.2.0 from 0.1.0. style(timeUntilNextDay()). Set as version 1.0.0. Lowercased returnState variable messages in function return code handling. fix(timeDuration()). Fix missing $ in bash variable. Set to Version 1.0.0. Removed unused boolean variables. feat(magicWriteVersion()): Add function to consolidate how VERSION file is generated; VERSION file can be generated at start or if output tar goes missing. feat(magicWriteBuffer()): Take checkMakeTar() exit status into account in order to determine whether or not to rerun magicWriteVersion(). Relevant if output tar archive goes missing. --- exec/bkgpslog | 78 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 46 insertions(+), 32 deletions(-) diff --git a/exec/bkgpslog b/exec/bkgpslog index 187e246..19f95f2 100755 --- a/exec/bkgpslog +++ b/exec/bkgpslog @@ -14,7 +14,7 @@ DIR_TMP_DEFAULT="/dev/shm"; # Default parent of working directory SCRIPT_TIME_START=$(date +%Y%m%dT%H%M%S.%N); PATH="$HOME/.local/bin:$PATH"; # Add "$(systemd-path user-binaries)" path in case apps saved there SCRIPT_HOSTNAME=$(hostname); # Save hostname of system running this script. -SCRIPT_VERSION="bkgpslog 0.1.0"; # Define version of script. +SCRIPT_VERSION="bkgpslog 0.2.0"; # Define version of script. declare -Ag appRollCall # Associative array for storing app status declare -Ag fileRollCall # Associative array for storing file status @@ -262,41 +262,47 @@ setTimeZoneEV(){ } # Exports TZ environment variable timeUntilNextDay(){ # Desc: Report seconds until next day. + # Version: 1.0.0 # Output: stdout: integer seconds until next day # Output: exit code 0 if stdout > 0; 1 if stdout = 0; 2 if stdout < 0 # Usage: timeUntilNextDay # Usage: if ! myTTL="$(timeUntilNextDay)"; then yell "ERROR in if statement"; exit 1; fi + # Depends: date 8, echo 8, yell, try + local returnState TIME_CURRENT TIME_NEXT_DAY SECONDS_UNTIL_NEXT_DAY + TIME_CURRENT="$(date --iso-8601=seconds)" ; # Produce `date`-parsable current timestamp with resolution of 1 second. TIME_NEXT_DAY="$(date -d "$TIME_CURRENT next day" --iso-8601=date)"; # Produce timestamp of beginning of tomorrow with resolution of 1 second. SECONDS_UNTIL_NEXT_DAY="$(( $(date +%s -d "$TIME_NEXT_DAY") - $(date +%s -d "$TIME_CURRENT") ))" ; # Calculate seconds until closest future midnight (res. 1 second). if [[ "$SECONDS_UNTIL_NEXT_DAY" -gt 0 ]]; then returnState="true"; elif [[ "$SECONDS_UNTIL_NEXT_DAY" -eq 0 ]]; then - returnState="WARNING_ZERO"; + returnState="warning_zero"; yell "WARNING:Reported time until next day exactly zero."; elif [[ "$SECONDS_UNTIL_NEXT_DAY" -lt 0 ]]; then - returnState="WARNING_NEGATIVE"; + returnState="warning_negative"; yell "WARNING:Reported time until next day is negative."; fi try echo "$SECONDS_UNTIL_NEXT_DAY"; # Report - #===Determine function return code=== + # Determine function return code if [[ "$returnState" = "true" ]]; then return 0; - elif [[ "$returnState" = "WARNING_ZERO" ]]; then + elif [[ "$returnState" = "warning_zero" ]]; then return 1; - elif [[ "$returnState" = "WARNING_NEGATIVE" ]]; then + elif [[ "$returnState" = "warning_negative" ]]; then return 2; fi } # Report seconds until next day timeUntilNextHour(){ # Desc: Report seconds until next hour + # Version 1.0.0 # Output: stdout: integer seconds until next hour # Output: exit code 0 if stdout > 0; 1 if stdout = 0; 2 if stdout < 0 # Usage: timeUntilNextHour # Usage: if ! myTTL="$(timeUntilNextHour)"; then yell "ERROR in if statement"; exit 1; fi + local returnState TIME_CURRENT TIME_NEXT_HOUR SECONDS_UNTIL_NEXT_HOUR TIME_CURRENT="$(date --iso-8601=seconds)"; # Produce `date`-parsable current timestamp with resolution of 1 second. TIME_NEXT_HOUR="$(date -d "$TIME_CURRENT next hour" --iso-8601=hours)"; # Produce `date`-parsable current time stamp with resolution of 1 second. @@ -304,21 +310,21 @@ timeUntilNextHour(){ if [[ "$SECONDS_UNTIL_NEXT_HOUR" -gt 0 ]]; then returnState="true"; elif [[ "$SECONDS_UNTIL_NEXT_HOUR" -eq 0 ]]; then - returnState="WARNING_ZERO"; + returnState="warning_zero"; yell "WARNING:Reported time until next hour exactly zero."; elif [[ "$SECONDS_UNTIL_NEXT_HOUR" -lt 0 ]]; then - returnState="WARNING_NEGATIVE"; + returnState="warning_negative"; yell "WARNING:Reported time until next hour is negative."; fi try echo "$SECONDS_UNTIL_NEXT_HOUR"; # Report - #===Determine function return code=== + # Determine function return code if [[ "$returnState" = "true" ]]; then return 0; - elif [[ "$returnState" = "WARNING_ZERO" ]]; then + elif [[ "$returnState" = "warning_zero" ]]; then return 1; - elif [[ "$returnState" = "WARNING_NEGATIVE" ]]; then + elif [[ "$returnState" = "warning_negative" ]]; then return 2; fi } # Report seconds until next hour @@ -345,12 +351,17 @@ timeDuration(){ # Ref/Attrib: ISO-8601:2004(E), §4.4.4.2 Representations of time intervals by duration and context information # Note: "1 month" ("P1M") is assumed to be "30 days" (see ISO-8601:2004(E), §2.2.1.2) # Usage: timeDuration [arg1] ([arg2]) + # Version: 1.0.1 # Input: arg1: seconds as base 10 integer >= 0 (ex: 3601) # arg2: precision level (optional; default=2) # Output: stdout: ISO-8601 duration string (ex: "P1H1S", "P2Y10M15DT10H30M20S") # Example: 'timeDuration 111111 3' yields 'P1DT6H51M' - # Depends: date 8 (gnucoreutils) - local returnState fullHours fullMinutes fullSeconds; + # Depends: date 8 (gnucoreutils), yell, + local returnState ARG1 ARG2 remainder precision witherPrecision + local fullYears fullMonths fullDays fullHours fullMinutes fullSeconds + local displayYears displayMonths displayDays displayHours displayMinutes displaySeconds + local hasYears hasMonths hasDays hasHours hasMinutes hasSeconds + ARG1="$1"; ARG2="$2"; precision=2; # set default precision @@ -363,13 +374,12 @@ timeDuration(){ # Check that arg1 provided if [[ $# -ge 1 ]]; then - # Check that arg1 is a positive integer + ## Check that arg1 is a positive integer if [[ "$ARG1" =~ ^[[:digit:]]+$ ]]; then - arg1Valid="true"; + : else yell "ERROR:ARG1 not a digit."; returnState="ERROR_INPUT"; - arg1Valid="false"; fi else yell "ERROR:No argument provided. Exiting."; @@ -379,16 +389,14 @@ timeDuration(){ # Consider whether arg2 was provided if [[ $# -eq 2 ]]; then # Check that the second arg is a positive integer - if [[ "$ARG2" =~ ^[[:digit:]]+$ ]] && [[ "ARG2" -gt 0 ]]; then - arg2Valid="true"; + if [[ "$ARG2" =~ ^[[:digit:]]+$ ]] && [[ "$ARG2" -gt 0 ]]; then precision="$ARG2"; else yell "ERROR:ARG2 not a positive integer. (is $ARG2 ). Leaving early."; returnState="ERROR_INPUT"; - arg2Valid="false"; fi; else - arg2Valid="false"; + : fi; remainder="$ARG1" ; # seconds @@ -701,6 +709,18 @@ appendArgTar(){ try tar --append --directory="$TMP_DIR" --file="$TAR_PATH" "$FILENAME"; yell "DEBUG:STATUS:$FN:Finished appendArgTar()." } # Append Bash var to file appended to Tar archive +magicWriteVersion() { + # Desc: Appends time-stamped VERSION to PATHOUT_TAR + # Usage: magicWriteVersion + # Input: CONTENT_VERSION, FILEOUT_VERSION, PATHOUT_TAR, DIR_TMP + # Depends: dateTimeShort, appendArgTar + + # Generate VERSION file in BashVar + FILEOUT_VERSION="$(dateTimeShort)..VERSION"; + CONTENT_VERSION="$(dateTimeShort):$(basename "$0")"" Version:""$SCRIPT_VERSION"; + # Create BashVar as file FILEOUT_VERSION and write-append to PATHOUT_TAR + appendArgTar "$CONTENT_VERSION" "$FILEOUT_VERSION" "$PATHOUT_TAR" "$DIR_TMP"; +} # bkgpslog: write version data to PATHOUT_TAR via appendArgTar() magicWriteBuffer() { # Desc: bkgpslog-specific meta function for writing data to DIR_TMP then appending each file to PATHOUT_TAR # Inputs: PATHOUT_TAR FILEOUT_{NMEA,GPX,KML} CMD_CONV_{NMEA,GPX,KML} CMD_{COMPRESS,ENCRYPT} DIR_TMP @@ -709,8 +729,10 @@ magicWriteBuffer() { wait; # Wait to avoid collision with older magicWriteBuffer() instances (see https://www.tldp.org/LDP/abs/html/x9644.html ) vbm "DEBUG:STATUS:$FN:Started magicWriteBuffer()."; - # Check that PATHOUT_TAR is a tar. Rename old and create empty one otherwise. - checkMakeTar "$PATHOUT_TAR" + # Validate PATHOUT_TAR as tar. + checkMakeTar "$PATHOUT_TAR"; + ## Add VERSION file if checkMakeTar had to create a tar (exited 1) or replace one (exited 2) + if [[ $? -eq 1 ]] || [[ $? -eq 2 ]]; then magicWriteVersion; fi # Write bufferBash to PATHOUT_TAR appendArgTar "$bufferBash" "$FILEOUT_NMEA" "$PATHOUT_TAR" "$DIR_TMP" "$CMD_CONV_NMEA" "$CMD_COMPRESS" "$CMD_ENCRYPT"; # Write NMEA data @@ -721,7 +743,6 @@ magicWriteBuffer() { yell "DEBUG:STATUS:$FN:Finished magicWriteBuffer()."; } # bkgpslog write function - main() { processArguments "$@" # Process arguments. @@ -795,7 +816,7 @@ main() { displayMissing; yell "Exiting."; exit 1; fi # Set script lifespan - setScriptTTL "$SCRIPT_TTL"; + setScriptTTL "$SCRIPT_TTL"; # seconds until next new SCRIPT_TTL (ex: "day" or "hour") # File name substring: encoded bufferTTL bufferTTL_STR="$(timeDuration $BUFFER_TTL)"; @@ -807,17 +828,10 @@ main() { ## Define output tar path (note: each day gets *one* tar file (Ex: "20200731..hostname_location.[.gpx.gz].tar")) PATHOUT_TAR="$DIR_OUT"/"$(dateShort)".."$SCRIPT_HOSTNAME""_location""$CMD_COMPRESS_SUFFIX""$CMD_ENCRYPT_SUFFIX".tar && \ vbm "STATUS:Set PATHOUT_TAR to:$PATHOUT_TAR"; - ## Generate VERSION file - FILEOUT_VERSION="$(dateTimeShort)..VERSION"; - PATHOUT_VERSION="$DIR_TMP"/"$FILEOUT_VERSION"; - echo "$(dateTimeShort):$(basename "$0")"" Version:""$SCRIPT_VERSION" >> "$PATHOUT_VERSION" && vbm "DEBUG:VERSION created:$PATHOUT_VERSION"; - ## Check that PATHOUT_TAR is a tar. Rename old and create empty one otherwise. checkMakeTar "$PATHOUT_TAR" && vbm "DEBUG:Confirmed or Created to be a tar:$PATHOUT_TAR"; - ## Append VERSION file to PATHOUT_TAR - try tar --append --directory="$DIR_TMP" --file="$PATHOUT_TAR" "$FILEOUT_VERSION" && \ - vbm "DEBUG:VERSION added to $PATHOUT_TAR"; + magicWriteVersion; # Record gps data until script lifespan ends declare debugCounter; debugCounter="0"; # set debug counter -- 2.30.2