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

Links 25/10/2026: TMZ Revisits Epstein's Connections to Bill Epsteingate, "Italy Hit by New Cost of Living Protests"
Links for the day
Intercontinental Brigading - Part XIV - Six Years of Learning Irish, But the Real Issue Was Microsoft-controlled 'Secure' (Restricted) Boot
Had I not opposed back doors in Linux, not of this would come about
Microsoft Sort of Tried to Sell XBox Piecewise (Offloading Microsoft)
XBox is in a morbid state
 
Another Form of Microsoft Silent Layoffs: Workers That 'Expire'
When the media becomes a lapdog, not a watchdog, false narratives gain traction
Carte Blanche for GPL Violations 4 Days Ago (by Torvalds)
Slop disclosure is no longer required for the Linux Kernel
There Are No Women That Are Kernel Developers Sent by Corporations Which Claim to Champion Diversity
As noted the other day
Sites with "Linux" in Their Name Cannot Slop and Retain Readers
if they write about "linux "(or "Linux") using LLMs they will be caught, then shunned
At Microsoft, the Silent Layoffs Impact Executives Also
Microsoft hid the real story of Helen Chiang
Linus Torvalds Defected to Enshittification
Linus Torvalds is betraying a generation of high(er) standards
Microsoft’s Spin About Mass Layoffs and Shutdowns: They "Never Should Have Existed"
Microsoft-sponsored spin
It's Slop
Maybe we'll exclude It's Slop from our curation. It's a Linux Foundation outpost of sorts, an apologist of sloppy code and plagiarism.
Gemini Links 25/10/2026: Moana (2026) and OpenBSD Updates
Links for the day
The Netherlands Fast to Adopt GNU/Linux, "Market Share" Rises to Two-Digit Value (on Desktops/Laptops)
It peaked at around 20% yesterday
DST Still Needs to Get Abolished
Get rid of DST, efficiency will improve and systems will become more reliable
PHP2Shell as Paid-for FUD Campaign (Intended to Help Sell Slop and Fake "Market Value" of Slop Pushers)
PHP2Shell considered overhyped [...] Remember all the paid-for hype regarding Mythos? What happened to all that?
Over at Tux Machines...
GNU/Linux news for the past day
IRC Proceedings: Saturday, October 24, 2026
IRC logs for Saturday, October 24, 2026
Gemini Links 24/10/2026: Arch Linux Journey and Amin Bandali's Priorities
Links for the day
Bluewashing as a Form of Silent Layoffs
IBM will continue to shed off loads of workers while its debt climbs
Turning 20 in 2 Weeks and Upcoming Network Maintenance
That ought not interrupt our anniversary
Microsoft Shutdowns Accelerating, More Shutdowns Revealed (Not Connected to Gaming)
Silent layoffs disguised as "voluntary" "exits"
Links 24/10/2026: Microsoft Blackmail and Lingering Unrest in France:
Links for the day
Gemini Links 24/10/2026: From Bendigo to Kerang, Enshittification of Radio and Music in the UK
Links for the day
Red Hat Sinks With the Blue (IBM) Ship
As IBM's debt continues to soar so do the silent layoffs
Linux is Not Controlled by Linus (Torvalds)
Torvalds has become "90% marketing hype"
The "No Pain No Gain" Expectations in Publishing
Sometimes truth hurts; but that does not mean it mustn't be told
Intercontinental Brigading - Part XIII - Censorship by All Means Available in a Continent So Far Away, as 'Secure' (Restricted, Restriction by Microsoft) Boot Has a Crisis of Legitimacy
it's about America controlling sites and computers everywhere
Links 24/10/2026: Oligarchs Already Buy US Elections, GAFAM Front Group "EFF" Speaks of "Vulnerability Apocalypse"
Links for the day
Gemini Links 24/10/2026: Automobile Differential Tire Movement, Samsung Washer Woe, and Slop Scraping
Links for the day
Over at Tux Machines...
GNU/Linux news for the past day
IRC Proceedings: Friday, October 23, 2026
IRC logs for Friday, October 23, 2026
As Usual, Late on a Friday XBox (Microsoft) Releases Evidence of Its Demise
We covered several such Friday announcements earlier this year
Gemini Links 24/10/2026: Break/Fix and OpenStreetMap
Links for the day
Links 23/10/2026: Slop "is Scaling Transnational Repression" and Infringement and DMCA Suits Against Suno/Anthropic (Plagiarism Blenders)
Links for the day
More Shutdowns at Microsoft, Hundreds of Workers Impacted Shortly
It's not the entire wave, just part of it
The Register MS: About 60 Mentions of "AI" in One Day Are Paid-for Spam (Sponsored Hype, Composed by the Companies Covered)
The Register MS is a dying site
Links 22/10/2026: MElon (Elon Musk) Election Interference and Perl/Raku Foundation by the Numbers
Links for the day
Techrights Audience Grew as a Function of the Intensity of Attacks on Its Existence
We try to publish fewer stories but better (not necessarily long but at least important) stories
TechRepublic is Becoming a Slopfarm
It seems like TechRepublic became LLM slop (maybe all of it, maybe only some of it for now)
Techrights is Not About GNU/Linux, Tux Machines Is
When we say "GNU/Linux" we emphasise the GNU
The World Needs Activists With Social Skills and Perseverance
An everyday activist makes life better for everybody, everywhere (not for personal gain or even credit)
Intercontinental Brigading - Part XII - Lawfare to Cover Up Microsoft's Restricted Boot Calamity (Microsoft as Authority Over Linux), Garrett Wants to Talk About Penises Instead
When lawsuits become a political weapon
Without Microsoft's Monopoly (and Monopoly Rents) the Inevitable Microsoft Mass Layoffs Carry on Endlessly
Microsoft Windows is not retaining the dominance it once had
IBM's Debt Grew About $2 Billion in 3 Months
The silent layoffs still seem to impact Red Hat
Over at Tux Machines...
GNU/Linux news for the past day
IRC Proceedings: Thursday, October 22, 2026
IRC logs for Thursday, October 22, 2026