Over the weekend I had the idea to add a tab onto my blog, to show some of the statistics I collect within my network
As I already run LibreNMS it was just a matter of creating a script on one of my Virtual Machines that will collect the graphs using LibreNMS API and then push them to my web server that runs Caddy.
Here is (a simplified version) of the the main script graph_monitor.sh, that will pull the graphs from my LibreNMS instance, put them all into a temporary directory, then SSH into my web server and copy them over.
1 2 3 4 5 6 7 8 9 10 #!/bin/bash header='X-Auth-Token: LOL-not-showing-you-this' python3 gen_date_png.py curl -H "$header" https://MYLIBRENMSIP/api/v0/devices/AMS1BR1/device_ping_perf --output /home/MYUSER/temp_charts/AMS1BR1_ping.png curl -H "$header" https://MYLIBRENMSIP/api/v0/devices/OSR1BR2/ports/tun2/port_bits --output /home/MYUSER/temp_charts/OSR1BR2_tun2.png ssh MYUSER@MYSRV "rm -rf /home/MYUSER/site/assets/img/graphs/" scp -r /home/MYUSER/temp_charts/ MYUSER@MYSRV:/home/MYUSER/site/assets/img/graphs/
I just use cron to run it every 10 minutes.
1 */10 * * * * /home/MYUSER/graph_monitor.sh
Obviously I was too lazy to figure out how to get an image with the current date and time for what was a quick fun weekend project. So I did the logical thing and asked ChatGPT to do it for me - the contents of gen_date_png.py were AI-generated, it is below:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 from PIL import Image, ImageDraw, ImageFont from datetime import datetime # Get current date and time in UTC now_utc = datetime.utcnow() # Create a new image with a white background image = Image.new('RGB', (800, 200), 'white') draw = ImageDraw.Draw(image) # Choose a font and size (increased font size) font = ImageFont.load_default() font_size = 144 # Define the text to be written text = "Graphs last updated on:\n" + now_utc.strftime("%Y-%m-%d %H:%M:%S UTC") # Calculate text position to center it in the image text_width, text_height = draw.textsize(text, font=font) x = (image.width - text_width) / 2 y = (image.height - text_height) / 2 # Add text to the image draw.text((x, y), text, font=font, fill=(0, 0, 0)) # Save the image as a PNG file image.save('/home/MYUSER/temp_charts/current_datetime.png')
It’s not looking pretty, the default font doesn’t seem to take in the size. But it works and I will fix it in the future.
Even though I altered my Caddyfile with Cache-Control header no-store it seems the graphs are still being cached client-side, requiring CTRL+F5 to refresh.
Again - hopefully will fix in the future.