+checkAgePubkey() {
+ # Desc: Checks if string is an age-compatible pubkey
+ # Usage: checkAgePubkey [str pubkey]
+ # Version: 0.1.2
+ # Input: arg1: string
+ # Output: return code 0: string is age-compatible pubkey
+ # return code 1: string is NOT an age-compatible pubkey
+ # age stderr (ex: there is stderr if invalid string provided)
+ # Depends: age (v0.1.0-beta2; https://github.com/FiloSottile/age/releases/tag/v1.0.0-beta2 )
+
+ argPubkey="$1";
+
+ if echo "test" | age -a -r "$argPubkey" 1>/dev/null; then
+ return 0;
+ else
+ return 1;
+ fi;
+} # Check age pubkey
+checkMakeTar() {
+ # Desc: Checks that a valid tar archive exists, creates one otherwise
+ # Usage: checkMakeTar [ path ]
+ # Version: 1.0.2
+ # Input: arg1: path of tar archive
+ # Output: exit code 0 : tar readable
+ # exit code 1 : tar missing; created
+ # exit code 2 : tar not readable; moved; replaced
+ # Depends: bash 5, date 8, tar 1, try()
+ local pathTar returnFlag0 returnFlag1 returnFlag2
+ pathTar="$1";
+
+ # Check if file is a valid tar archive
+ if tar --list --file="$pathTar" 1>/dev/null 2>&1; then
+ ## T1: return success
+ returnFlag0="tar valid";
+ elif { sleep 2; tar --list --file="$pathTar" 1>/dev/null 2>&1; }; then
+ ## F1: Check tar archive again after 2-second sleep
+ returnFlag0="tar valid";
+ else
+ ## F2-1: Check if file exists
+ if [[ -f "$pathTar" ]]; then
+ ### T: Rename file
+ try mv "$pathTar" "$pathTar""--broken--""$(date +%Y%m%dT%H%M%S%z)" && \
+ returnFlag1="tar moved";
+ else
+ ### F: -
+ :
+ fi;
+ ## F2-1: Create tar archive, return 0
+ try tar --create --file="$pathTar" --files-from=/dev/null && \
+ returnFlag2="tar created";
+ fi;
+
+ # Determine function return code
+ if [[ "$returnFlag0" = "tar valid" ]]; then
+ return 0;
+ elif [[ "$returnFlag2" = "tar created" ]] && ! [[ "$returnFlag1" = "tar moved" ]]; then
+ return 1; # tar missing so created
+ elif [[ "$returnFlag2" = "tar created" ]] && [[ "$returnFlag1" = "tar moved" ]]; then
+ return 2; # tar not readable so moved; replaced
+ fi;
+} # checks if arg1 is tar; creates one otherwise
+dateShort(){
+ # Desc: Date without separators (YYYYmmdd)
+ # Usage: dateShort ([str date])
+ # Version: 1.1.2
+ # Input: arg1: 'date'-parsable timestamp string (optional)
+ # Output: stdout: date (ISO-8601, no separators)
+ # Depends: bash 5.0.3, date 8.30, yell()
+ local argTime timeCurrent timeInput dateCurrentShort
+
+ argTime="$1";
+ # Get Current Time
+ timeCurrent="$(date --iso-8601=seconds)" ; # Produce `date`-parsable current timestamp with resolution of 1 second.
+ # Decide to parse current or supplied date
+ ## Check if time argument empty
+ if [[ -z "$argTime" ]]; then
+ ## T: Time argument empty, use current time
+ timeInput="$timeCurrent";
+ else
+ ## F: Time argument exists, validate time
+ if date --date="$argTime" 1>/dev/null 2>&1; then
+ ### T: Time argument is valid; use it
+ timeInput="$argTime";
+ else
+ ### F: Time argument not valid; exit
+ yell "ERROR:Invalid time argument supplied. Exiting."; exit 1;
+ fi;
+ fi;
+ # Construct and deliver separator-les date string
+ dateCurrentShort="$(date -d "$timeInput" +%Y%m%d)"; # Produce separator-less current date with resolution 1 day.
+ echo "$dateCurrentShort";
+} # Get YYYYmmdd
+dateTimeShort(){
+ # Desc: Timestamp without separators (YYYYmmddTHHMMSS+zzzz)
+ # Usage: dateTimeShort ([str date])
+ # Version 1.1.1
+ # Input: arg1: 'date'-parsable timestamp string (optional)
+ # Output: stdout: timestamp (ISO-8601, no separators)
+ # Depends: yell
+ local argTime timeCurrent timeInput timeCurrentShort
+
+ argTime="$1";
+ # Get Current Time
+ timeCurrent="$(date --iso-8601=seconds)" ; # Produce `date`-parsable current timestamp with resolution of 1 second.
+ # Decide to parse current or supplied date
+ ## Check if time argument empty
+ if [[ -z "$argTime" ]]; then
+ ## T: Time argument empty, use current time
+ timeInput="$timeCurrent";
+ else
+ ## F: Time argument exists, validate time
+ if date --date="$argTime" 1>/dev/null 2>&1; then
+ ### T: Time argument is valid; use it
+ timeInput="$argTime";
+ else
+ ### F: Time argument not valid; exit
+ yell "ERROR:Invalid time argument supplied. Exiting."; exit 1;
+ fi
+ fi
+ # Construct and deliver separator-les date string
+ timeCurrentShort="$(date -d "$timeInput" +%Y%m%dT%H%M%S%z)";
+ echo "$timeCurrentShort";
+} # Get YYYYmmddTHHMMSS±zzzz
+setTimeZoneEV(){
+ # Desc: Set time zone environment variable TZ
+ # Usage: setTimeZoneEV arg1
+ # Version 0.1.2
+ # Input: arg1: 'date'-compatible timezone string (ex: "America/New_York")
+ # TZDIR env var (optional; default: "/usr/share/zoneinfo")
+ # Output: exports TZ
+ # exit code 0 on success
+ # exit code 1 on incorrect number of arguments
+ # exit code 2 if unable to validate arg1
+ # Depends: yell(), printenv 8.30, bash 5.0.3
+ # Tested on: Debian 10
+ local tzDir returnState argTimeZone
+
+ argTimeZone="$1"
+ if ! [[ $# -eq 1 ]]; then
+ yell "ERROR:Invalid argument count.";
+ return 1;
+ fi
+
+ # Read TZDIR env var if available
+ if printenv TZDIR 1>/dev/null 2>&1; then
+ tzDir="$(printenv TZDIR)";
+ else
+ tzDir="/usr/share/zoneinfo";
+ fi
+
+ # Validate TZ string
+ if ! [[ -f "$tzDir"/"$argTimeZone" ]]; then
+ yell "ERROR:Invalid time zone argument.";
+ return 2;
+ else
+ # Export ARG1 as TZ environment variable
+ TZ="$argTimeZone" && export TZ && returnState="true";
+ fi
+
+ # Determine function return code
+ if [ "$returnState" = "true" ]; then
+ return 0;
+ fi
+} # Exports TZ environment variable
+showVersion() {
+ yell "$scriptVersion"
+} # Display script version.