This commit is contained in:
31
main.go
31
main.go
@@ -311,27 +311,30 @@ func parseStream(r io.Reader, cb func(netip.Prefix)) error {
|
|||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
func subscribeKeyspace(ctx context.Context, rdb *redis.Client, ranger *Ranger) {
|
func subscribeKeyspace(ctx context.Context, rdb *redis.Client, ranger *Ranger) {
|
||||||
pubsub := rdb.PSubscribe(ctx, "__keyspace@0__:bl:*", "__keyspace@0__:wl:*")
|
// listen to keyevent channels (not keyspace) so msg.Payload == actual key
|
||||||
|
patterns := []string{
|
||||||
|
"__keyevent@0__:set",
|
||||||
|
"__keyevent@0__:del",
|
||||||
|
"__keyevent@0__:expired",
|
||||||
|
}
|
||||||
|
pubsub := rdb.PSubscribe(ctx, patterns...)
|
||||||
go func() {
|
go func() {
|
||||||
for msg := range pubsub.Channel() {
|
for msg := range pubsub.Channel() {
|
||||||
fmt.Println(msg)
|
key := msg.Payload // full redis key e.g. "wl:1.2.3.4" or "bl:spam:10.0.0.0/8"
|
||||||
key := strings.TrimPrefix(msg.Channel, "__keyspace@0__:")
|
switch {
|
||||||
payload := msg.Payload
|
case strings.HasPrefix(key, "wl:"):
|
||||||
if strings.HasPrefix(key, "wl:") {
|
|
||||||
ipStr := strings.TrimPrefix(key, "wl:")
|
ipStr := strings.TrimPrefix(key, "wl:")
|
||||||
addr, err := netip.ParseAddr(ipStr)
|
addr, err := netip.ParseAddr(ipStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
switch payload {
|
switch msg.Channel {
|
||||||
case "set":
|
case "__keyevent@0__:set":
|
||||||
ranger.addWhite(addr)
|
ranger.addWhite(addr)
|
||||||
case "del", "expired":
|
case "__keyevent@0__:del", "__keyevent@0__:expired":
|
||||||
ranger.removeWhite(addr)
|
ranger.removeWhite(addr)
|
||||||
}
|
}
|
||||||
continue
|
case strings.HasPrefix(key, "bl:"):
|
||||||
}
|
|
||||||
if strings.HasPrefix(key, "bl:") {
|
|
||||||
parts := strings.SplitN(key, ":", 3)
|
parts := strings.SplitN(key, ":", 3)
|
||||||
if len(parts) != 3 {
|
if len(parts) != 3 {
|
||||||
continue
|
continue
|
||||||
@@ -341,10 +344,10 @@ func subscribeKeyspace(ctx context.Context, rdb *redis.Client, ranger *Ranger) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
switch payload {
|
switch msg.Channel {
|
||||||
case "set":
|
case "__keyevent@0__:set":
|
||||||
ranger.addBlock(cat, p)
|
ranger.addBlock(cat, p)
|
||||||
case "del", "expired":
|
case "__keyevent@0__:del", "__keyevent@0__:expired":
|
||||||
ranger.removeBlock(cat, p)
|
ranger.removeBlock(cat, p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user