mirror of
https://github.com/therootcompany/golib.git
synced 2026-01-27 23:18:05 +00:00
54 lines
1.2 KiB
Markdown
54 lines
1.2 KiB
Markdown
# [ipcohort](https://github.com/therootcompany/golib/tree/main/net/ipcohort)
|
|
|
|
A memory-efficient, fast IP cohort checker for blacklists, whitelists, and ad cohorts.
|
|
|
|
- 6 bytes per IP address (5 + 1 for alignment)
|
|
- binary search (not as fast as a trie, but memory is linear)
|
|
- atomic swaps for updates
|
|
|
|
## Example
|
|
|
|
Check if an IP address belongs to a cohort (such as a blacklist):
|
|
|
|
```go
|
|
func main() {
|
|
ipStr := "92.255.85.72"
|
|
|
|
path := "/opt/github.com/bitwire-it/ipblocklist/inbound.txt"
|
|
unsorted := false
|
|
|
|
blacklist, err := ipcohort.LoadFile(path, unsorted)
|
|
if err != nil {
|
|
log.Fatalf("Failed to load blacklist: %v", err)
|
|
}
|
|
|
|
if blacklist.Contains(ipStr) {
|
|
fmt.Printf("%s is BLOCKED\n", ipStr)
|
|
os.Exit(1)
|
|
}
|
|
|
|
fmt.Printf("%s is allowed\n", ipStr)
|
|
}
|
|
```
|
|
|
|
Update the list periodically:
|
|
|
|
```go
|
|
func backgroundUpdate(path string, c *ipcohort.Cohort) {
|
|
ticker := time.NewTicker(1 * time.Hour)
|
|
defer ticker.Stop()
|
|
|
|
for range ticker.C {
|
|
needsSort := false
|
|
nextCohort, err := ipcohort.LoadFile(path, needsSort)
|
|
if err != nil {
|
|
log.Printf("reload failed: %v", err)
|
|
continue
|
|
}
|
|
|
|
log.Printf("reloaded %d blacklist entries", c.Size())
|
|
c.Swap(nextCohort)
|
|
}
|
|
}
|
|
```
|