Compare commits
No commits in common. "25332962954e317f7606b8c5413b7cf35f1788ed" and "12b01c989bbcdbc355fa261115660bd8a4954bf6" have entirely different histories.
2533296295
...
12b01c989b
File diff suppressed because one or more lines are too long
Binary file not shown.
Before Width: | Height: | Size: 20 KiB |
Binary file not shown.
Before Width: | Height: | Size: 120 KiB |
Binary file not shown.
Before Width: | Height: | Size: 83 KiB |
Binary file not shown.
Before Width: | Height: | Size: 115 KiB |
Binary file not shown.
Before Width: | Height: | Size: 109 KiB |
0
2025-SELF/notes.txt
Normal file
0
2025-SELF/notes.txt
Normal file
Binary file not shown.
Before Width: | Height: | Size: 203 KiB |
@ -7,7 +7,7 @@ patat:
|
|||||||
left: auto
|
left: auto
|
||||||
right: auto
|
right: auto
|
||||||
top: auto
|
top: auto
|
||||||
incrementalLists: false
|
incrementalLists: true
|
||||||
speakerNotes:
|
speakerNotes:
|
||||||
file: ./notes.txt
|
file: ./notes.txt
|
||||||
pandocExtension:
|
pandocExtension:
|
||||||
@ -15,26 +15,35 @@ patat:
|
|||||||
- emoji
|
- emoji
|
||||||
links:
|
links:
|
||||||
osc8: true
|
osc8: true
|
||||||
images:
|
|
||||||
backend: w3m
|
|
||||||
path: '/usr/libexec/w3m/w3mimgdisplay'
|
|
||||||
...
|
...
|
||||||
|
|
||||||
|
<!--
|
||||||
|
So for the past few years I've been coming to SELF, and hearing all these great
|
||||||
|
talks, and having just got my amateur radio license at last year's conference,
|
||||||
|
I had an idea for something a bit chaotic.
|
||||||
|
|
||||||
|
I had some really grand ideas for this, and had to cut it back a bit due to
|
||||||
|
time constraints with releases of Rocky, but I still think we're going to have
|
||||||
|
a good time, and perhaps there's some information that can be gleaned at the
|
||||||
|
end.
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
A Rocky Linux Disasterpiece
|
A Rocky Linux Disasterpiece
|
||||||
|
|
||||||
# Background
|
# Background
|
||||||
|
|
||||||
## Who Am I
|
|
||||||
<!--
|
<!--
|
||||||
|
So for the past few years I've been coming to SELF, and hearing all these great
|
||||||
|
talks, and having just got my amateur radio license at last year's conference,
|
||||||
|
I had an idea for something a bit chaotic.
|
||||||
|
|
||||||
|
I had some really grand ideas for this, and had to cut it back a bit due to
|
||||||
|
time constraints with releases of Rocky, but I still think we're going to have
|
||||||
|
a good time, and perhaps there's some information that can be gleaned at the
|
||||||
|
end.
|
||||||
|
|
||||||
-->
|
-->
|
||||||
|
|
||||||
* Neil Hanlon
|
|
||||||
* Open Source Systems Engineer @ CIQ
|
|
||||||
* Founder @ Rocky Linux
|
|
||||||
* Amateur Radio: N1HAN
|
|
||||||
* Complaints (mine): bsky.app/profile/shrug.pw
|
|
||||||
|
|
||||||
## Why Are We Here
|
## Why Are We Here
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
@ -73,20 +82,12 @@ As most solutions should, we began by taking an objective look at our needs and
|
|||||||
* Incident notifications
|
* Incident notifications
|
||||||
* Monitoring visibility
|
* Monitoring visibility
|
||||||
* Escalations that aren’t spam
|
* Escalations that aren’t spam
|
||||||
* A bit of levity
|
|
||||||
|
|
||||||
## Positively Ludicrous Notifications
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
# tHe FuTuRE
|
# tHe FuTuRE
|
||||||
|
|
||||||
## Our Replacement Stack
|
## Our Replacement Stack
|
||||||
<!--
|
|
||||||
|
|
||||||
-->
|
* Prometheus ➔ Alertmanager
|
||||||
|
|
||||||
* Prometheus (Mirmir) ➔ Alertmanager
|
|
||||||
* Alertmanager ➔ Iris.claims
|
* Alertmanager ➔ Iris.claims
|
||||||
* Iris.claims ➔ Oncall.tools
|
* Iris.claims ➔ Oncall.tools
|
||||||
* Notifications ➔ Fan-out to:
|
* Notifications ➔ Fan-out to:
|
||||||
@ -96,107 +97,62 @@ As most solutions should, we began by taking an objective look at our needs and
|
|||||||
* Restaurant pagers
|
* Restaurant pagers
|
||||||
* Meshtastic
|
* Meshtastic
|
||||||
|
|
||||||
|
. . .
|
||||||
|
|
||||||
**Ops Tools**
|
**Ops Tools**
|
||||||
|
|
||||||
* Ansible
|
|
||||||
* Grafana
|
* Grafana
|
||||||
* Loki
|
|
||||||
* OpenSearch
|
* OpenSearch
|
||||||
|
* Ansible
|
||||||
|
|
||||||
|
|
||||||
## Prometheus / Alertmanager
|
|
||||||
<!--
|
|
||||||
-->
|
|
||||||
|
|
||||||
### Prometheus / Mirmir
|
|
||||||
|
|
||||||
* Time-series database / monitoring system
|
|
||||||
* Scrapes metrics from services, allows querying via PromQL
|
|
||||||
* Infinitely extensible
|
|
||||||
* Mirmir can be added as you scale
|
|
||||||
|
|
||||||
### Alertmanager
|
|
||||||
|
|
||||||
* Handles alerts generated by Prometheus (and other sources)
|
|
||||||
* Groups, Inhibits, Silences, and Dedupes
|
|
||||||
* Direct routing to notification channels based on rules
|
|
||||||
* Centralized alert delivery / incident management
|
|
||||||
|
|
||||||
|
|
||||||
## Iris.claims / Oncall.tools
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Both from linkedin
|
|
||||||
Enriches with routing rules, escalations, schedules
|
|
||||||
-->
|
|
||||||
|
|
||||||
### Iris.claims
|
|
||||||
|
|
||||||
* Incident notification and management system
|
|
||||||
* Enriches Alertmanager alerts
|
|
||||||
* Handles notification to owners and stakeholders
|
|
||||||
* Bridge between alerting tools and human scheduling
|
|
||||||
* Supports prometheus metrics for monitoring
|
|
||||||
* who does watch the watchmen?
|
|
||||||
|
|
||||||
### Oncall.tools
|
|
||||||
|
|
||||||
* Lightweight on-call scheduling
|
|
||||||
* Calendar-based scheduling w/ an API
|
|
||||||
* Hydrates Iris with up-to-date schedule information
|
|
||||||
|
|
||||||
## iris.claims
|
|
||||||

|
|
||||||
## oncall.tools
|
|
||||||

|
|
||||||
|
|
||||||
# Inputs and Outputs
|
|
||||||
## Monitoring Inputs
|
## Monitoring Inputs
|
||||||
|
|
||||||
<!--
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
* Prometheus/OpenTelemetry exporters
|
* Prometheus/OpenTelemetry exporters
|
||||||
* UptimeKuma for endpoint monitoring
|
* UptimeKuma for endpoint monitoring
|
||||||
* TLS cert expiration checks
|
* TLS cert expiration checks
|
||||||
* Disk usage, load average, etc.
|
* Disk usage, load average, etc.
|
||||||
* Service-specific KPIs
|
* Service-specific KPIs
|
||||||
* Cronjob-driven questionable life choices
|
* Cronjob-driven questionable life choices
|
||||||
* "The compose failed"
|
|
||||||
* "Doctors hate this one weird trick for cleaning /tmp"
|
|
||||||
|
|
||||||
|
|
||||||
## Notification Channels
|
## Notification Channels
|
||||||
<!--
|
|
||||||
|
|
||||||
Iris supports some channels out of the box, like Slack, Email, and Voice/SMS.
|
|
||||||
|
|
||||||
I've been working on adding generic support for MQTT, to integrate with basically anything.
|
|
||||||
-->
|
|
||||||
|
|
||||||
* Email: would be better with stamps
|
* Email: would be better with stamps
|
||||||
* Voice/SMS: Twilio, CallMeBot
|
* Voice/SMS: Twilio, CallMeBot
|
||||||
* we don't, but you could
|
* we don't, but you could
|
||||||
* ~~Slack~~ Mattermost (Webhooks)
|
* ~~Slack~~ Mattermost (Webhooks)
|
||||||
* MQTT: The glue for all things absurd
|
* MQTT: The glue for all things absurd:
|
||||||
* Restaurant pagers from eBay
|
* Restaurant pagers from eBay
|
||||||
* Meshtastic LoRa nodes
|
* Meshtastic LoRa nodes
|
||||||
* POCSAG Pagers
|
* (Almost) Radiograms and APRS
|
||||||
* A bell attached to a wire controlled by a servo
|
|
||||||
* Radiograms and DMR SMS
|
## Live Demo Preview
|
||||||
|
|
||||||
|
* Trigger alert in Grafana
|
||||||
|
* Alertmanager routes
|
||||||
|
* Iris creates incident
|
||||||
|
* Oncall.tools decides who to ping
|
||||||
|
* All aboard the party bus
|
||||||
|
* Pager buzzes
|
||||||
|
* Meshtastic lights up
|
||||||
|
* Maybe even DMR SMS
|
||||||
|
|
||||||
## MQTT: The Real Party Bus
|
## MQTT: The Real Party Bus
|
||||||
|
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
really your imagination is the limit..
|
really your imagination is the limit..
|
||||||
-->
|
-->
|
||||||
|
|
||||||
* Decouples everything
|
* Decouples everything
|
||||||
* pub/sub means all alert channels are equal
|
* pub/sub means all alert channels are equal
|
||||||
* Not tied to a single vendor's services
|
* Not tied to a single vendor's services
|
||||||
* Simple to fan out to:
|
* Simple to glue to:
|
||||||
* Restaurant pagers
|
* Restaurant pagers
|
||||||
* Meshtastic / LoRa endpoints
|
* Meshtastic / LoRa endpoints
|
||||||
* Bash
|
* Bash
|
||||||
@ -204,157 +160,36 @@ really your imagination is the limit..
|
|||||||
* Home Assistant?
|
* Home Assistant?
|
||||||
* Jira??
|
* Jira??
|
||||||
|
|
||||||
## ~~Live Demo Preview~~ How it should've worked
|
|
||||||
<!--
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
* Trigger alert in Grafana
|
|
||||||
* Alertmanager routes
|
|
||||||
* Iris creates incident
|
|
||||||
* Oncall.tools decides who to ping
|
|
||||||
* All aboard the party bus
|
|
||||||
* Pagers buzz
|
|
||||||
* Meshtastic devices go beep beep
|
|
||||||
* Hopefully someone wakes up
|
|
||||||
|
|
||||||
|
|
||||||
# Meshtastic
|
|
||||||
|
|
||||||
## Meshtastic
|
|
||||||
|
|
||||||
* Open-source, off-grid, mesh communication using LoRa (LongRange) radios
|
|
||||||
* Low power, long distance comms w/o cellular or network access
|
|
||||||
* *Can* be used in conjunction with Internet via MQTT
|
|
||||||
* End-to-end encryption
|
|
||||||
* Nodes can still forward packets even if they cannot decrypt them
|
|
||||||
* Originating a message from MQTT to be sent is possible, if difficult
|
|
||||||
|
|
||||||
## MQTT Integration
|
|
||||||
|
|
||||||
* Private MQTT broker must be configured on meshtastic device
|
|
||||||
* okToMqtt, server settings
|
|
||||||
* JSON output
|
|
||||||
* **Including** adding a channel named `mqtt` and enabling Downlink on it
|
|
||||||
|
|
||||||
```python
|
|
||||||
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
|
|
||||||
client.connect('localhost')
|
|
||||||
client.publish("msh/US/2/json/MQTT", {
|
|
||||||
"from": "860292936",
|
|
||||||
"channel": 1,
|
|
||||||
"type": "sendtext"
|
|
||||||
"payload": "Server's on fire, yo."
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
Future: Listen for and process acknowledgements from oncall
|
|
||||||
|
|
||||||
# Restaurant Pagers
|
|
||||||
|
|
||||||
## Retekess TD174
|
|
||||||
|
|
||||||
* Found on ebay for $30
|
|
||||||
* Missing one pager, also one broken
|
|
||||||
* Not as plug-and-play as I hoped with a Flipper
|
|
||||||
* Hardware mod on the base station is probably a better play
|
|
||||||
|
|
||||||
```
|
|
||||||
Filetype: Flipper SubGhz Key File
|
|
||||||
Version: 1
|
|
||||||
Frequency: 433889000
|
|
||||||
Preset: FuriHalSubGhzPresetOok650Async
|
|
||||||
Protocol: SMC5326
|
|
||||||
Bit: 25
|
|
||||||
Key: 00 00 00 00 01 06 B0 40
|
|
||||||
TE: 326
|
|
||||||
```
|
|
||||||
|
|
||||||
# POCSAG and more
|
|
||||||
## POCSAG
|
|
||||||
|
|
||||||
* Struggled finding a pager in time for a demo
|
|
||||||
* Many hotspots support transmitting pages
|
|
||||||
* hampager.de
|
|
||||||
|
|
||||||
## Radiograms
|
|
||||||
|
|
||||||
```
|
|
||||||
52 R HXG N1HAN 11 CHARLOTTE NC JUN 15
|
|
||||||
SOME STAKEHOLDER KC1ABC
|
|
||||||
SOMEPLACE SOMEWHERE SOMEZIP
|
|
||||||
BT
|
|
||||||
YOUR TLS CERTIFICATE FOR ROCKYLINUX
|
|
||||||
DOT ORG EXPIRES NEXT MONTH
|
|
||||||
73
|
|
||||||
BT
|
|
||||||
NEIL N1HAN
|
|
||||||
AR
|
|
||||||
```
|
|
||||||
|
|
||||||
Maybe don't do this? I dunno
|
|
||||||
|
|
||||||
## Possibly useful
|
|
||||||
|
|
||||||
### ntfy.sh
|
|
||||||
|
|
||||||
* Simple HTTP-based pub/sub push notification service
|
|
||||||
* Push notifications w/ actions
|
|
||||||
* Can deploy yourself or use hosted
|
|
||||||
* iOS/Android apps
|
|
||||||
|
|
||||||
### DMR SMS
|
|
||||||
|
|
||||||
* Send an SMS to your digital-mode radio!
|
|
||||||
|
|
||||||
# On-Call At-Home
|
|
||||||
## On-Call At-Home
|
## On-Call At-Home
|
||||||
|
|
||||||
<!--
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
* Leak in the basement!
|
* Leak in the basement!
|
||||||
* HA sends MQTT alert
|
* HA sends MQTT alert
|
||||||
* Buzzer sounds
|
* Buzzer sounds
|
||||||
* Lights flash
|
* Lights flash
|
||||||
* Pager buzzes (for real)
|
* Pager buzzes (for real)
|
||||||
* You go turn off the water
|
|
||||||
* Easily reuses same infra stack
|
* Easily reuses same infra stack
|
||||||
|
|
||||||
|
|
||||||
## What Didn't Make It
|
## What Didn't Make It
|
||||||
|
|
||||||
<!--
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
* My demos
|
|
||||||
* Radiograms
|
* Radiograms
|
||||||
* Winlink->MQTT pipeline
|
* Winlink->MQTT pipeline
|
||||||
* APRS group messaging (CQSRVR)
|
* APRS group messaging (CQSRVR)
|
||||||
* DMR SMS
|
|
||||||
* Whisper network / pigeon relay
|
* Whisper network / pigeon relay
|
||||||
* The servo-controlled bell thing
|
|
||||||
|
|
||||||
## What We Learned
|
## What We Learned
|
||||||
|
|
||||||
<!--
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
* You *can* replace SaaS alerting
|
* You *can* replace SaaS alerting
|
||||||
* MQTT is weirdly good at this
|
* MQTT is weirdly good at this
|
||||||
* Hardware is fun again
|
* Hardware is fun again
|
||||||
* LoRa is approaching ops-grade, with limitations
|
* LoRa is legit ops-grade
|
||||||
* The pager lives!
|
* The pager lives
|
||||||
|
|
||||||
## Q&A
|
## Q&A + Live Triggers
|
||||||
|
|
||||||
<!--
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
|
* Trigger alert with curl or form
|
||||||
|
* Watch things blink and buzz
|
||||||
* Ask away
|
* Ask away
|
||||||
|
|
||||||
## Thanks!
|
## Thanks!
|
||||||
|
Loading…
x
Reference in New Issue
Block a user