Rename blocklists to IP lists, add IP lookup flags, raise the download limit to 200 MiB (closes #233)
check / check (push) Failing after 10m45s

The lists are not only used for blocking, so the package, the `blocklists` field of the IP lookup answer and the state directory are now IP lists (`internal/iplist`, `ip_lists`, `iplists`). Every result gains a `flags` object with `is_tor` and `is_bogon`. The largest list file accepted is 200 MiB.

Judgement call: the dated 2026-10-27 `TODO.md` entry keeps the old word.
Rule suppressed: `tagliatelle` on the two result structs, for snake_case keys.

Model: opus-5-5
This commit was merged in pull request #241.
This commit is contained in:
clawbot committed 2026-11-10 10:48:23 +01:00
1 parent e58c6635e7
commit cf50d195ad
12 files changed
+375 -176

No files matched your search

+16 -16
View File
@@ -15,9 +15,9 @@ import (
"sync"
"time"
"git.eeqj.de/sneak/routewatch/internal/blocklist"
"git.eeqj.de/sneak/routewatch/internal/config"
"git.eeqj.de/sneak/routewatch/internal/database"
"git.eeqj.de/sneak/routewatch/internal/iplist"
"git.eeqj.de/sneak/routewatch/internal/logger"
"git.eeqj.de/sneak/routewatch/internal/metrics"
"git.eeqj.de/sneak/routewatch/internal/routetable"
@@ -61,12 +61,12 @@ type RouteWatch struct {
peeringHandler *PeeringHandler
asnFetcher *ASNFetcher
dbMaintainer *DBMaintainer
blocklists *blocklist.Blocklists
ipLists *iplist.IPLists
}
// blocklistsDirName is the directory in the state directory that holds the
// blocklist copies.
const blocklistsDirName = "blocklists"
// ipListsDirName is the directory in the state directory that holds the IP
// list copies.
const ipListsDirName = "iplists"
// New creates a new RouteWatch instance
func New(deps Dependencies) *RouteWatch {
@@ -138,17 +138,17 @@ func (rw *RouteWatch) Run(ctx context.Context) error {
rw.asnFetcher.Start(ctx)
rw.server.SetASNFetcher(rw.asnFetcher)
// Load the blocklist copies from disk and start downloading the lists.
// The HTTP handlers read the server's blocklists without a lock, so they
// Load the IP list copies from disk and start downloading the lists.
// The HTTP handlers read the server's IP lists without a lock, so they
// are set before the handlers run.
blocklists := blocklist.New(blocklist.Params{
Dir: filepath.Join(rw.config.StateDir, blocklistsDirName),
Lists: blocklist.Lists(),
ipLists := iplist.New(iplist.Params{
Dir: filepath.Join(rw.config.StateDir, ipListsDirName),
Lists: iplist.Lists(),
Logger: rw.logger.Logger,
})
blocklists.Start(ctx)
rw.blocklists = blocklists
rw.server.SetBlocklists(blocklists)
ipLists.Start(ctx)
rw.ipLists = ipLists
rw.server.SetIPLists(ipLists)
// Start HTTP server
err = rw.server.Start(ctx)
@@ -168,7 +168,7 @@ func (rw *RouteWatch) Run(ctx context.Context) error {
// Shutdown stops all services in order: the streamer, the handlers, which
// write what they hold, the WHOIS fetcher, the database maintainer, the
// blocklist downloads and the HTTP server, and last the database, which it
// IP list downloads and the HTTP server, and last the database, which it
// checkpoints and closes. Each stage waits at most until ctx ends, so
// Shutdown returns soon after: a handler logs what it could not write by
// then, and the HTTP server closes the connections of requests still
@@ -219,8 +219,8 @@ func (rw *RouteWatch) Shutdown(ctx context.Context) {
rw.dbMaintainer.Stop(ctx)
}
if rw.blocklists != nil {
rw.blocklists.Stop(ctx)
if rw.ipLists != nil {
rw.ipLists.Stop(ctx)
}
err := rw.server.Stop(ctx)
@@ -418,7 +418,7 @@ func TestRouteWatchLiveFeed(t *testing.T) {
// Create streamer
s := streamer.New(logger, metricsTracker)
// The state directory holds the blocklist copies Run downloads.
// The state directory holds the IP list copies Run downloads.
cfg := &config.Config{
StateDir: t.TempDir(),
MaxRuntime: 5 * time.Second,