From 66af62254cbae8f201f423cc41090408ac56a164 Mon Sep 17 00:00:00 2001 From: Steven Baltakatei Sandoval Date: Thu, 2 Jul 2020 00:55:23 +0000 Subject: [PATCH 1/1] feat(bkgpslog):Consolidate write ops into one function Create metafunction 'magicWriteBuffer' to be triggered for asynchronous appending of location files into tar file via appendArgTar function (new) once buffer filled in main logging loop. Create appendArgTar function to append a bash variable as a file to a tar file. --- exec/bkgpslog | 77 +++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 66 insertions(+), 11 deletions(-) diff --git a/exec/bkgpslog b/exec/bkgpslog index 022195e..bc716d8 100755 --- a/exec/bkgpslog +++ b/exec/bkgpslog @@ -612,6 +612,57 @@ setScriptTTL() { yell "ERROR:Invalid argument for setScriptTTL function."; exit 1; fi } # Seconds until next (day|hour). +appendArgTar(){ + # Desc: Writes first argument to temporary file with arguments as options, then appends file to tar + # Usage: writeArg "$(echo "Data to be written.")" [name of file to be inserted] [tar path] [temp dir] ([cmd1] [cmd2] [cmd3] [cmd4]...) + # Input: arg1: data to be written + # arg2: file name of file to be inserted into tar + # arg3: tar archive path (must exist first) + # arg4: temporary working dir + # arg5+: command strings (ex: "gpsbabel -i nmea -f - -o kml -F - ") + # Output: file written to disk + # Example: decrypt multiple large files in parallel + # appendArgTar "$(cat /tmp/largefile1.gpg)" "largefile1" $HOME/archive.tar /tmp "gpg --decrypt" & + # appendArgTar "$(cat /tmp/largefile2.gpg)" "largefile2" $HOME/archive.tar /tmp "gpg --decrypt" & + # appendArgTar "$(cat /tmp/largefile3.gpg)" "largefile3" $HOME/archive.tar /tmp "gpg --decrypt" & + + # Depends: bash 5 + + # Set file name + if ! [ -z "$2" ]; then FILENAME="$2"; else yell "ERROR:Not enough arguments."; exit 1; fi + + # Check tar path is a file + if [ -f "$3" ]; then TAR_PATH="$3"; else yell "ERROR:Tar archive arg not a file."; exit 1; fi + + # Check temp dir arg + if ! [ -z "$4" ]; then TMP_DIR="$3"; else yell "ERROR:No temporary working dir set."; exit 1; fi + + # Set command strings + if ! [ -z "$5" ]; then CMD1="$5"; else CMD1="tee /dev/null "; fi # command string 1 + if ! [ -z "$6" ]; then CMD2="$6"; else CMD2="tee /dev/null "; fi # command string 2 + if ! [ -z "$7" ]; then CMD3="$7"; else CMD3="tee /dev/null "; fi # command string 3 + if ! [ -z "$8" ]; then CMD4="$8"; else CMD4="tee /dev/null "; fi # command string 4 + + # Debug + yell "CMD1:$CMD1" + yell "CMD2:$CMD2" + yell "CMD3:$CMD3" + yell "CMD4:$CMD4" + # Write to temporary working dir + echo "$1" | $CMD1 | $CMD2 | $CMD3 | $CMD4 > "$TMP_DIR"/"$FILENAME"; + + # Append to tar + try tar --append --directory="$TMP_DIR" --file="$TAR_PATH" "$FILENAME"; + +} # Append Bash var to file appended to Tar archive +magicWriteBuffer() { + # Desc: bkgpslog-specific meta function for writing data to DIR_TMP then appending each file to PATHOUT_TAR + appendArgTar "$bufferBash" "$FILEOUT_NMEA" "$PATHOUT_TAR" "$DIR_TMP" "$CMD_CONV_NMEA" "$CMD_COMPRESS" "$CMD_ENCRYPT"; # Write NMEA data + appendArgTar "$bufferBash" "$FILEOUT_GPX" "$PATHOUT_TAR" "$DIR_TMP" "$CMD_CONV_NMEA" "$CMD_COMPRESS" "$CMD_ENCRYPT"; # Write GPX file + appendArgTar "$bufferBash" "$FILEOUT_KML" "$PATHOUT_TAR" "$DIR_TMP" "$CMD_CONV_NMEA" "$CMD_COMPRESS" "$CMD_ENCRYPT"; # Write KML file +} # bkgpslog write function + + main() { processArguments "$@" # Process arguments. @@ -621,7 +672,7 @@ main() { if [[ -d "$TMP_DIR_PRIORITY" ]]; then DIR_TMP_PARENT="$OPTION_TMPDIR"; else - yell "WARNING:Specified temporary working directory not valid:$OPTION_TMP_DIR"; + yell "WARNING:Specified temporary working directory not valid:$OPTION_TMPDIR"; exit 1; fi fi @@ -732,30 +783,34 @@ main() { # Determine file paths (time is start of buffer period) FILEOUT_BASENAME="$timeBufferStart""--""$bufferTTL_STR""..""$SCRIPT_HOSTNAME""_location" && vbm "STATUS:Set FILEOUT_BASENAME to:$FILEOUT_BASENAME"; ## Files saved to DIR_TMP - PATHOUT_NMEA="$DIR_TMP"/"$FILEOUT_BASENAME".nmea"$CMD_COMPRESS_SUFFIX""$CMD_ENCRYPT_SUFFIX" && vbm "STATUS:Set PATHOUT_NMEA to:$PATHOUT_NMEA"; - PATHOUT_GPX="$DIR_TMP"/"$FILEOUT_BASENAME".gpx"$CMD_COMPRESS_SUFFIX""$CMD_ENCRYPT_SUFFIX" && vbm "STATUS:Set PATHOUT_GPX to:$PATHOUT_GPX"; - PATHOUT_KML="$DIR_TMP"/"$FILEOUT_BASENAME".kml"$CMD_COMPRESS_SUFFIX""$CMD_ENCRYPT_SUFFIX" && vbm "STATUS:Set PATHOUT_KML to:$PATHOUT_KML"; + FILEOUT_NMEA="$FILEOUT_BASENAME".nmea"$CMD_COMPRESS_SUFFIX""$CMD_ENCRYPT_SUFFIX" && vbm "STATUS:Set FILEOUT_NMEA to:$FILEOUT_NMEA" + FILEOUT_GPX="$FILEOUT_BASENAME".gpx"$CMD_COMPRESS_SUFFIX""$CMD_ENCRYPT_SUFFIX" && vbm "STATUS:Set FILEOUT_GPX to:$FILEOUT_GPX" + FILEOUT_KML="$FILEOUT_BASENAME".kml"$CMD_COMPRESS_SUFFIX""$CMD_ENCRYPT_SUFFIX" && vbm "STATUS:Set FILEOUT_KML to:$FILEOUT_KML" + PATHOUT_NMEA="$DIR_TMP"/"$FILEOUT_NMEA" && vbm "STATUS:Set PATHOUT_NMEA to:$PATHOUT_NMEA"; + PATHOUT_GPX="$DIR_TMP"/"$FILEOUT_GPX" && vbm "STATUS:Set PATHOUT_GPX to:$PATHOUT_GPX"; + PATHOUT_KML="$DIR_TMP"/"$FILEOUT_KML" && vbm "STATUS:Set PATHOUT_KML to:$PATHOUT_KML"; ## Files saved to disk (DIR_OUT) ### one file per day (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" # Define GPS conversion commands CMD_CONV_NMEA="tee /dev/null " && vbm "STATUS:Set CMD_CONV_NMEA to:$CMD_CONV_NMEA"; # tee as passthrough - CMD_CONV_GPX="gpsbabel -i nmea -f - -o gpx -F -" && vbm "STATUS:Set CMD_CONV_GPX to:$CMD_CONV_GPX"; # convert NMEA to GPX - CMD_CONV_KML="gpsbabel -i nmea -f - -o kml -F -" && vbm "STATUS:Set CMD_CONV_KML to:$CMD_CONV_KML"; # convert NMEA to KML + CMD_CONV_GPX="gpsbabel -i nmea -f - -o gpx -F - " && vbm "STATUS:Set CMD_CONV_GPX to:$CMD_CONV_GPX"; # convert NMEA to GPX + CMD_CONV_KML="gpsbabel -i nmea -f - -o kml -F - " && vbm "STATUS:Set CMD_CONV_KML to:$CMD_CONV_KML"; # convert NMEA to KML # Fill Bash variable buffer bufferBash="$(timeout "$BUFFER_TTL""s" gpspipe -r)" && vbm "STATUS:Successfully filled bufferBash variable with gpspipe data."; # Record gpspipe nmea data to buffer for bufferTTL seconds # Process bufferBash, save secured chunk set to DIR_TMP vbm "STATUS:Beginning to save data to $DIR_TMP"; - echo "$bufferBash" | $CMD_CONV_NMEA | $CMD_COMPRESS | $CMD_ENCRYPT > "$PATHOUT_NMEA" & # Create NMEA file (secured if requested) - echo "$bufferBash" | $CMD_CONV_GPX | $CMD_COMPRESS | $CMD_ENCRYPT > "$PATHOUT_GPX" & # Create GPX file (secured if requested) - echo "$bufferBash" | $CMD_CONV_KML | $CMD_COMPRESS | $CMD_ENCRYPT > "$PATHOUT_KML" & # Create KML file (secured if requested) + magicWriteBuffer & + #echo "$bufferBash" | $CMD_CONV_NMEA | $CMD_COMPRESS | $CMD_ENCRYPT > "$PATHOUT_NMEA" & # Create NMEA file (secured if requested) + #echo "$bufferBash" | $CMD_CONV_GPX | $CMD_COMPRESS | $CMD_ENCRYPT > "$PATHOUT_GPX" & # Create GPX file (secured if requested) + #echo "$bufferBash" | $CMD_CONV_KML | $CMD_COMPRESS | $CMD_ENCRYPT > "$PATHOUT_KML" & # Create KML file (secured if requested) # Append each secured chunk in memory dir (DIR_TMP) to file on disk (PATHOUT_TAR in DIR_OUT) vbm "STATUS:DIR_TMP :$DIR_TMP"; vbm "STATUS:PATHOUT_TAR :$PATHOUT_TAR"; vbm "STATUS:PATHOUT_NMEA:$PATHOUT_NMEA"; - vbm "STATUS:PATHOUT_NMEA:$PATHOUT_GPX"; - vbm "STATUS:PATHOUT_NMEA:$PATHOUT_KML"; + vbm "STATUS:PATHOUT_GPX:$PATHOUT_GPX"; + vbm "STATUS:PATHOUT_KML:$PATHOUT_KML"; try tar --append --directory="$DIR_TMP" --file="$PATHOUT_TAR" "$(basename "$PATHOUT_NMEA")" && \ vbm "DEBUG:Appended NMEA location data $PATHOUT_NMEA to $PATHOUT_TAR"; try tar --append --directory="$DIR_TMP" --file="$PATHOUT_TAR" "$(basename "$PATHOUT_GPX")" && \ -- 2.30.2