Skip to content

Instantly share code, notes, and snippets.

@cannorin
Created July 4, 2023 09:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cannorin/36e8b3f783ed1fd8b56863c7ced8d00f to your computer and use it in GitHub Desktop.
Save cannorin/36e8b3f783ed1fd8b56863c7ced8d00f to your computer and use it in GitHub Desktop.
#!/bin/bash
# This code is licensed under CC0.
# http://creativecommons.org/publicdomain/zero/1.0/deed.en
# Requirements:
# - sysstat (mpstat)
# - bc
# - curl
# - collectd
# - imagemagick
# - jq
MASTODON_URL=https://yourdomain.com
MASTODON_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
RRD_DIR=/var/lib/collectd/rrd/yourdomain.com
TEMP_DIR=/tmp/mastodon-system-bot
mkdir -p $TEMP_DIR
CPU_CORES=$(grep -c '^processor' /proc/cpuinfo)
CPU_IDLE_PERCENT=$(LANG=C mpstat 1 1 | grep Average | awk '{print $NF}')
CPU_PERCENT=$(echo "100 - $CPU_IDLE_PERCENT" | bc)
RAM_VALUE=$(free -m | grep Mem | awk '{print $3}')MB
RAM_PERCENT=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
TEXT=$(cat << END
CPU: ${CPU_PERCENT}%
RAM: ${RAM_VALUE} (${RAM_PERCENT}%)
END
)
# render the system metrics to <working-dir>/monitor.png
function generateGraphs() {
rrdtool graph $TEMP_DIR/memory.png --start=-3600 --end=-0 \
DEF:memory=$RRD_DIR/memory/memory-used.rrd:value:AVERAGE \
LINE:memory#FF0000:Memory
CPU_QUERY=""
COLOR_STEP=$((255 / $CPU_CORES))
for ((i=0; i < $CPU_CORES; i++)); do
CPU_QUERY="$CPU_QUERY DEF:cpu${i}usr=${RRD_DIR}/cpu-${i}/cpu-user.rrd:value:AVERAGE"
CPU_QUERY="$CPU_QUERY DEF:cpu${i}sys=${RRD_DIR}/cpu-${i}/cpu-system.rrd:value:AVERAGE"
CPU_QUERY="$CPU_QUERY CDEF:cpu${i}sum=cpu${i}usr,cpu${i}sys,+"
CPU_QUERY="$CPU_QUERY VDEF:cpu${i}=cpu${i}sum,AVERAGE"
COLOR_TMP=$(($COLOR_STEP * $i))
COLOR=$(printf "%02X" $COLOR_TMP)
CPU_QUERY="$CPU_QUERY LINE:cpu${i}#00${COLOR}FF:CPU${i}"
done
rrdtool graph $TEMP_DIR/cpu.png --start=-3600 --end=-0 $CPU_QUERY
rrdtool graph $TEMP_DIR/packets.png --start=-3600 --end=-0 \
DEF:rx=$RRD_DIR/interface-eth0/if_packets.rrd:rx:AVERAGE \
LINE:rx#00FF00:rx_packets \
DEF:tx=$RRD_DIR/interface-eth0/if_packets.rrd:tx:AVERAGE \
LINE:tx#FF0000:tx_packets
convert $TEMP_DIR/memory.png $TEMP_DIR/cpu.png $TEMP_DIR/packets.png -append monitor.png
rm $TEMP_DIR/*.png
}
generateGraphs
ID=$(curl $MASTODON_URL/api/v2/media \
-H "Authorization: Bearer $MASTODON_TOKEN" \
-H "Content-Type: multipart/form-data" \
-F file=@monitor.png | jq '.id')
curl $MASTODON_URL/api/v1/statuses \
-H "Authorization: Bearer $MASTODON_TOKEN" \
-F "visibility=unlisted" \
-F "status=$TEXT" \
-F "media_ids[]=$ID"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment