From 51bd6160f37c63e9c49f86b31225f49c1d246793 Mon Sep 17 00:00:00 2001 From: Asif Bacchus Date: Fri, 24 Jul 2026 03:25:29 -0600 Subject: [PATCH] feat(func): Use centralized log func Create single logging function that can be called and then forwards the request to the appropriate logging backend function for completion. --- cfddns.sh | 75 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 44 insertions(+), 31 deletions(-) diff --git a/cfddns.sh b/cfddns.sh index c1b57c1..d0f571f 100644 --- a/cfddns.sh +++ b/cfddns.sh @@ -35,18 +35,18 @@ badParam() { if [ "$1" = "null" ]; then printf "\n%sERROR: '%s' cannot have a NULL (empty) value.\n" "$err" "$2" printf "%sPlease use '--help' for assistance.%s\n\n" "$cyan" "$norm" - ([ "$logToConsole" -eq 0 ]) && writePlainTextLog \ + ([ "$logToConsole" -eq 0 ]) && writeLog \ "${2} cannot have a NULL (empty) value" "critical" "fail" "preexec" 1 exit 1 elif [ "$1" = "dne" ]; then printf "\n%sERROR: '%s %s'\n" "$err" "$2" "$3" printf "file or directory does not exist or is empty.%s\n\n" "$norm" - ([ "$logToConsole" -eq 0 ]) && writePlainTextLog \ + ([ "$logToConsole" -eq 0 ]) && writeLog \ "${3}: file or directory does not exist or is empty" "critical" "fail" "preexec" 1 exit 1 elif [ "$1" = "errMsg" ]; then printf "\n%sERROR: %s%s\n\n" "$err" "$2" "$norm" - ([ "$logToConsole" -eq 0 ]) && writePlainTextLog \ + ([ "$logToConsole" -eq 0 ]) && writeLog \ "${2%%\Exit*}" "fatal" "fail" "preexec" 1 exit 1 fi @@ -85,7 +85,7 @@ listCFErrors() { messages="${messages#*_}" # output to log - writePlainTextLog "${message}" "err" "fail" "$2:CF-ERR" "$code" + writeLog "${message}" "err" "fail" "$2:CF-ERR" "$code" done } @@ -130,6 +130,17 @@ writePlainTextLog() { >>"$logFile" } +writeLog() { + ([ "$logToNone" ]) && return + + PT_LOG_LEVEL="$(standardizeLogLevels "$2")" + ([ "$logDebug" -eq 0 ] && [ "$PT_LOG_LEVEL" = "DEBUG" ]) && return + + ([ "$logToJournal" ]) && return # TODO: replace this with function when implemented + ([ "$useJsonLogFmt" -eq 1 ]) && return # TODO: replace this with function when implemented + ([ "$useSyslogLogFmt" -eq 1 ]) && writePlainTextLog "$@" +} + scriptExamples() { newline printf "Update Cloudflare DNS host A/AAAA records with current IP address.\n" @@ -247,6 +258,7 @@ scriptName="$(basename "$0")" logFile="$scriptPath/${scriptName%.*}.log" logToJournal=0 logToConsole=0 +logToNone=0 logDebug=0 useJsonLogFmt=1 useSyslogLogFmt=0 @@ -296,6 +308,7 @@ while [ $# -gt 0 ]; do --log-none) # do not log anything logFile="/dev/null" + logToNone=1 ;; --log-debug) # log debugging messages @@ -355,7 +368,7 @@ while [ $# -gt 0 ]; do *) printf "\n%sUnknown option: %s\n" "$err" "$1" printf "%sUse '--help' for valid options.%s\n\n" "$cyan" "$norm" - ([ "$logToConsole" -eq 0 ]) && writePlainTextLog \ + ([ "$logToConsole" -eq 0 ]) && writeLog \ "Unknown script parameter: '${1}'" "critical" "fail" "preexec" 1 exit 1 ;; @@ -366,12 +379,12 @@ done ### pre-flight checks if ! command -v curl >/dev/null; then printf "\n%sThis script requires that 'curl' is installed and accessible. Exiting.%s\n\n" "$err" "$norm" - ([ "$logToConsole" -eq 0 ]) && writePlainTextLog "'curl' must be installed and accessible" "fatal" "fail" "preexec" 2 + ([ "$logToConsole" -eq 0 ]) && writeLog "'curl' must be installed and accessible" "fatal" "fail" "preexec" 2 exit 2 fi if ! command -v jq >/dev/null; then printf "\n%sThis script requires that 'jq' is installed and accessible. Exiting.%s\n\n" "$err" "$norm" - ([ "$logToConsole" -eq 0 ]) && writePlainTextLog "'jq' must be installed and accessible" "fatal" "fail" "preexec" 2 + ([ "$logToConsole" -eq 0 ]) && writeLog "'jq' must be installed and accessible" "fatal" "fail" "preexec" 2 exit 2 fi if [ -z "$dnsRecords" ]; then @@ -387,14 +400,14 @@ if [ "$logToJournal" -eq 1 ] && ! command -v logger >/dev/null 2>&1; then fi ### initial log entries -writePlainTextLog "starting '${scriptName}'" "info" "ok" "script" -writePlainTextLog "script path: ${scriptPath}/${scriptName}" "debug" "ok" "startup" -writePlainTextLog "credentials file: ${accountFile}" "debug" "ok" "startup" +writeLog "starting '${scriptName}'" "info" "ok" "script" +writeLog "script path: ${scriptPath}/${scriptName}" "debug" "ok" "startup" +writeLog "credentials file: ${accountFile}" "debug" "ok" "startup" if [ "$ip4" -eq 1 ]; then - writePlainTextLog "mode: IPv4" "debug" "ok" "startup" + writeLog "mode: IPv4" "debug" "ok" "startup" elif [ "$ip6" -eq 1 ]; then - writePlainTextLog "mode: IPv6" "debug" "ok" "startup" + writeLog "mode: IPv6" "debug" "ok" "startup" fi # detect and report IP address @@ -402,21 +415,21 @@ if [ -z "$ipAddress" ]; then # detect public ip address if [ "$ip4" -eq 1 ]; then if ! ipAddress="$(curl -s $ip4DetectionSvc)"; then - writePlainTextLog \ + writeLog \ "Unable to auto-detect this machine's public IP address; try again later or supply the IP address to be used" "err" "fail" "detectip" 10 exit 10 fi fi if [ "$ip6" -eq 1 ]; then if ! ipAddress="$(curl -s $ip6DetectionSvc)"; then - writePlainTextLog \ + writeLog \ "Unable to auto-detect this machine's public IP address; try again later or supply the IP address to be used" "err" "fail" "detectip" 10 exit 10 fi fi - writePlainTextLog "DDNS IP address (detected): $ipAddress" "info" "ok" "startup" + writeLog "DDNS IP address (detected): $ipAddress" "info" "ok" "startup" else - writePlainTextLog "DDNS IP address (supplied): $ipAddress" "info" "ok" "startup" + writeLog "DDNS IP address (supplied): $ipAddress" "info" "ok" "startup" fi # iterate DNS records to update @@ -428,7 +441,7 @@ while [ -n "$dnsRecordsToUpdate" ] && [ "$dnsRecordsToUpdate" != "$dnsSeparator" if [ -z "$record" ]; then continue fi - writePlainTextLog "DNS host record '${record}' queued for update" "info" "ok" "startup" + writeLog "DNS host record '${record}' queued for update" "info" "ok" "startup" done ### read Cloudflare credentials @@ -445,14 +458,14 @@ case "$accountFile" in ;; esac if [ -z "$cfKey" ]; then - writePlainTextLog "Cloudflare authorized API key (cfKey) is either null or undefined; please check your Cloudflare credentials file" "err" "fail" "creds" 21 + writeLog "Cloudflare authorized API key (cfKey) is either null or undefined; please check your Cloudflare credentials file" "err" "fail" "creds" 21 exit 21 fi if [ -z "$cfZoneId" ]; then - writePlainTextLog "Cloudflare zone id (cfZoneId) is either null or undefined; please check your Cloudflare credentials file" "err" "fail" "creds" 22 + writeLog "Cloudflare zone id (cfZoneId) is either null or undefined; please check your Cloudflare credentials file" "err" "fail" "creds" 22 exit 22 fi -writePlainTextLog "Cloudflare credentials file read successfully" "debug" "ok" "creds" +writeLog "Cloudflare credentials file read successfully" "debug" "ok" "creds" ### connect to Cloudflare and do what needs to be done! dnsRecordsToUpdate="$dnsRecords$dnsSeparator" @@ -477,7 +490,7 @@ while [ -n "$dnsRecordsToUpdate" ] && [ "$dnsRecordsToUpdate" != "$dnsSeparator" -H "Authorization: Bearer ${cfKey}" \ -H "Content-Type: application/json" )"; then - writePlainTextLog "Unable to connect to Cloudflare servers; please try again later." "err" "fail" "cflogin" 3 + writeLog "Unable to connect to Cloudflare servers; please try again later." "err" "fail" "cflogin" 3 exit 3 fi @@ -486,7 +499,7 @@ while [ -n "$dnsRecordsToUpdate" ] && [ "$dnsRecordsToUpdate" != "$dnsSeparator" cfSuccess="$(printf "%s" "$cfLookup" | jq -r '.success')" if [ "$cfSuccess" = "false" ]; then listCFErrors "$cfLookup" "cflogin" - writePlainTextLog "Cloudflare API error; review any previously logged 'CF-ERR:' lines for details." "err" "fail" "cflogin" 25 + writeLog "Cloudflare API error; review any previously logged 'CF-ERR:' lines for details." "err" "fail" "cflogin" 25 exit 25 fi @@ -494,18 +507,18 @@ while [ -n "$dnsRecordsToUpdate" ] && [ "$dnsRecordsToUpdate" != "$dnsSeparator" # skip to the next host if an existing host record cannot be found (this script *updates* only, does not create!) if [ "$resultCount" = "0" ]; then - writePlainTextLog "Cannot find an existing record matching '${record}' to update" "warn" "warn" "ddns" + writeLog "Cannot find an existing record matching '${record}' to update" "warn" "warn" "ddns" invalidDomainCount=$((invalidDomainCount + 1)) continue fi objectId=$(printf "%s" "$cfLookup" | jq -r '.result | .[] | .id') currentIpAddr=$(printf "%s" "$cfLookup" | jq -r '.result | .[] | .content') - writePlainTextLog "The current IP address for '${record}' is ${currentIpAddr}" "debug" "ok" "ddns" + writeLog "The current IP address for '${record}' is ${currentIpAddr}" "debug" "ok" "ddns" # skip to next hostname if record already up to date if [ "$currentIpAddr" = "$ipAddress" ]; then - writePlainTextLog "The IP address for '${record}' is already up to date" "info" "ok" "ddns" + writeLog "The IP address for '${record}' is already up to date" "info" "ok" "ddns" continue fi @@ -519,17 +532,17 @@ while [ -n "$dnsRecordsToUpdate" ] && [ "$dnsRecordsToUpdate" != "$dnsSeparator" -H "Content-Type: application/json" \ --data "${updateJSON}" )"; then - writePlainTextLog "Unable to connect to Cloudflare servers; please try again later." "err" "fail" "ddns" 3 + writeLog "Unable to connect to Cloudflare servers; please try again later." "err" "fail" "ddns" 3 exit 3 fi # note update success or failure cfSuccess="$(printf "%s" "$cfResult" | jq '.success')" if [ "$cfSuccess" = "true" ]; then - writePlainTextLog "The IP address for '${record}' successfully updated" "info" "ok" "ddns" + writeLog "The IP address for '${record}' successfully updated" "info" "ok" "ddns" else listCFErrors "$cfResult" "ddns" - writePlainTextLog "Unable to update the IP address for '${record}'" "err" "fail" "ddns" + writeLog "Unable to update the IP address for '${record}'" "err" "fail" "ddns" # do not exit with error, API error here is probably an update issue specific to this host # increment counter and note it after all processing finished failedHostCount=$((failedHostCount + 1)) @@ -538,14 +551,14 @@ done # exit if [ "$invalidDomainCount" -ne 0 ]; then - writePlainTextLog "${invalidDomainCount} invalid host(s) were supplied for updating" "warn" "warn" "ddns" + writeLog "${invalidDomainCount} invalid host(s) were supplied for updating" "warn" "warn" "ddns" fi if [ "$failedHostCount" -ne 0 ]; then - writePlainTextLog \ + writeLog \ "${failedHostCount} host update(s) failed; review 'CF-ERR:' lines in this log to help determine what may have gone wrong" "err" "fail" "ddns" 26 exit 26 else - writePlainTextLog "${scriptName} completed successfully" "info" "ok" "script" + writeLog "${scriptName} completed successfully" "info" "ok" "script" fi ### exit return codes