Compare commits

...

4 commits

Author SHA1 Message Date
root 95cae1c6d0 add blocklist file 2024-11-09 19:41:09 +00:00
root 37945aa4bc fix missing imports 2024-11-09 19:36:51 +00:00
root 31cf966142 add blocklist mechanism 2024-11-09 19:34:36 +00:00
root 754f73fe8a add optional Accept function 2024-11-09 18:34:47 +00:00
4 changed files with 38 additions and 3 deletions

1
.gitignore vendored
View file

@ -1,2 +1,3 @@
internal/meshtastic/generated/*
website/nodes.json
blocklist.txt

View file

@ -1,6 +1,7 @@
package main
import (
"bufio"
"errors"
"flag"
"io/fs"
@ -8,6 +9,7 @@ import (
"os"
"os/signal"
"regexp"
"strconv"
"sync"
"sync/atomic"
"syscall"
@ -173,8 +175,9 @@ func handleMessage(from uint32, topic string, portNum generated.PortNum, payload
}
func main() {
var dbPath string
var dbPath, blockedPath string
flag.StringVar(&dbPath, "f", "", "node database `file`")
flag.StringVar(&blockedPath, "b", "", "node blocklist `file`")
flag.Parse()
// load or make NodeDB
if len(dbPath) > 0 {
@ -187,9 +190,34 @@ func main() {
if Nodes == nil {
Nodes = make(meshtastic.NodeDB)
}
// load node blocklist
blocked := make(map[uint32]struct{})
if len(blockedPath) > 0 {
f, err := os.Open(blockedPath)
if err != nil {
log.Fatalf("[error] open blocklist: %v", err)
}
s := bufio.NewScanner(f)
for s.Scan() {
n, err := strconv.ParseUint(s.Text(), 10, 32)
if err == nil {
blocked[uint32(n)] = struct{}{}
log.Printf("[info] node %v blocked", n)
}
}
f.Close()
err = s.Err()
if err != nil {
log.Fatalf("[error] read blocklist: %v", err)
}
}
// connect to MQTT
client := &meshtastic.MQTTClient{
TopicRegex: regexp.MustCompile(`/2/e/[^/]+/![0-9a-f]+$|/2/map/$`),
Accept: func(from uint32) bool {
_, found := blocked[from]
return !found
},
BlockCipher: meshtastic.NewBlockCipher(meshtastic.DefaultKey),
MessageHandler: handleMessage,
}

View file

@ -33,6 +33,7 @@ func NewBlockCipher(key []byte) cipher.Block {
type MQTTClient struct {
TopicRegex *regexp.Regexp
Accept func(from uint32) bool
BlockCipher cipher.Block
MessageHandler func(from uint32, topic string, portNum generated.PortNum, payload []byte)
topics []string
@ -105,6 +106,10 @@ func (c *MQTTClient) handleMessage(_ mqtt.Client, msg mqtt.Message) {
log.Printf("[warn] skipping MeshPacket from unknown on %v", topic)
return
}
// check sender
if c.Accept != nil && !c.Accept(from) {
return
}
// get Data, try decoded first
data := packet.GetDecoded()
if data == nil {

View file

@ -7,4 +7,5 @@ docker run --name meshobserv \
--restart unless-stopped \
-v /data:/data \
-d meshobserv \
-f /data/meshmap.net/website/nodes.json
-f /data/meshmap.net/website/nodes.json \
-b /data/meshmap.net/blocklist.txt