feat(canary): wire geoip into main with NopService fallback
openGeoIP opens cfg.GeoIP.Path and returns a (Lookuper, closer) pair; on open failure (missing/unreadable mmdb) it returns geoip.NopService() and a no-op closer so the rest of the wire-up sees a consistent non-nil interface and the binary stays healthy in environments without a MaxMind license. buildEventStack now accepts a geoip.Lookuper and threads it into event.ServiceConfig. Close is deferred in run() so the mmdb file handle releases on graceful shutdown; a close-error is logged at warn (not fatal).
This commit is contained in:
parent
b3fd75b680
commit
0e5ce63dc8
|
|
@ -23,6 +23,7 @@ import (
|
||||||
"github.com/CarterPerez-dev/cybersecurity-projects/canary-token-generator/backend/internal/config"
|
"github.com/CarterPerez-dev/cybersecurity-projects/canary-token-generator/backend/internal/config"
|
||||||
"github.com/CarterPerez-dev/cybersecurity-projects/canary-token-generator/backend/internal/core"
|
"github.com/CarterPerez-dev/cybersecurity-projects/canary-token-generator/backend/internal/core"
|
||||||
"github.com/CarterPerez-dev/cybersecurity-projects/canary-token-generator/backend/internal/event"
|
"github.com/CarterPerez-dev/cybersecurity-projects/canary-token-generator/backend/internal/event"
|
||||||
|
"github.com/CarterPerez-dev/cybersecurity-projects/canary-token-generator/backend/internal/geoip"
|
||||||
"github.com/CarterPerez-dev/cybersecurity-projects/canary-token-generator/backend/internal/health"
|
"github.com/CarterPerez-dev/cybersecurity-projects/canary-token-generator/backend/internal/health"
|
||||||
"github.com/CarterPerez-dev/cybersecurity-projects/canary-token-generator/backend/internal/middleware"
|
"github.com/CarterPerez-dev/cybersecurity-projects/canary-token-generator/backend/internal/middleware"
|
||||||
"github.com/CarterPerez-dev/cybersecurity-projects/canary-token-generator/backend/internal/notify"
|
"github.com/CarterPerez-dev/cybersecurity-projects/canary-token-generator/backend/internal/notify"
|
||||||
|
|
@ -92,8 +93,11 @@ func run(configPath string) error {
|
||||||
}
|
}
|
||||||
logger.Info("redis connected")
|
logger.Info("redis connected")
|
||||||
|
|
||||||
|
geo, geoCloser := openGeoIP(cfg, logger)
|
||||||
|
defer geoCloser()
|
||||||
|
|
||||||
notifySvc, eventSvc := buildEventStack(
|
notifySvc, eventSvc := buildEventStack(
|
||||||
cfg, logger, eventRepo, tokenRepo, rdb,
|
cfg, logger, eventRepo, tokenRepo, rdb, geo,
|
||||||
)
|
)
|
||||||
tokenSvc, verifier, healthH, tokenH := buildHTTPDeps(
|
tokenSvc, verifier, healthH, tokenH := buildHTTPDeps(
|
||||||
cfg, logger, db, rdb, eventRepo, tokenRepo, eventSvc,
|
cfg, logger, db, rdb, eventRepo, tokenRepo, eventSvc,
|
||||||
|
|
@ -169,6 +173,7 @@ func buildEventStack(
|
||||||
eventRepo *event.Repository,
|
eventRepo *event.Repository,
|
||||||
tokenRepo *token.Repository,
|
tokenRepo *token.Repository,
|
||||||
rdb *core.Redis,
|
rdb *core.Redis,
|
||||||
|
geo geoip.Lookuper,
|
||||||
) (*notify.Service, *event.Service) {
|
) (*notify.Service, *event.Service) {
|
||||||
tgSender := telegram.NewSender(telegram.Config{
|
tgSender := telegram.NewSender(telegram.Config{
|
||||||
APIBase: cfg.Notify.TelegramAPIBase,
|
APIBase: cfg.Notify.TelegramAPIBase,
|
||||||
|
|
@ -199,11 +204,30 @@ func buildEventStack(
|
||||||
event.ServiceConfig{
|
event.ServiceConfig{
|
||||||
DedupTTL: cfg.Notify.DedupTTL,
|
DedupTTL: cfg.Notify.DedupTTL,
|
||||||
Logger: logger,
|
Logger: logger,
|
||||||
|
GeoIP: geo,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
return notifySvc, eventSvc
|
return notifySvc, eventSvc
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func openGeoIP(
|
||||||
|
cfg *config.Config,
|
||||||
|
logger *slog.Logger,
|
||||||
|
) (geoip.Lookuper, func()) {
|
||||||
|
svc, err := geoip.Open(cfg.GeoIP.Path)
|
||||||
|
if err != nil {
|
||||||
|
logger.Warn("geoip unavailable, enrichment disabled",
|
||||||
|
"path", cfg.GeoIP.Path, "error", err)
|
||||||
|
return geoip.NopService(), func() {}
|
||||||
|
}
|
||||||
|
logger.Info("geoip opened", "path", cfg.GeoIP.Path)
|
||||||
|
return svc, func() {
|
||||||
|
if cErr := svc.Close(); cErr != nil {
|
||||||
|
logger.Warn("geoip close error", "error", cErr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func spawnMySQLListener(
|
func spawnMySQLListener(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
cfg *config.Config,
|
cfg *config.Config,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue