Bonum Certa Men Certa

Using a Single-Board Computer to Monitor IPFS

IPFS lights-based monitoring on self-hosted SBC
IPFS lights-based monitoring on self-hosted SBC (blue is for status, green and red for upstream and downstream payloads)



Summary: IPFS is light and simple enough to run from one's home, even on a low-voltage machine, and the code below can be used as a baseline for monitoring IPFS activity 24/7




#!/usr/bin/python3
# 2019-04-22
# 2020-11-07



from blinkt import set_pixel, show from random import randint,random,shuffle,randrange from time import sleep import argparse import signal

def solid(r,g,b,s): while True: for pixel in range(8): set_pixel(pixel, r, g, b) show() sleep(0.1)

def random_lights3(): while True: for pixel in range(8): r = randint(0, 255) g = randint(0, 255) b = randint(0, 255) set_pixel(pixel, r, g, b) show() sleep(0.1)

def random_lights2(): while True: p=range(8) p=sorted(p, key=lambda x: random()) for pixel in p: r = randrange(0, 255, 16) g = randrange(0, 255, 16) b = randrange(0, 255, 16) set_pixel(pixel, r, g, b) show() sleep(0.1)

def random_lights1(): while True: p=range(8) p=sorted(p, key=lambda x: random()) for pixel in p: r = randrange(0, 255, 8) g = randrange(0, 255, 8) b = randrange(0, 255, 8) set_pixel(pixel, r, g, b) show() sleep(0.1)

def spacer(r,g,b,seconds): while True: for pixel in range(8): set_pixel(pixel, r, g, b) next = (pixel+1)%8 set_pixel(next, 0, 0, 0) show() sleep(seconds)

def reversed_spacer(r,g,b,seconds): while True: for pixel in reversed(range(8)): set_pixel(pixel, r, g, b) prev = (pixel-1)%8 set_pixel(prev, 0, 0, 0) show() sleep(seconds)

def cylon(r,g,b,seconds): while True: for pixel in reversed(range(8)): set_pixel(pixel, r, g, b) prev = (pixel-1)%8 if prev < pixel: set_pixel(prev, 0, 0, 0) show() sleep(seconds) for pixel in range(8): set_pixel(pixel, r, g, b) next = (pixel+1)%8 if next > pixel: set_pixel(next, 0, 0, 0) show() sleep(seconds)

def pulsed_bar(r,g,b,seconds): steps=8 while True: for fade in reversed(range(steps)): r2=r*(fade+1)/steps g2=g*(fade+1)/steps b2=b*(fade+1)/steps # print (fade) for pixel in range(8): set_pixel(pixel, r2, g2, b2)

show() sleep(seconds) for fade in range(int(steps/1)): r2=r*(fade+1)/steps g2=g*(fade+1)/steps b2=b*(fade+1)/steps for pixel in range(8): set_pixel(pixel, r2, g2, b2)

show() sleep(seconds*0.5)

def ipfs(r,g,b,seconds): steps=4 # how many stages in gradient brightness=0.5 # how bright the lights will get bluebright=100 # the brightness of the blue light in the middle (0-255), albeit overriden by input dim=1 # increase to dim down the lights run = 0 # running count for periodic file access while True: # run always (until interruption) run=run+1 # first, open from files the required values, which change over time if (int(run) % 50 == 1): with open(r'~/RateIn', 'r') as f: # open from file the IN value # print(r) lines = f.read().splitlines() r=int(lines[-1]) # read the value # r=int(map(int, f.readline().split())) # prototype, for multiples (stale)

with open(r'~/RateOut', 'r') as f: # open from file OUT value # print(g) # show values, debugging lines = f.read().splitlines() g=int(lines[-1])

with open(r'~/Swarm', 'r') as f: # open from file Swarm value # print(g) # show values, debugging lines = f.read().splitlines() bluebright=int(lines[-1])/2 # print(bluebright)

for fade in reversed(range(steps)): # fade in effect # print(g2) # show values again, debugging # print(r2) r2=r*(fade+1)/steps/dim g2=g*(fade+1)/steps/dim b2=b*(fade+1)/steps/dim

# print(g2) # show values again, debugging # print(r2)

# print (fade) for pixel in range(3): # first 3 LED lights set_pixel(pixel, r2/20, (g2*brightness)+(pixel*1), b2/20)

for pixel in range(5,8): # the other/last 3 lights set_pixel(pixel, (r2*brightness)+(pixel*1), g2/20, b2/20) if (bluebright==0): set_pixel(3, 255, 255, 255) set_pixel(4, 255, 255, 255) else: set_pixel(3, 0, 0, 0) set_pixel(4, 0, 0, bluebright)

show() sleep(seconds/r*r+0.1) for fade in range(int(steps/1)): # fade out effect r2=r*(fade+1)/steps/dim g2=g*(fade+1)/steps/dim b2=b*(fade+1)/steps/dim

for pixel in range(3): set_pixel(pixel, r2/20, (g2*brightness)+(pixel*1), b2/20)

for pixel in range(5,8): set_pixel(pixel, (r2*brightness)+(pixel*1), g2/20, b2/20) set_pixel(3, 0, 0, bluebright) set_pixel(4, 0, 0, 0) show() sleep(seconds/g*g+0.1)

def flashed_bar(r,g,b,seconds): while True: for half in range(4): set_pixel(half,r,g,b) for half in range(4,8): set_pixel(half,0,0,0) show() sleep(seconds) for half in range(4,8): set_pixel(half,r,g,b) for half in range(4): set_pixel(half,0,0,0) show() sleep(seconds)

def handler(signum, frame): print("\nSignal handler called with signal", signum) exit(0)

signal.signal(signal.SIGTERM, handler) signal.signal(signal.SIGINT, handler)

# read run-time options

parser = argparse.ArgumentParser(description="Drive 'blinkt' 8-pixel display.") parser.add_argument("pattern", help="name of light pattern: \ random[1-3], spacer, reversed_spacer, cylon, pulsed_bar, flashed_bar") parser.add_argument("r", metavar="r", type=int, help="red channel, 0-255") parser.add_argument("g", metavar="g", type=int, help="green channel, 0-255") parser.add_argument("b", metavar="b", type=int, help="blue channel, 0-255") parser.add_argument("timing", metavar="s", type=float, \ help="rate of binking in seconds") options = parser.parse_args()

pattern = options.pattern.lower() r = options.r g = options.g b = options.b s = options.timing

if pattern == "solid": solid(r,b,g,s) elif pattern == "random3": random_lights3() elif pattern == "random2": random_lights2() elif pattern == "random1" or pattern == "random": random_lights1() elif pattern == "spacer": spacer(r,g,b,s) elif pattern == "reversed_spacer": reversed_spacer(r,g,b,s) elif pattern == "cylon": cylon(r,g,b,s) elif pattern == "pulsed_bar": pulsed_bar(r,g,b,s) elif pattern == "ipfs": ipfs(r,g,b,s) elif pattern == "flashed_bar": flashed_bar(r,g,b,s) else: print("Unknown pattern") exit(1)

exit(0)





Example runtime: run-blinkt-ipfs.py ipfs 0 0 0 0.00

Based on or derived from baseline blinkt scripts; requires the hardware and accompanying libraries being installed on the system.

For the code to run properly in the above form, given that it takes input from files, the IPFS values need to be periodically written to disk/card, e.g. for every minute of the day:

* * * * * ipfs stats bw | grep RateIn | cut -d ' ' -f 2 | cut -d '.' -f 1 >> ~/RateIn * * * * * ipfs stats bw | grep RateOut | cut -d ' ' -f 2 | cut -d '.' -f 1 >> ~/RateOut * * * * * ipfs swarm peers | wc -l >> ~/Swarm

These lists of numbers can, in turn, also produce status reports to be shown in IRC channels. When our git repository becomes public it'll be included (AGPLv3).

Recent Techrights' Posts

SLAPP Censorship - Part 158 Out of 200: Making Alliances With Men Arrested for Strangling Women Was Always a Terrible Strategy
They work for American slop companies
 
Over at Tux Machines...
GNU/Linux news for the past day
IRC Proceedings: Saturday, August 22, 2026
IRC logs for Saturday, August 22, 2026
Microsoft to Its Workers in April-May: You're Too Old, Go Away. Microsoft in August: Young People, Go Away.
What does this company even sell anymore?
Clownflare Data US-Centric
We are assuming that for national security reasons not many sites in Chinese (or based in China) outsource their traffic to Clownflare
Gemini Links 22/08/2026: Broken Car, Devuan, and Thundermail
Links for the day
Links 22/08/2026: Prince Harry, Elton John and Others Pay High Price for Frivolous Litigation in the UK
Links for the day
'Voluntary' Mass Layoffs at IBM/Red Hat
IBM does not want people to notice what truly goes on there
Another Round of GAFAM Layoffs, This Time Apple
Now Apple "is shutting down an entire Vision Pro team focused on developing gaming features for the mixed-reality headset."
Gemini Links 22/08/2026: The Bodyguard (1992), Minimalism, Backups, and IPFS
Links for the day
Links 22/08/2026: TikTok Settles With Feds, Harms Caused by Social Control Media Gaining Attention
Links for the day
New Data Shows Microsoft's XBox is Really Dying
XBox is a "burning platform"
Over at Tux Machines...
GNU/Linux news for the past day
IRC Proceedings: Friday, August 21, 2026
IRC logs for Friday, August 21, 2026
Sources-First Publication
Thank you for keeping us on track
Ubuntu is Not Linux
I was one of the first users of Ubuntu
Links 21/08/2026: Outrage Over Politicians Who Support Slop-Feeding Data Centres, "America Is About to Get More Expensive"
Links for the day
Gemini Links 21/08/2026: Rain Coming Back and "Small Internet"
Links for the day
Mass Layoffs at IBM, But Mostly in Secret (PIPs and 'Voluntary' Redundancies)
Gerstner laid off a record number of people; Krishna tries to find 'innovative' new ways to cause workers to leave
Slop-ware: Nobody Knows What Code Goes Into Linux and Most Developers Cannot Understand the Rust Code (Even If They Tried)
So nobody is in charge
The Slop Pyramid Scheme (Not Boon!) Isn't Good for GNU/Linux, Even If the Plagiarism Engines (Framed as "Training" or "Intelligence") Almost Always Run GNU/Linux
We need the slop pop - we need the bubble to pop
North America: GNU/Linux Measured at 13%-15% Every Night
many (north) Americans use GNU/Linux at home and are using it to access the Web in the small hours of the morning
Links 21/08/2026: "Silicon Valley’s Billionaire Cults Are Coming for Democracy" and "Who’s Raking it in as the National Debt Explodes?"
Links for the day
SLAPP Censorship - Part 157 Out of 200: What is a 'Defamation Troll'?
"Defamation Mill" also
Northern Europe Leads the Pack in Abandoning Windows After Threats Made to Greenland (Says Clownflare Data)
Clownflare has a vast trove of data, so it cannot be easily dismissed as pure nonsense
Clownflare: In Past 12 Months Microsoft Windows Fell From ~80% to ~75% on Desktops/Laptops in Asia
Microsoft is deep in debt
Secret Layoffs at Microsoft, Apparently More Sites Will Shut Down Entirely
vindicates us and serves to affirm what we've said for over a month
The State of Slopfarms About "Linux" in August 2026
The Web needs serious cleanup, which curation can help deliver
IBM Offers Workers Some Money to Fire Themselves, It's Called "Next Step" and It's Allegedly 'Extended' (Not Enough Fools Have Fired Themselves)
Will IBM executives - including the CEO - ever be held accountable?
£5 Million Unsolicited/Undisclosed Bribes and What That Means to British Politics
It still remains unknown (disclosure denied) who helps fund the £1 million lawfare against us
[Satire] Pocock, Binface & nobodies vs Farage: defamation before UK High Court
Reprinted with permission from Daniel Pocock
The IBM Censorship Team, PIPs (Silent Layoffs) in IBM Europe
There seem to be many de facto layoffs going on at IBM right there
SLAPP Censorship - Part 156 Out of 200: Brett Wilson LLP Becoming Wilson FC
Now acting almost like one-person shop (lots of staff has fled this past year)
Over at Tux Machines...
GNU/Linux news for the past day
IRC Proceedings: Thursday, August 20, 2026
IRC logs for Thursday, August 20, 2026
Gemini Links 21/08/2026: "Ensmallening the BigWeb", "Rust Dependencies"
Links for the day