Skip to content

Instantly share code, notes, and snippets.

@Stadicus
Last active November 21, 2021 12:36
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save Stadicus/ffbbd855d23cd068f7b739cae6440f4b to your computer and use it in GitHub Desktop.
Save Stadicus/ffbbd855d23cd068f7b739cae6440f4b to your computer and use it in GitHub Desktop.
Thundroid: System overview MotD
#!/bin/sh
# by Stadicus
# make executable and copy script to /etc/update-motd.d/
# root must be able to execute bitcoin-cli and lncli
# set colors
color_red='\033[0;31m'
color_green='\033[0;32m'
color_yellow='\033[0;33m'
color_gray='\033[0;37m'
# set datadir
bitcoin_dir="/home/bitcoin/.bitcoin"
lnd_dir="/home/bitcoin/.lnd"
# get uptime & load
load=$(w | grep "load average:" | cut -c11-)
# get memory
ram_avail=$(free -m | grep Mem | awk '{ print $7 }')
ram=$(printf "%sM / %sM" "${ram_avail}" "$(free -m | grep Mem | awk '{ print $2 }')")
if [ ${ram_avail} -lt 100 ]; then
color_ram="${color_red}\e[7m"
else
color_ram=${color_green}
fi
# get storage
sd_free_ratio=$(printf "%d" "$(df -h | grep "/$" | awk '{ print $4/$2*100 }')") 2>null
sd=$(printf "%s (%s%%)" "$(df -h | grep '/$' | awk '{ print $4 }')" "${sd_free_ratio}")
if [ ${sd_free_ratio} -lt 10 ]; then
color_sd="${color_red}"
else
color_sd=${color_green}
fi
hdd_free_ratio=$(printf "%d" "$(df -h | grep '/mnt/hdd$' | awk '{ print $4/$2*100 }')") 2>null
hdd=$(printf "%s (%s%%)" "$(df -h | grep '/mnt/hdd$' | awk '{ print $4 }')" "${hdd_free_ratio}")
if [ ${hdd_free_ratio} -lt 10 ]; then
color_hdd="${color_red}\e[7m"
else
color_hdd=${color_green}
fi
# get network traffic
network_rx=$(ifconfig eth0 | grep 'RX bytes' | awk '{ print $3$4 }' | sed 's/[()]//g')
network_tx=$(ifconfig eth0 | grep 'TX bytes' | awk '{ print $7$8 }' | sed 's/[()]//g')
# Bitcoin blockchain
btc_path=$(command -v bitcoin-cli)
if [ -n ${btc_path} ]; then
btc_title="฿itcoin"
chain="$(bitcoin-cli -datadir=/home/bitcoin/.bitcoin getblockchaininfo | jq -r '.chain')"
if [ -n $chain ]; then
btc_title="${btc_title} (${chain}net)"
# get sync status
block_chain="$(bitcoin-cli -datadir=${bitcoin_dir} getblockcount)"
block_verified="$(bitcoin-cli -datadir=${bitcoin_dir} getblockchaininfo | jq -r '.blocks')"
block_diff=$(expr ${block_chain} - ${block_verified})
progress="$(bitcoin-cli -datadir=${bitcoin_dir} getblockchaininfo | jq -r '.verificationprogress')"
sync_percentage=$(printf "%.2f%%" "$(echo $progress | awk '{print 100 * $1}')")
if [ ${block_diff} -eq 0 ]; then # fully synced
sync="OK"
sync_color="${color_green}"
sync_behind=" "
elif [ ${block_diff} -eq 1 ]; then # fully synced
sync="OK"
sync_color="${color_green}"
sync_behind="1 block behind"
elif [ ${block_diff} -le 10 ]; then # <= 2 blocks behind
sync="Catching up"
sync_color="${color_red}"
sync_behind="${block_diff} blocks"
else
sync="In progress"
sync_color="${color_red}"
sync_behind="${sync_percentage}"
fi
# get last known block
last_block="$(bitcoin-cli -datadir=${bitcoin_dir} getblockcount)"
if [ ! -z "${last_block}" ]; then
btc_line2="${btc_line2} ${color_gray}(block ${last_block})"
fi
# get mem pool transactions
mempool="$(bitcoin-cli -datadir=${bitcoin_dir} getmempoolinfo | jq -r '.size')"
else
btc_line2="${color_red}NOT RUNNING\t\t"
fi
fi
# get public IP address & port
public_ip=$(curl -s ipinfo.io/ip)
public_port=$(cat ${bitcoin_dir}/bitcoin.conf 2>null | grep port= | awk -F"=" '{print $2}')
if [ "${public_port}" = "" ]; then
if [ $chain = "test" ]; then
public_port=18333
else
public_port=8333
fi
fi
public_check=$(curl -s https://bitnodes.earn.com/api/v1/nodes/me-${public_port}/ | jq .success)
if [ $public_check = "true" ]; then
public="Yes"
public_color="${color_green}"
else
public="Not reachable"
public_color="${color_red}"
fi
public_addr="${public_ip}:${public_port}"
# get lightning info
# Eclair
#ln_alias="$(/home/bitcoin/bin/eclair-cli getinfo | jq -r '.alias')" 2>null
#ln_port="$(/home/bitcoin/bin/eclair-cli getinfo | jq -r '.port')"
#ln_peers_total="$(/home/bitcoin/bin/eclair-cli peers | jq '. | length')"
#ln_peers_online="$(/home/bitcoin/bin/eclair-cli peers | jq '[.[] | select(.state=="CONNECTED")] | length')"
#ln_channels_total="$(/home/bitcoin/bin/eclair-cli channels | jq '. | length')"
#ln_channels_online="$(/home/bitcoin/bin/eclair-cli channels | jq '[.[] | select(.state=="NORMAL")] | length')"
# LND
ln_alias="$(/usr/local/bin/lncli --macaroonpath=${lnd_dir}/readonly.macaroon --tlscertpath=${lnd_dir}/tls.cert getinfo | jq -r '.alias')" 2>null
ln_channels_online="$(/usr/local/bin/lncli --macaroonpath=${lnd_dir}/readonly.macaroon --tlscertpath=${lnd_dir}/tls.cert getinfo | jq -r '.num_active_channels')"
ln_channels_total="$(/usr/local/bin/lncli --macaroonpath=${lnd_dir}/readonly.macaroon --tlscertpath=${lnd_dir}/tls.cert listchannels | jq '.[] | length')"
printf "
${color_yellow} ___________
${color_yellow} / ./ %s: ${color_gray}Bitcoin Core & Lightning
${color_yellow} / ./ %s
${color_yellow} / ./ ${color_gray}%s
${color_yellow} / ./___
${color_yellow} /____ ./ %-24s %-24s %-20s
${color_yellow} / ./ ${color_gray}Memory ${color_ram}%-16s${color_gray}Sync ${sync_color}%-14s${color_gray} %s
${color_yellow} / ./ ${color_gray}SSD ${color_sd}%-16s${color_gray} %-14s %s / %s Channels online
${color_yellow} / ./ ${color_gray}HDD ${color_hdd}%-16s${color_gray}Public ${public_color}%-14s
${color_yellow} / ./ ${color_gray}Bandwith ▲ %-12s %s
${color_yellow} / / ${color_gray} ▼ %-12s Mempool ${mempool} tx
${color_yellow} /. %s
%s %s
" \
"Thundroid" \
"-----------------------------------------------------------------------" \
"${load}" \
"Ressources free" "${btc_title}" "Lightning (LND)" \
"${ram}" "${sync}" "${ln_alias}" \
"${sd}" "${sync_behind}" "${ln_channels_online}" "${ln_channels_total}" \
"${hdd}" "${public}" \
"${network_tx}" "${public_addr}" \
"${network_rx}" \
"-----------------------------------------------------------------------"
echo "$(tput -T xterm sgr0)"
@dennisreimann
Copy link

Thansk a lot for the tutorial and scripts! I've just finished setting up my own lightning node 👍

Here are two minor things that could be improved in this script, at least these changes fixed warnings for me:

Line 56: Use the previously defined variable for the bitcoin directory:

chain="$(bitcoin-cli -datadir=${bitcoin_dir} getblockchaininfo | jq -r '.chain')"

Line 133–135: Add the --lnddir=${lnd_dir} so that this script can find the .lnd/tls.cert file regardless of which user runs it.

ln_alias="$(/usr/local/bin/lncli --lnddir=${lnd_dir} --macaroonpath=${lnd_dir}/readonly.macaroon --tlscertpath=${lnd_dir}/tls.cert getinfo | jq -r '.alias')" 2>null
ln_channels_online="$(/usr/local/bin/lncli --lnddir=${lnd_dir} --macaroonpath=${lnd_dir}/readonly.macaroon --tlscertpath=${lnd_dir}/tls.cert getinfo | jq -r '.num_active_channels')"
ln_channels_total="$(/usr/local/bin/lncli --lnddir=${lnd_dir} --macaroonpath=${lnd_dir}/readonly.macaroon --tlscertpath=${lnd_dir}/tls.cert listchannels | jq '.[] | length')"

Thanks again! Glad you wrote it all up, your how to helped a lot! :D

@sangaman
Copy link

Thanks a lot! By the way, I noitced a typo on line 155: Ressources

@Janaka-Steph
Copy link

btc_line2 is not displayed, right?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment