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

Affirming What We Already Know: Solicitors Regulation Authority (SRA) is Profoundly Incompetent
"SRA ordered to pay solicitor £50k in costs after failed prosecution"
RMS Was Right 35 Years Ago
Stallman’s viewpoints have remained the same
Fedora is IBM and There's Hardly Any Community Left
It's more like an onboarding mechanism for unpaid labour at (and for) IBM
 
The Letter Sent to the Ringleader of the Alicante Mafia This Week
Call for industrial actions to stop the salary erosion of EPO staff
EPO on Strike
organisation operating outside the Rule of Law
Oracle's Debt Exploded by 22 Billion Dollars in 6 Months, the Ponzi Scheme With Scam Altman Was Classic 'Pump and Dump'
The founder of Oracle now uses his wealth for right-wing ideological reasons, nothing else
Facebook ('Meta') is Dead Meat, This GAFAM Company's Debt Exploded by Almost 33 Billion Dollars in Just 3 Months (11 Billion Per Month)
we can expect many sales/contracts to get canceled
Australia's top nurse takes on Musk, Zuckerberg & rogue health influencers, birthkeepers
Reprinted with permission from Daniel Pocock
The "Alicante Mafia" - Part XVI - The Associates of Mr. Cocainegate Don't Want to Talk About Cocainegate (Right of Reply)
Nobody wanted to talk about cocaine at the EPO
The "Open Source" (Corporate Openwashing) Fake Community Rejects Democracy, Open Source Initiative is in Effect Dead
This is basically the end of the OSI
Cracks and Holes in Microsoft's Slop Bubble (Also, Windows is Declining)
"More Bad News For Xbox As Microsoft Blames Gaming For An Annual Decline In Its PC Business"
Microsoft's Debt Exploded by More Than 20 Billion Dollars This Past Year, Says Microsoft
Expect more mass layoffs
Strike at the EPO Today
Next month we'll start a new EPO series
State of the Slop and The Register MS Runs Ads as 'Articles'
Yesterday we could not find much slop about "Linux"
Gemini Links 30/01/2026: Announcing Crossyword and SYN Attack
Links for the day
Over at Tux Machines...
GNU/Linux news for the past day
IRC Proceedings: Thursday, January 29, 2026
IRC logs for Thursday, January 29, 2026
Gemini Links 29/01/2026: Naps, Letting Go, and Terribly Cold Weather
Links for the day
Links 29/01/2026: Kennedy Center Officials Resigning and Amazon to Cut 16,000 Jobs
Links for the day
Goodbyes to Red Hat and IBM
PIPs let them do the same with less "wasted" on severance or with obscene narrative-shaping
The Need to Understand the Projection Tactics Against RMS
There's an old and common saying (or "wisdom") about who's guilty when there's a fart in elevators (lifts)
Links 29/01/2026: Neocities Is Blocked by Microsoft, “Intellectual Freedom Centers” as the New "Intelligent Design"
Links for the day
Microsoft XBox Dying Not Only as a Console, Reveals Microsoft
Microsoft is trying to rebrand or repurpose the brand
Don't be Mistaken, Microsoft Boasts About Money That Does Not Exist and Revenue (Buying From Oneself!) Is Not Income
the company's debt grew
IBM's Financial Performance in IBM's Own Words: Money Down, Debt Up Sharply
IBM isn't a healthy company
In Dominica, GNU/Linux Has Risen to All-Time High in 2026
a lot of America is moving to Free software this year
The "Alicante Mafia" - Part XV - EPO is on Strike Tomorrow, Lots to be Angry About (Except Money)
We'll soon finish the series
Gemini Links 29/01/2026: "Lady Audley's Secret" and "The Value Of Our Fear" (Carney's Speech)
Links for the day
Emmanuel Macron on Europe's GAFAM Addiction/Dependence: "There is No Such Thing as Happy Vassalage"
Microsoft has long worked to prevent commodification
It's Official, Mass Layoffs at IBM Again (2026)
In a matter of days we'll just see how much IBM's debt has grown
Over at Tux Machines...
GNU/Linux news for the past day
IRC Proceedings: Wednesday, January 28, 2026
IRC logs for Wednesday, January 28, 2026
Laos and Microsoft: About 10% Windows, 0% Bing
There are many more nations like it
EPO Technical Meetings Show no Breakthroughs, a Strike Goes Ahead This Friday
Apparently there was another (fourth) meeting today [...] The industrial actions are working already
Google News as the Sole Source of Slop About "Linux", a Feeder of Slopfarms or Serial Sloppers
At least it's no longer hard to 'contain' the slop problem, knowing which domains are the culprits and seeing that Google is their main 'feeder'
IBM to Announce 'Results' Shortly, Expect Lots of Chaff Like "Quantum" and "Hey Hi" (Nothing Material to Show)
We're still seeing layoffs and an exodus
Links 28/01/2026: ChatGPT Has Financial Problems, White House Sharing Fakes (or Deepfakes) in Official Accounts/Sites
Links for the day
Gemini Links 28/01/2026: FlatCube NES Port Finished and "Why I Still Write on the Small Web in 2026"
Links for the day
Upcoming Techrights Series About the Public Appearances of Richard M. Stallman (RMS) in the United States
we plan to drop all pretences about "Open Source" and instead focus on Software Freedom
Upcoming Techrights Series About the Experiences of EPO Insiders
We'll start the new series some time next week
Links 28/01/2026: Microsoft Ordered to Stop Spying on School Children, Apple's Brand Tarnished by Its Complicity With Human Rights Abusers
Links for the day
Upcoming Techrights Series About the Failure of the Solicitors Regulation Authority (SRA) to Stop Hired Guns Who Work for Americans That Abuse Women
The SRA has demonstrated nothing but considerable incompetence at many levels
The "Alicante Mafia" - Part XIV - The EPO Vice-President Steve Rowan and the Hidden Alicante Connection is a Big Deal
We'll soon take a closer look at Ernst
Gemini Links 28/01/2026: Particle and AirMIDI
Links for the day
Amandine Jambert (EDPB/CNIL/FSFE), motive for lying, trust in blockchain and encryption
Reprinted with permission from Daniel Pocock
Over at Tux Machines...
GNU/Linux news for the past day
IRC Proceedings: Tuesday, January 27, 2026
IRC logs for Tuesday, January 27, 2026