raspiblitz/home.admin/assets/telegraf/etc-telegraf/getraspiblitzipinfo.sh
PatrickScheich 40e554c5e7 telegraf updates for v1.7.0RC3 (#2204)
* new path of "vcgencmd" at raspiblitz v1.7.0RC2
* whitespaces + rename raspiblitz_ip_info -> ipinfo
* add mempool info via bitcoincli
Co-authored-by: Patrick Scheich <patrick.scheich@syscovery.de>
2021-04-20 20:44:35 +02:00

242 lines
11 KiB
Bash

#!/bin/bash
#
###############################################################################
# File: getraspiblitzipinfo.sh
# Date: 2021-04-19
###############################################################################
# set the "debugLevel"
debugLevel=0
# enable Write to memoryFile
writeMemoryfile=1
# if "logFile" points to an existing file => logging enabled
logFile=/mnt/hdd/temp/raspiblitzipinfo.log
# get the ISO timestamp for log output
sts=$(date --iso-8601='seconds')
if [ -f "${logFile}" ]; then printf "\n---\n%s: %s started\n" "$sts" "$0" >> ${logFile} ;fi
# get the seconds since UNIX epoch
unixTimestamp=$(date +"%s")
if [ -f "${logFile}" ]; then printf "%s: unixTimeStamp = %s\n" "$sts" "$unixTimestamp" >> ${logFile} ;fi
# get active network device (eth0 or wlan0)
networkDevice=$(ip addr | grep -v "lo:" | grep 'state UP' | tr -d " " | cut -d ":" -f2 | head -n 1)
#
if [ -f "${logFile}" ]; then printf "%s: networkDevice = %s\n" "$sts" "$networkDevice" >> ${logFile} ;fi
if [ -f "${logFile}" ]; then echo " " >> ${logFile} ;fi
# create the indexed array "origin" an fill it
# this also creates the "Enumeration"
# 0 <=> publicIP
# 1 <=> bitcoind
# 2 <=> lnd
# 3 <=> IPv6
# 4 <=> IPv4
#
declare -a origin
origin=(publicIP bitcoind lnd IPv6 IPv4)
#
#if [ -f "${logFile}" ]; then for i in $( seq 0 4 ); do printf "%s: origin[ %d ] = %s\n" "$sts" "$i" "${origin[ $i ]}" >> ${logFile} ;done ;fi
#if [ -f "${logFile}" ]; then echo " " >> ${logFile} ;fi
#
# further we need the arrays
declare -a ip_addr_curr
declare -a ip_addr_prev
declare -a creation_ts_curr
declare -a creation_ts_prev
declare -a has_changed
# load local config (but should also work if not available)
source /mnt/hdd/raspiblitz.conf 2>/dev/null
# get the "public IP addresses" from various sources/origins
# [0] -> publicIP (remove square barckets in case of IPv6)
# [1] -> bitcoind
# [2] -> lnd
# [3] -> IPv6 at local network interface (eth0 or wlan0)
# [4] -> IPv4 at local network interface (eth0 or wlan0)
ip_addr_curr[0]=$(echo "${publicIP}" | tr -d '[]')
ip_addr_curr[1]=$(/usr/local/bin/bitcoin-cli -conf=/mnt/hdd/bitcoin/bitcoin.conf getnetworkinfo | jq -r ".localaddresses[0].address" 2>/dev/null)
ip_addr_curr[2]=$(/usr/local/bin/lncli --lnddir=/mnt/hdd/app-data/lnd getinfo | jq -r ".uris[0]" 2>/dev/null | cut -d'@' -f2 | rev | cut -d':' -f2- | rev | tr -d '[]')
ip_addr_curr[3]=$(ip -o -6 address show scope global up dev ${networkDevice} 2>/dev/null | cut -d'/' -f1 | awk '/inet6/{print $4}' | head -n 1)
ip_addr_curr[4]=$(ip -o -4 address show scope global up dev ${networkDevice} 2>/dev/null | cut -d'/' -f1 | awk '/inet/{print $4}' | head -n 1)
#
if [ -f "${logFile}" ]; then for i in $( seq 0 4 ); do printf "%s: ip_addr_curr[ %d ] = %s\n" "$sts" "$i" "${ip_addr_curr[ $i ]}" >> ${logFile} ;done ;fi
if [ -f "${logFile}" ]; then echo " " >> ${logFile} ;fi
#
if [ ${debugLevel} -gt 10 ]; then for i in $( seq 0 4 ); do printf " %2d: %-10s = %s\n" "$i" "${origin[ $i ]}" "${ip_addr_curr[ $i ]}" ;done ;fi
# get the values from a prior run, that file will not be changes as long as all the values stay the same
memoryFile=/mnt/hdd/temp/raspiblitzipinfo.out
source ${memoryFile} 2>/dev/null
# prepare to count the changes
changes=0
# initialize the array of the previous IP addresses from the memory file
for i in $( seq 0 4 ); do
# compose the name of the memory variable
s="${origin[ $i ]}_old"
# assign the prev address array emement with content of that variable
ip_addr_prev[ $i ]=${!s}
# if the variable is still empty, fill it with "N/A"
if [ "ip_addr_prev[ $i ]" == "" ]; then ip_addr_prev[ $i ]="N/A" ; fi
#if [ -f "${logFile}" ]; then printf "%s: from memoryfile variable %30s = %s\n" "$sts" "$s" "${ip_addr_prev[ $i ]}" >> ${logFile} ; fi
if [ ${debugLevel} -gt 10 ]; then printf " %2d: read into ip_addr_prev[%d] from memoryfile variable %30s = %s\n" "$i" "$i" "$s" "${ip_addr_prev[ $i ]}" ; fi
done
#if [ -f "${logFile}" ]; then echo " " >> ${logFile} ;fi
# initialize the Creation TimeStamps with their old values from the memory file
# so it is guaranteed that they contain a proper value if that IP does not change
# otherwise the "unixTimestamp" will be written if a change is detected
for i in $( seq 0 4 ); do
# compose the name of the memory variable
s="${origin[ $i ]}_CreationTS_old"
# get the content of that variable
# and sanitzie if necessary
val=${!s}
if [ "${val}" == "" ]; then val=-1 ; fi
# assign the current and prev timestamp array emements with content of that variable
creation_ts_curr[ $i ]=${val}
creation_ts_prev[ $i ]=${val}
#if [ -f "${logFile}" ]; then printf "%s: from memoryfile variable %30s = %s\n" "$sts" "$s" "${creation_ts_curr[ $i ]}" >> ${logFile} ; fi
if [ ${debugLevel} -gt 10 ]; then printf " %2d: read into creation_ts_curr/prev[%d] from memoryfile variable %30s = %s\n" "$i" "$i" "$s" "${creation_ts_curr[ $i ]}" ; fi
done
#if [ -f "${logFile}" ]; then echo " " >> ${logFile} ;fi
# initialize the "has_changed" flag array
for i in $( seq 0 4 ); do
has_changed[ $i ]=0
done
# check for changes...
# whenever a change is detected the current time will be written into the respective Creation TimeStamp variable
# Additionally the "changes" counter will be incremented
for i in $( seq 0 4 ); do
if [ "${ip_addr_curr[$i]}" != "${ip_addr_prev[$i]}" ]; then
((changes++))
has_changed[ $i ]=1
creation_ts_curr[ $i ]=${unixTimestamp}
if [ -f "${logFile}" ]; then printf "%s: %2d: IP addr change detected for %10s: %40s (new) != %40s (old)\n" "$sts" "$i" "${origin[ $i ]}" "${ip_addr_curr[$i]}" "${ip_addr_prev[$i]}" >> ${logFile} ; fi
if [ ${debugLevel} -gt 0 ]; then printf " %2d: IP addr change detected for %10s: %40s (new) != %40s (old)\n" "$i" "${origin[ $i ]}" "${ip_addr_curr[$i]}" "${ip_addr_prev[$i]}" ; fi
else
if [ -f "${logFile}" ]; then printf "%s: %2d: IP addr --NOT changed-- for %10s: %40s (new) != %40s (old)\n" "$sts" "$i" "${origin[ $i ]}" "${ip_addr_curr[$i]}" "${ip_addr_prev[$i]}" >> ${logFile} ; fi
if [ ${debugLevel} -gt 10 ]; then printf " %2d: IP addr --NOT changed-- for %10s: %40s (new) == %40s (old)\n" "$i" "${origin[ $i ]}" "${ip_addr_curr[$i]}" "${ip_addr_prev[$i]}" ; fi
fi
done
if [ -f "${logFile}" ]; then echo " " >> ${logFile} ;fi
# IF at least one value of the memory file needs to be updated, the whole file will be rewritten.
# the "..._CreationTS" variables will contain their "..._CreationTS_old" counter part (if nothing has changed)
# or "${unixTimestamp}" if that particular IP address has been changed
#
if [ ${changes} -gt 0 ]; then
if [ -f "${logFile}" ]; then printf "%s: *** IP change detected, writing memoryfile %s ***\n" "$sts" "$memoryFile" >> ${logFile} ; fi
if [ ${debugLevel} -gt 0 ]; then echo "*** IP change detected, writing memoryfile ${memoryFile} ***" ; fi
if [ ${writeMemoryfile} -eq 1 ]; then
# truncate file and write header
echo "#############################################################" > ${memoryFile}
echo "# RaspiBlitz IP address memory file." >> ${memoryFile}
echo "# created by script: ${0}" >> ${memoryFile}
echo "#############################################################" >> ${memoryFile}
echo " " >> ${memoryFile}
#
# write a section for each entry in the "origin" array
for i in $( seq 0 4 ); do
echo "# section ${origin[ $i ]}" >> ${memoryFile}
echo "${origin[ $i ]}_old=${ip_addr_curr[$i]}" >> ${memoryFile}
echo "${origin[ $i ]}_CreationTS_old=${creation_ts_curr[ $i ]}" >> ${memoryFile}
echo " " >> ${memoryFile}
done
if [ -f "${logFile}" ]; then echo "===========================================================================================" >> ${logFile} ;fi
if [ -f "${logFile}" ]; then cat ${memoryFile} >> ${logFile} ; fi
if [ -f "${logFile}" ]; then echo "===========================================================================================" >> ${logFile} ;fi
else
# display info on stdout
echo ""
echo "writeMemoryfile=off => show changes"
echo ""
echo "#############################################################"
echo "# RaspiBlitz IP address memory file."
echo "# created by script: ${0}"
echo "#############################################################"
echo " "
for i in $( seq 0 4 ); do
echo "# section ${origin[ $i ]}"
echo "${origin[ $i ]}_old=${ip_addr_curr[$i]}"
echo "${origin[ $i ]}_CreationTS_old=${creation_ts_curr[ $i ]}"
echo " "
done
fi
else
if [ -f "${logFile}" ]; then printf "%s: *** no IP change detected, do nothing... ***\n" "$sts" >> ${logFile} ; fi
if [ ${debugLevel} -gt 0 ]; then echo "*** no IP change detected, do nothing... ***" ; fi
fi
# now create the output for the telegraf "[[inputs.exec]]" section in influx-line-format
#
# 2021-04-19: rename measurement: "raspiblitz_ip_info" -> "ipinfo"
#
# measurement: ipinfo
#
# tags
# * host
# * origin
# * ipaddr
# * ipaddr_prev
# * ipaddr_changed
#
# fields
# * created
# * uptime
# * changed
#
for i in $( seq 0 4 ); do
# sanitize tags
if [ "${ip_addr_curr[$i]}" = "" ]; then ip_addr_curr[$i]='empty' ; fi
if [ "${ip_addr_prev[$i]}" = "" ]; then ip_addr_prev[$i]='empty' ; fi
#
# calculate uptime
ipaddr_online=$(( ${unixTimestamp} - ${creation_ts_curr[ $i ]}))
#
# create influx-line-format output
# only if there is a proper creation timestamp
if [ ${creation_ts_curr[ $i ]} -gt 1000000000 ]; then
influxLine="ipinfo,origin=${origin[ $i ]},ipaddr=${ip_addr_curr[$i]},ipaddr_prev=${ip_addr_prev[$i]},ipaddr_changed=${has_changed[ $i ]} created=${creation_ts_curr[ $i ]}i,uptime=${ipaddr_online}i,changed=${has_changed[ $i ]}i"
if [ -f "${logFile}" ]; then printf "%s: === %s\n" "$sts" "$influxLine" >> ${logFile} ; fi
echo "${influxLine}"
else
if [ -f "${logFile}" ]; then printf "%s: creation time ERROR for origin %s \n" "$sts" "${origin[ $i ]}" >> ${logFile} ; fi
fi
done
# -eof-