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

Voice for the Impoverished
the country's leaders attack the country's own press
Contemptuous Law Firm Accusing Others of Contempt of Court
Keeping a running tally can help
Links 10/10/2026: Let's Encrypt Making Changes (Problem for Small Sites/Operations), Quartz is Officially a Slopfarm (Busted)
Links for the day
 
Links 11/10/2026: "Execution TV" (Iran Aped by US) and ‘Digital Oblivion’ Caused by Slop Frenzy Online
Links for the day
Gemini Links 11/10/2026: Adults Dressing Up as Animals, 44th Birthday, and More
Links for the day
Running a Country's Economy by Borrowing Over $400,000,000,000 Per Month
This is the hallmark of an economy in irreversible decline
Brigading Against Women - Part XXVI - Trying to Deplatform Critics of Microsoft's Restricted Boot
Like James Bottomley, Matthew Garrett served Microsoft's agenda while employed and salaried by other companies
Anderon Is Not a Real Company, It's an IBM Bailout Dressed Up or Wrapped Up In Buzzwords
It certainly does seem like they receive money from taxpayers for nothing, or for IBM to do mass layoffs/closure at Albany under the guise of "making a new spinoff"...
Over at Tux Machines...
GNU/Linux news for the past day
IRC Proceedings: Saturday, October 10, 2026
IRC logs for Saturday, October 10, 2026
Gemini Links 10/10/2026: Radio Romania International, Avoiding GAFAM, Open Camera, and Another Palm
Links for the day
The 2026 Slop Prediction (Slopfarms Perishing)
Morality in the "digital world" has deteriorated profoundly
netsplit.de (Survey of IRC Networks and History) Only Partly Functional This Month
Get well soon, netsplit.de
Microsoft Cuts
GAFAM enshittification
NVIDIA Acts Like It Cannot Pay Salaries (Too Many Obligations, Sales in Circular Financing, or Basically Accounting Fraud)
Masters of acting as clients of themselves
Paying for elections, Reform UK illegal confession in High Court
Reprinted with permission from Daniel Pocock
Microsoft Abuses PERM and Lays Off Workers in India
The US government has made it easier for Microsoft to hide the mass layoffs
The GAFAM Elections in the United States
If the election is run by platforms that have back doors "baked-in" and if the communications are overseen by GAFAM, you would not have to be a "nutty MAGAt" to dispute the outcome
More GAFAM Layoffs (Late on Friday Night)
They say they are worth trillions, but they don't even make money
Male-Dominated EPO Fails to Have "Concrete Measures to Support Female Staff"
Being a female at the EPO is exceptionally hard
Brigading Against Women - Part XXV - No Anonymity for People Who Did Illegal Things
"Empathy is the sunlight to the vampire of culture."
Production Freeze at the European Patent Office (Opposing Monarchy, Institutional Maladministration and Corruption)
Eight reasons to participate
Links 10/10/2026: Microsoft 'Open' 'AI' Silencing Critics, "Data Centres are the New Front Line in the Russia-Ukraine War"
Links for the day
Over at Tux Machines...
GNU/Linux news for the past day
IRC Proceedings: Friday, October 09, 2026
IRC logs for Friday, October 09, 2026
Gemini Links 10/10/2026: Optimism, Stargazing, "Life Without Smartphone", and Fairphone 4
Links for the day
Links 09/10/2026: Stranded Busan Shark Still a 'Circus', Endangered Monkey Rescued, BBC Shells Out Money
Links for the day
Gemini Links 09/10/2026: Manifesto, Slop, Geminispace, and "Cryptography of the Internet"
Links for the day
Betanews is Still a Slopfarm, Articles About "Linux" Are Fake and Plagiarism by LLMs
Cheaters and plagiarists aren't journalists; they're people who rip off and harm journalists
The Register MS Sponsored to Hype Up "Datacenters" and "AI" (Bubble, Pyramid Scheme)
"Sponsored by Cisco" with "AI" 26 times in this page
James Bottomley Has Promoted Microsoft-Controlled Restricted ('Secure') Boot, His Blog Has Just Been Cracked
Does this meet IBM's and Microsoft's standards for "distinguished" (in security)?
Links 09/10/2026: "Internet Archive to Demo Wayback Machine at Friday’s Uniqlo Street Festival", France Wages Censorship War via DNS
Links for the day
Controlled Opposition
The underlying concept is hardly new
More Stallmans
We need more Stallmans, we don't need to change Stallman
SUEPO Munich (EPO Staff Union in the Main Headquarters) Opposes Monarchy ('Cocaine King' Campinos), Plans Online Meeting Next Week
They may have about 1,000 workers joining in
World Mental Health Day is Tomorrow and EPO Staff Talks About What the Job Does to Workers
In recent years we've written a great deal about mental health consideration in relation to work, with a focus on "IT"
GNU/Linux Flirts With 20% "Market Share" in North America Overnight
Who should we trust on GNU/Linux? Microsofters on an armchair or Cloudflare Radar?
You Definitely Do NOT Wish to Live Close to a Datacentre
put aside for a moment the noise, the pollution...
New Site Makes the Case Against Adoption of Omarchy, But Focuses Almost Entirely on Politics
Let's examine what the page says and what points it focuses on
Brigading Against Women - Part XXIV - Nobody's Name is Unspeakable
Names are not sacred
Microsoft is in Trouble (With the Regime It Sponsored)
It seems like Microsoft paying the existing regime/dictatorship wasn't enough
GGG Pot Calls the Kettle Black
"It means a situation in which somebody accuses someone else of a fault which the accuser shares, and therefore is an example of psychological projection, or hypocrisy. Use of the expression to discredit or deflect a claim of wrongdoing by attacking the originator of the claim for their own similar behaviour (rather than acknowledging the guilt of both) is the tu quoque logical fallacy."
In the United Kingdom, Rising Cost of Hardware Benefits GNU/Linux
GNU/Linux rose from about 4% to almost 6% in one year
Japanese Targets of Cyber Breaches or Insider Threats
Japanese government bureau and major firms experience data breaches
Gemini Links 09/10/2026: Optimism, Stargazing, and Solar MiniServer
Links for the day
The Microsoft Ban Should Go Further (Telecommunications Cybersecurity and Resilience Act Incompatible With Back Doors)
it's not difficult to see where to start
When Americans Export a 'Suicide Mission' to Other Continents
I worry that this culture of debt-taking and overconsumption is being spread from the US to Europe
The Register MS: "AI" Several Times in Same Headline, 31 Times in Page. The Register MS Was Paid to Do This.
The phenomenon is commercial (paid media), not scientific
The Outcome of Microsoft Ban Was Predictable
told you so
Over at Tux Machines...
GNU/Linux news for the past day
IRC Proceedings: Thursday, October 08, 2026
IRC logs for Thursday, October 08, 2026