feat(publicip): resilient public ip fetcher (#2518)

- `PUBLICIP_API` accepts a comma separated list of ip data sources, where the first one is the base default one, and sources after it are backup sources used if we are rate limited.
- `PUBLICIP_API` defaults to `ipinfo,ifconfigco,ip2location,cloudflare` such that it now has `ifconfigco,ip2location,cloudflare` as backup ip data sources.
- `PUBLICIP_API_TOKEN` accepts a comma separated list of ip data source tokens, each corresponding by position to the APIs listed in `PUBLICIP_API`.
- logs ip data source when logging public ip information
- assume a rate limiting error is for 30 days (no persistence)
- ready for future live settings updates
  - consider an ip data source no longer banned if the token changes
  - keeps track of ban times when updating the list of fetchers
This commit is contained in:
Quentin McGaw
2024-10-19 15:21:14 +02:00
committed by GitHub
parent 3dfb43e117
commit a61302f135
22 changed files with 649 additions and 90 deletions

View File

@@ -13,7 +13,7 @@ import (
// If an error is encountered, all the operations are canceled and
// an error is returned, so the results returned should be considered
// incomplete in this case.
func FetchMultiInfo(ctx context.Context, fetcher Fetcher, ips []netip.Addr) (
func FetchMultiInfo(ctx context.Context, fetcher InfoFetcher, ips []netip.Addr) (
results []models.PublicIP, err error,
) {
ctx, cancel := context.WithCancel(ctx)