Compare commits
8 Commits
b9cc7f30e8
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 7d745fa08b | |||
| b2a27cad72 | |||
| 617b68f43e | |||
| 4b4bc9792b | |||
| aaab500049 | |||
| fbb80c622f | |||
| 48b6585eba | |||
| 3747f02ed8 |
10
Containerfile
Normal file
10
Containerfile
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
FROM golang:1.25-alpine3.22 AS builder
|
||||||
|
|
||||||
|
COPY . /app
|
||||||
|
WORKDIR /app
|
||||||
|
RUN go build ./cmd/rio
|
||||||
|
|
||||||
|
FROM alpine:3.22
|
||||||
|
|
||||||
|
COPY --from=builder /app/rio /usr/local/bin/rio
|
||||||
|
ENTRYPOINT ["/usr/local/bin/rio"]
|
||||||
@@ -71,6 +71,8 @@ func handleSubdomain(ctx *context.GlobalContext, domain, cname, path string, req
|
|||||||
Path: path,
|
Path: path,
|
||||||
Referrer: req.Header.Get("Referer"),
|
Referrer: req.Header.Get("Referer"),
|
||||||
UserAgent: req.Header.Get("User-Agent"),
|
UserAgent: req.Header.Get("User-Agent"),
|
||||||
|
DNT: req.Header.Get("DNT"),
|
||||||
|
GPC: req.Header.Get("Sec-GPC"),
|
||||||
Writer: w,
|
Writer: w,
|
||||||
Global: ctx,
|
Global: ctx,
|
||||||
}
|
}
|
||||||
@@ -145,8 +147,9 @@ func runServer(ctx *cli.Context) error {
|
|||||||
acmeDnsProvider := ctx.String("acme-dns-provider")
|
acmeDnsProvider := ctx.String("acme-dns-provider")
|
||||||
acmeDisable := ctx.Bool("acme-disable")
|
acmeDisable := ctx.Bool("acme-disable")
|
||||||
defaultCsp := ctx.String("default-csp")
|
defaultCsp := ctx.String("default-csp")
|
||||||
lokiUrl := ctx.String("loki-url")
|
metricsUrl := ctx.String("metrics-url")
|
||||||
metricsBotList := ctx.String("metrics-bot-list")
|
metricsBotList := ctx.String("metrics-bot-list")
|
||||||
|
tokenFile := ctx.String("token-file")
|
||||||
|
|
||||||
// Init Logging
|
// Init Logging
|
||||||
if ctx.Bool("debug") {
|
if ctx.Bool("debug") {
|
||||||
@@ -156,9 +159,9 @@ func runServer(ctx *cli.Context) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set up the Loki metrics
|
// Set up the Loki metrics
|
||||||
var lokiConfig metrics.LokiMetricConfig
|
var lokiConfig metrics.MetricConfig
|
||||||
if lokiUrl == "" {
|
if metricsUrl == "" {
|
||||||
lokiConfig = metrics.LokiMetricConfig{
|
lokiConfig = metrics.MetricConfig{
|
||||||
Enabled: false,
|
Enabled: false,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -170,25 +173,35 @@ func runServer(ctx *cli.Context) error {
|
|||||||
}
|
}
|
||||||
log.Infof("Read %d bot patterns from disk", len(patterns))
|
log.Infof("Read %d bot patterns from disk", len(patterns))
|
||||||
|
|
||||||
lokiConfig = metrics.LokiMetricConfig{
|
lokiConfig = metrics.MetricConfig{
|
||||||
Enabled: true,
|
Enabled: true,
|
||||||
BotUserAgents: &patterns,
|
BotUserAgents: &patterns,
|
||||||
Url: lokiUrl,
|
Url: metricsUrl,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If specified, read in an access token
|
||||||
|
token := ""
|
||||||
|
if tokenFile != "" {
|
||||||
|
t, err := readSecret(tokenFile)
|
||||||
|
if err != nil {
|
||||||
|
log.Warnf("Failed to read secret: %v", err)
|
||||||
|
}
|
||||||
|
token = t
|
||||||
|
}
|
||||||
|
|
||||||
// Setup the Gitea stuff
|
// Setup the Gitea stuff
|
||||||
httpClient := http.Client{Timeout: 10 * time.Second}
|
httpClient := http.Client{Timeout: 10 * time.Second}
|
||||||
giteaApiClient, err := gitea.NewClient(
|
giteaApiClient, err := gitea.NewClient(
|
||||||
giteaUrl,
|
giteaUrl,
|
||||||
gitea.SetHTTPClient(&httpClient),
|
gitea.SetHTTPClient(&httpClient),
|
||||||
gitea.SetToken(""),
|
gitea.SetToken(token),
|
||||||
gitea.SetUserAgent("rio"),
|
gitea.SetUserAgent("rio"),
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
giteaClient := riogitea.NewGiteaClient(giteaUrl, giteaApiClient)
|
giteaClient := riogitea.NewGiteaClient(giteaUrl, token, giteaApiClient)
|
||||||
|
|
||||||
// Listen on the port
|
// Listen on the port
|
||||||
addr := ctx.String("listen-host") + ":" + ctx.String("listen-port")
|
addr := ctx.String("listen-host") + ":" + ctx.String("listen-port")
|
||||||
@@ -199,16 +212,6 @@ func runServer(ctx *cli.Context) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Listen on the HTTP port
|
|
||||||
httpAddr := ctx.String("http-host") + ":" + ctx.String("http-port")
|
|
||||||
httpListener, err := net.Listen("tcp", httpAddr)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(
|
|
||||||
fmt.Errorf("Failed to create HTTP listener: %v", err),
|
|
||||||
)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prepare the context
|
// Prepare the context
|
||||||
cacheCtx := context.CacheContext{
|
cacheCtx := context.CacheContext{
|
||||||
RepositoryInformationCache: context.MakeRepoInfoCache(),
|
RepositoryInformationCache: context.MakeRepoInfoCache(),
|
||||||
@@ -291,7 +294,7 @@ func runServer(ctx *cli.Context) error {
|
|||||||
go func() {
|
go func() {
|
||||||
defer waitGroup.Done()
|
defer waitGroup.Done()
|
||||||
|
|
||||||
log.Infof("Listening on main HTTP server %s", httpAddr)
|
log.Infof("Listening on main HTTP server %s", addr)
|
||||||
if err := http.Serve(listener, Handler(globalCtx)); err != nil {
|
if err := http.Serve(listener, Handler(globalCtx)); err != nil {
|
||||||
log.Fatal(fmt.Errorf("Listening failed: %v", err))
|
log.Fatal(fmt.Errorf("Listening failed: %v", err))
|
||||||
}
|
}
|
||||||
@@ -299,6 +302,16 @@ func runServer(ctx *cli.Context) error {
|
|||||||
}()
|
}()
|
||||||
|
|
||||||
if !acmeDisable {
|
if !acmeDisable {
|
||||||
|
// Listen on the HTTP port
|
||||||
|
httpAddr := ctx.String("http-host") + ":" + ctx.String("http-port")
|
||||||
|
httpListener, err := net.Listen("tcp", httpAddr)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(
|
||||||
|
fmt.Errorf("Failed to create HTTP listener: %v", err),
|
||||||
|
)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
defer waitGroup.Done()
|
defer waitGroup.Done()
|
||||||
|
|
||||||
@@ -403,10 +416,10 @@ func main() {
|
|||||||
EnvVars: []string{"DEFAULT_CSP"},
|
EnvVars: []string{"DEFAULT_CSP"},
|
||||||
},
|
},
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "loki-url",
|
Name: "metrics-url",
|
||||||
Usage: "The URL for Loki metric pings",
|
Usage: "The URL for metric pings",
|
||||||
Value: "",
|
Value: "",
|
||||||
EnvVars: []string{"LOKI_URL"},
|
EnvVars: []string{"METRICS_URL"},
|
||||||
},
|
},
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "metrics-bot-list",
|
Name: "metrics-bot-list",
|
||||||
@@ -414,6 +427,12 @@ func main() {
|
|||||||
Value: "",
|
Value: "",
|
||||||
EnvVars: []string{"METRICS_BOT_LIST"},
|
EnvVars: []string{"METRICS_BOT_LIST"},
|
||||||
},
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "token-file",
|
||||||
|
Usage: "File containing a access token. Required for serving private repositories",
|
||||||
|
Value: "",
|
||||||
|
EnvVars: []string{"TOKEN_FILE"},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
16
cmd/rio/utils.go
Normal file
16
cmd/rio/utils.go
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Read a secret file and return its (cleaned) content.
|
||||||
|
func readSecret(path string) (string, error) {
|
||||||
|
content, err := os.ReadFile(path)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return strings.Trim(string(content), "\n\r "), nil
|
||||||
|
}
|
||||||
298
go.mod
298
go.mod
@@ -1,162 +1,246 @@
|
|||||||
module git.polynom.me/rio
|
module git.polynom.me/rio
|
||||||
|
|
||||||
go 1.20
|
go 1.24.7
|
||||||
|
|
||||||
require (
|
require (
|
||||||
code.gitea.io/sdk/gitea v0.17.1
|
code.gitea.io/sdk/gitea v0.22.1
|
||||||
github.com/go-acme/lego/v4 v4.14.2
|
github.com/go-acme/lego/v4 v4.28.0
|
||||||
github.com/patrickmn/go-cache v2.1.0+incompatible
|
github.com/patrickmn/go-cache v2.1.0+incompatible
|
||||||
github.com/sirupsen/logrus v1.9.3
|
github.com/sirupsen/logrus v1.9.3
|
||||||
github.com/urfave/cli/v2 v2.27.1
|
github.com/urfave/cli/v2 v2.27.7
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
cloud.google.com/go/compute v1.18.0 // indirect
|
cloud.google.com/go/auth v0.17.0 // indirect
|
||||||
cloud.google.com/go/compute/metadata v0.2.3 // indirect
|
cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect
|
||||||
|
cloud.google.com/go/compute v1.49.1 // indirect
|
||||||
|
cloud.google.com/go/compute/metadata v0.9.0 // indirect
|
||||||
|
github.com/42wim/httpsig v1.2.3 // indirect
|
||||||
github.com/AdamSLevy/jsonrpc2/v14 v14.1.0 // indirect
|
github.com/AdamSLevy/jsonrpc2/v14 v14.1.0 // indirect
|
||||||
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect
|
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0 // indirect
|
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.19.1 // indirect
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 // indirect
|
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.0 // indirect
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect
|
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 // indirect
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dns/armdns v1.1.0 // indirect
|
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dns/armdns v1.2.0 // indirect
|
||||||
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/privatedns/armprivatedns v1.1.0 // indirect
|
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/privatedns/armprivatedns v1.3.0 // indirect
|
||||||
|
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcegraph/armresourcegraph v0.9.0 // indirect
|
||||||
github.com/Azure/go-autorest v14.2.0+incompatible // indirect
|
github.com/Azure/go-autorest v14.2.0+incompatible // indirect
|
||||||
github.com/Azure/go-autorest/autorest v0.11.24 // indirect
|
github.com/Azure/go-autorest/autorest v0.11.30 // indirect
|
||||||
github.com/Azure/go-autorest/autorest/adal v0.9.18 // indirect
|
github.com/Azure/go-autorest/autorest/adal v0.9.24 // indirect
|
||||||
github.com/Azure/go-autorest/autorest/azure/auth v0.5.12 // indirect
|
github.com/Azure/go-autorest/autorest/azure/auth v0.5.13 // indirect
|
||||||
github.com/Azure/go-autorest/autorest/azure/cli v0.4.5 // indirect
|
github.com/Azure/go-autorest/autorest/azure/cli v0.4.7 // indirect
|
||||||
github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect
|
github.com/Azure/go-autorest/autorest/date v0.3.1 // indirect
|
||||||
github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect
|
github.com/Azure/go-autorest/autorest/to v0.4.1 // indirect
|
||||||
github.com/Azure/go-autorest/logger v0.2.1 // indirect
|
github.com/Azure/go-autorest/logger v0.2.2 // indirect
|
||||||
github.com/Azure/go-autorest/tracing v0.6.0 // indirect
|
github.com/Azure/go-autorest/tracing v0.6.1 // indirect
|
||||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 // indirect
|
github.com/AzureAD/microsoft-authentication-library-for-go v1.5.0 // indirect
|
||||||
github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87 // indirect
|
github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87 // indirect
|
||||||
github.com/akamai/AkamaiOPEN-edgegrid-golang v1.2.2 // indirect
|
github.com/akamai/AkamaiOPEN-edgegrid-golang v1.2.2 // indirect
|
||||||
github.com/aliyun/alibaba-cloud-sdk-go v1.61.1755 // indirect
|
github.com/akamai/AkamaiOPEN-edgegrid-golang/v11 v11.1.0 // indirect
|
||||||
|
github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5 // indirect
|
||||||
|
github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.13 // indirect
|
||||||
|
github.com/alibabacloud-go/debug v1.0.1 // indirect
|
||||||
|
github.com/alibabacloud-go/tea v1.3.13 // indirect
|
||||||
|
github.com/alibabacloud-go/tea-utils/v2 v2.0.7 // indirect
|
||||||
|
github.com/aliyun/alibaba-cloud-sdk-go v1.63.107 // indirect
|
||||||
|
github.com/aliyun/credentials-go v1.4.8 // indirect
|
||||||
github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129 // indirect
|
github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2 v1.19.0 // indirect
|
github.com/aws/aws-sdk-go-v2 v1.39.5 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/config v1.18.28 // indirect
|
github.com/aws/aws-sdk-go-v2/config v1.31.16 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/credentials v1.13.27 // indirect
|
github.com/aws/aws-sdk-go-v2/credentials v1.18.20 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.5 // indirect
|
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.12 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.35 // indirect
|
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.12 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.29 // indirect
|
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.12 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/internal/ini v1.3.36 // indirect
|
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.29 // indirect
|
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.2 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/service/lightsail v1.27.2 // indirect
|
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.12 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/service/route53 v1.28.4 // indirect
|
github.com/aws/aws-sdk-go-v2/service/lightsail v1.50.3 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/service/sso v1.12.13 // indirect
|
github.com/aws/aws-sdk-go-v2/service/route53 v1.59.2 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.13 // indirect
|
github.com/aws/aws-sdk-go-v2/service/sso v1.30.0 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/service/sts v1.19.3 // indirect
|
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.4 // indirect
|
||||||
github.com/aws/smithy-go v1.13.5 // indirect
|
github.com/aws/aws-sdk-go-v2/service/sts v1.39.0 // indirect
|
||||||
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc // indirect
|
github.com/aws/smithy-go v1.23.2 // indirect
|
||||||
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
|
github.com/aziontech/azionapi-go-sdk v0.143.0 // indirect
|
||||||
github.com/civo/civogo v0.3.11 // indirect
|
github.com/baidubce/bce-sdk-go v0.9.250 // indirect
|
||||||
github.com/cloudflare/cloudflare-go v0.70.0 // indirect
|
github.com/benbjohnson/clock v1.3.5 // indirect
|
||||||
|
github.com/boombuler/barcode v1.1.0 // indirect
|
||||||
|
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
|
||||||
|
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
|
||||||
|
github.com/civo/civogo v0.6.4 // indirect
|
||||||
|
github.com/clbanning/mxj/v2 v2.7.0 // indirect
|
||||||
|
github.com/cloudflare/cloudflare-go v0.116.0 // indirect
|
||||||
github.com/cpu/goacmedns v0.1.1 // indirect
|
github.com/cpu/goacmedns v0.1.1 // indirect
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
|
github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||||
github.com/davidmz/go-pageant v1.0.2 // indirect
|
github.com/davidmz/go-pageant v1.0.2 // indirect
|
||||||
github.com/deepmap/oapi-codegen v1.9.1 // indirect
|
github.com/deepmap/oapi-codegen v1.16.3 // indirect
|
||||||
github.com/dimchansky/utfbom v1.1.1 // indirect
|
github.com/dimchansky/utfbom v1.1.1 // indirect
|
||||||
github.com/dnsimple/dnsimple-go v1.2.0 // indirect
|
github.com/dnsimple/dnsimple-go v1.7.0 // indirect
|
||||||
github.com/exoscale/egoscale v0.100.1 // indirect
|
github.com/dnsimple/dnsimple-go/v4 v4.0.0 // indirect
|
||||||
|
github.com/exoscale/egoscale v0.102.4 // indirect
|
||||||
|
github.com/exoscale/egoscale/v3 v3.1.27 // indirect
|
||||||
|
github.com/fatih/color v1.18.0 // indirect
|
||||||
github.com/fatih/structs v1.1.0 // indirect
|
github.com/fatih/structs v1.1.0 // indirect
|
||||||
github.com/fsnotify/fsnotify v1.6.0 // indirect
|
github.com/felixge/httpsnoop v1.0.4 // indirect
|
||||||
|
github.com/fsnotify/fsnotify v1.9.0 // indirect
|
||||||
|
github.com/gabriel-vasile/mimetype v1.4.11 // indirect
|
||||||
github.com/ghodss/yaml v1.0.0 // indirect
|
github.com/ghodss/yaml v1.0.0 // indirect
|
||||||
github.com/go-errors/errors v1.0.1 // indirect
|
github.com/go-acme/alidns-20150109/v4 v4.6.1 // indirect
|
||||||
|
github.com/go-acme/tencentclouddnspod v1.1.25 // indirect
|
||||||
|
github.com/go-acme/tencentedgdeone v1.1.48 // indirect
|
||||||
|
github.com/go-errors/errors v1.5.1 // indirect
|
||||||
github.com/go-fed/httpsig v1.1.0 // indirect
|
github.com/go-fed/httpsig v1.1.0 // indirect
|
||||||
github.com/go-jose/go-jose/v3 v3.0.0 // indirect
|
github.com/go-jose/go-jose/v3 v3.0.4 // indirect
|
||||||
github.com/go-resty/resty/v2 v2.7.0 // indirect
|
github.com/go-jose/go-jose/v4 v4.1.3 // indirect
|
||||||
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
|
github.com/go-logr/logr v1.4.3 // indirect
|
||||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect
|
github.com/go-logr/stdr v1.2.2 // indirect
|
||||||
github.com/golang/protobuf v1.5.3 // indirect
|
github.com/go-ozzo/ozzo-validation/v4 v4.3.0 // indirect
|
||||||
|
github.com/go-playground/locales v0.14.1 // indirect
|
||||||
|
github.com/go-playground/universal-translator v0.18.1 // indirect
|
||||||
|
github.com/go-playground/validator/v10 v10.28.0 // indirect
|
||||||
|
github.com/go-resty/resty/v2 v2.16.5 // indirect
|
||||||
|
github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
|
||||||
|
github.com/goccy/go-yaml v1.18.0 // indirect
|
||||||
|
github.com/gofrs/flock v0.13.0 // indirect
|
||||||
|
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
|
||||||
|
github.com/golang-jwt/jwt/v5 v5.3.0 // indirect
|
||||||
|
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
|
||||||
|
github.com/golang/protobuf v1.5.4 // indirect
|
||||||
github.com/google/go-querystring v1.1.0 // indirect
|
github.com/google/go-querystring v1.1.0 // indirect
|
||||||
github.com/google/uuid v1.3.0 // indirect
|
github.com/google/s2a-go v0.1.9 // indirect
|
||||||
github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect
|
github.com/google/uuid v1.6.0 // indirect
|
||||||
github.com/googleapis/gax-go/v2 v2.7.0 // indirect
|
github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect
|
||||||
github.com/gophercloud/gophercloud v1.0.0 // indirect
|
github.com/googleapis/gax-go/v2 v2.15.0 // indirect
|
||||||
github.com/gophercloud/utils v0.0.0-20210216074907-f6de111f2eae // indirect
|
github.com/gophercloud/gophercloud v1.14.1 // indirect
|
||||||
github.com/hashicorp/errwrap v1.0.0 // indirect
|
github.com/gophercloud/utils v0.0.0-20231010081019-80377eca5d56 // indirect
|
||||||
|
github.com/hashicorp/errwrap v1.1.0 // indirect
|
||||||
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
|
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
|
||||||
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
||||||
github.com/hashicorp/go-retryablehttp v0.7.4 // indirect
|
github.com/hashicorp/go-retryablehttp v0.7.8 // indirect
|
||||||
github.com/hashicorp/go-version v1.6.0 // indirect
|
github.com/hashicorp/go-uuid v1.0.3 // indirect
|
||||||
|
github.com/hashicorp/go-version v1.7.0 // indirect
|
||||||
|
github.com/hashicorp/hcl v1.0.0 // indirect
|
||||||
|
github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.174 // indirect
|
||||||
github.com/iij/doapi v0.0.0-20190504054126-0bbf12d6d7df // indirect
|
github.com/iij/doapi v0.0.0-20190504054126-0bbf12d6d7df // indirect
|
||||||
github.com/infobloxopen/infoblox-go-client v1.1.1 // indirect
|
github.com/infobloxopen/infoblox-go-client v1.1.1 // indirect
|
||||||
|
github.com/infobloxopen/infoblox-go-client/v2 v2.11.0 // indirect
|
||||||
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
||||||
github.com/json-iterator/go v1.1.12 // indirect
|
github.com/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12 // indirect
|
||||||
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 // indirect
|
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 // indirect
|
||||||
github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect
|
github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect
|
||||||
github.com/kylelemons/godebug v1.1.0 // indirect
|
github.com/kylelemons/godebug v1.1.0 // indirect
|
||||||
github.com/labbsr0x/bindman-dns-webhook v1.0.2 // indirect
|
github.com/labbsr0x/bindman-dns-webhook v1.0.2 // indirect
|
||||||
github.com/labbsr0x/goh v1.0.1 // indirect
|
github.com/labbsr0x/goh v1.0.1 // indirect
|
||||||
github.com/linode/linodego v1.17.2 // indirect
|
github.com/leodido/go-urn v1.4.0 // indirect
|
||||||
|
github.com/linode/linodego v1.60.0 // indirect
|
||||||
github.com/liquidweb/go-lwApi v0.0.5 // indirect
|
github.com/liquidweb/go-lwApi v0.0.5 // indirect
|
||||||
github.com/liquidweb/liquidweb-cli v0.6.9 // indirect
|
github.com/liquidweb/liquidweb-cli v0.7.0 // indirect
|
||||||
github.com/liquidweb/liquidweb-go v1.6.3 // indirect
|
github.com/liquidweb/liquidweb-go v1.6.4 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.19 // indirect
|
github.com/magiconair/properties v1.8.10 // indirect
|
||||||
github.com/miekg/dns v1.1.55 // indirect
|
github.com/mattn/go-colorable v0.1.14 // indirect
|
||||||
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||||
|
github.com/miekg/dns v1.1.68 // indirect
|
||||||
github.com/mimuret/golang-iij-dpf v0.9.1 // indirect
|
github.com/mimuret/golang-iij-dpf v0.9.1 // indirect
|
||||||
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
||||||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||||
github.com/namedotcom/go v0.0.0-20180403034216-08470befbe04 // indirect
|
github.com/namedotcom/go v0.0.0-20180403034216-08470befbe04 // indirect
|
||||||
|
github.com/namedotcom/go/v4 v4.0.2 // indirect
|
||||||
github.com/nrdcg/auroradns v1.1.0 // indirect
|
github.com/nrdcg/auroradns v1.1.0 // indirect
|
||||||
github.com/nrdcg/bunny-go v0.0.0-20230728143221-c9dda82568d9 // indirect
|
github.com/nrdcg/bunny-go v0.1.0 // indirect
|
||||||
github.com/nrdcg/desec v0.7.0 // indirect
|
github.com/nrdcg/desec v0.11.1 // indirect
|
||||||
github.com/nrdcg/dnspod-go v0.4.0 // indirect
|
github.com/nrdcg/dnspod-go v0.4.0 // indirect
|
||||||
github.com/nrdcg/freemyip v0.2.0 // indirect
|
github.com/nrdcg/freemyip v0.3.0 // indirect
|
||||||
github.com/nrdcg/goinwx v0.8.2 // indirect
|
github.com/nrdcg/goacmedns v0.2.0 // indirect
|
||||||
github.com/nrdcg/namesilo v0.2.1 // indirect
|
github.com/nrdcg/goinwx v0.11.0 // indirect
|
||||||
|
github.com/nrdcg/mailinabox v0.3.0 // indirect
|
||||||
|
github.com/nrdcg/namesilo v0.5.0 // indirect
|
||||||
github.com/nrdcg/nodion v0.1.0 // indirect
|
github.com/nrdcg/nodion v0.1.0 // indirect
|
||||||
github.com/nrdcg/porkbun v0.2.0 // indirect
|
github.com/nrdcg/oci-go-sdk/common/v1065 v1065.103.0 // indirect
|
||||||
|
github.com/nrdcg/oci-go-sdk/dns/v1065 v1065.103.0 // indirect
|
||||||
|
github.com/nrdcg/porkbun v0.4.0 // indirect
|
||||||
|
github.com/nrdcg/vegadns v0.3.0 // indirect
|
||||||
github.com/nzdjb/go-metaname v1.0.0 // indirect
|
github.com/nzdjb/go-metaname v1.0.0 // indirect
|
||||||
github.com/onsi/gomega v1.27.6 // indirect
|
github.com/onsi/gomega v1.37.0 // indirect
|
||||||
github.com/oracle/oci-go-sdk v24.3.0+incompatible // indirect
|
github.com/oracle/oci-go-sdk v24.3.0+incompatible // indirect
|
||||||
github.com/ovh/go-ovh v1.4.2 // indirect
|
github.com/ovh/go-ovh v1.9.0 // indirect
|
||||||
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect
|
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
|
||||||
|
github.com/peterhellberg/link v1.2.0 // indirect
|
||||||
|
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||||
github.com/pquerna/otp v1.4.0 // indirect
|
github.com/pquerna/otp v1.5.0 // indirect
|
||||||
|
github.com/regfish/regfish-dnsapi-go v0.1.1 // indirect
|
||||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||||
github.com/sacloud/api-client-go v0.2.8 // indirect
|
github.com/sacloud/api-client-go v0.3.3 // indirect
|
||||||
github.com/sacloud/go-http v0.1.6 // indirect
|
github.com/sacloud/go-http v0.1.9 // indirect
|
||||||
github.com/sacloud/iaas-api-go v1.11.1 // indirect
|
github.com/sacloud/iaas-api-go v1.20.0 // indirect
|
||||||
github.com/sacloud/packages-go v0.0.9 // indirect
|
github.com/sacloud/packages-go v0.0.11 // indirect
|
||||||
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.17 // indirect
|
github.com/sagikazarmark/locafero v0.12.0 // indirect
|
||||||
|
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
|
||||||
|
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.35 // indirect
|
||||||
|
github.com/selectel/domains-go v1.1.0 // indirect
|
||||||
|
github.com/selectel/go-selvpcclient/v4 v4.1.0 // indirect
|
||||||
|
github.com/shopspring/decimal v1.4.0 // indirect
|
||||||
github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9 // indirect
|
github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9 // indirect
|
||||||
github.com/softlayer/softlayer-go v1.1.2 // indirect
|
github.com/softlayer/softlayer-go v1.2.1 // indirect
|
||||||
github.com/softlayer/xmlrpc v0.0.0-20200409220501-5f089df7cb7e // indirect
|
github.com/softlayer/xmlrpc v0.0.0-20200409220501-5f089df7cb7e // indirect
|
||||||
github.com/spf13/cast v1.3.1 // indirect
|
github.com/sony/gobreaker v1.0.0 // indirect
|
||||||
github.com/stretchr/objx v0.5.0 // indirect
|
github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect
|
||||||
github.com/stretchr/testify v1.8.4 // indirect
|
github.com/spf13/afero v1.15.0 // indirect
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.490 // indirect
|
github.com/spf13/cast v1.10.0 // indirect
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.490 // indirect
|
github.com/spf13/pflag v1.0.10 // indirect
|
||||||
github.com/transip/gotransip/v6 v6.20.0 // indirect
|
github.com/spf13/viper v1.21.0 // indirect
|
||||||
github.com/ultradns/ultradns-go-sdk v1.5.0-20230427130837-23c9b0c // indirect
|
github.com/stretchr/objx v0.5.3 // indirect
|
||||||
|
github.com/stretchr/testify v1.11.1 // indirect
|
||||||
|
github.com/subosito/gotenv v1.6.0 // indirect
|
||||||
|
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.48 // indirect
|
||||||
|
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.1.25 // indirect
|
||||||
|
github.com/tjfoc/gmsm v1.4.1 // indirect
|
||||||
|
github.com/transip/gotransip/v6 v6.26.1 // indirect
|
||||||
|
github.com/ultradns/ultradns-go-sdk v1.8.1-20250722213956-faef419 // indirect
|
||||||
github.com/vinyldns/go-vinyldns v0.9.16 // indirect
|
github.com/vinyldns/go-vinyldns v0.9.16 // indirect
|
||||||
|
github.com/volcengine/volc-sdk-golang v1.0.225 // indirect
|
||||||
github.com/vultr/govultr/v2 v2.17.2 // indirect
|
github.com/vultr/govultr/v2 v2.17.2 // indirect
|
||||||
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
|
github.com/vultr/govultr/v3 v3.24.0 // indirect
|
||||||
github.com/yandex-cloud/go-genproto v0.0.0-20220805142335-27b56ddae16f // indirect
|
github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342 // indirect
|
||||||
github.com/yandex-cloud/go-sdk v0.0.0-20220805164847-cf028e604997 // indirect
|
github.com/yandex-cloud/go-genproto v0.34.0 // indirect
|
||||||
|
github.com/yandex-cloud/go-sdk v0.27.0 // indirect
|
||||||
|
github.com/yandex-cloud/go-sdk/services/dns v0.0.16 // indirect
|
||||||
|
github.com/yandex-cloud/go-sdk/v2 v2.24.0 // indirect
|
||||||
|
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
|
||||||
|
go.mongodb.org/mongo-driver v1.17.6 // indirect
|
||||||
go.opencensus.io v0.24.0 // indirect
|
go.opencensus.io v0.24.0 // indirect
|
||||||
go.uber.org/ratelimit v0.2.0 // indirect
|
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
|
||||||
golang.org/x/crypto v0.17.0 // indirect
|
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 // indirect
|
||||||
golang.org/x/mod v0.11.0 // indirect
|
go.opentelemetry.io/otel v1.38.0 // indirect
|
||||||
golang.org/x/net v0.11.0 // indirect
|
go.opentelemetry.io/otel/metric v1.38.0 // indirect
|
||||||
golang.org/x/oauth2 v0.9.0 // indirect
|
go.opentelemetry.io/otel/trace v1.38.0 // indirect
|
||||||
golang.org/x/sys v0.15.0 // indirect
|
go.uber.org/multierr v1.11.0 // indirect
|
||||||
golang.org/x/text v0.14.0 // indirect
|
go.uber.org/ratelimit v0.3.1 // indirect
|
||||||
golang.org/x/time v0.3.0 // indirect
|
go.uber.org/zap v1.27.0 // indirect
|
||||||
golang.org/x/tools v0.10.0 // indirect
|
go.yaml.in/yaml/v3 v3.0.4 // indirect
|
||||||
google.golang.org/api v0.111.0 // indirect
|
golang.org/x/crypto v0.43.0 // indirect
|
||||||
google.golang.org/appengine v1.6.7 // indirect
|
golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 // indirect
|
||||||
google.golang.org/genproto v0.0.0-20230223222841-637eb2293923 // indirect
|
golang.org/x/mod v0.29.0 // indirect
|
||||||
google.golang.org/grpc v1.53.0 // indirect
|
golang.org/x/net v0.46.0 // indirect
|
||||||
google.golang.org/protobuf v1.28.1 // indirect
|
golang.org/x/oauth2 v0.32.0 // indirect
|
||||||
|
golang.org/x/sync v0.17.0 // indirect
|
||||||
|
golang.org/x/sys v0.37.0 // indirect
|
||||||
|
golang.org/x/text v0.30.0 // indirect
|
||||||
|
golang.org/x/time v0.14.0 // indirect
|
||||||
|
golang.org/x/tools v0.38.0 // indirect
|
||||||
|
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
|
||||||
|
google.golang.org/api v0.254.0 // indirect
|
||||||
|
google.golang.org/appengine v1.6.8 // indirect
|
||||||
|
google.golang.org/genproto v0.0.0-20251103181224-f26f9409b101 // indirect
|
||||||
|
google.golang.org/genproto/googleapis/api v0.0.0-20251103181224-f26f9409b101 // indirect
|
||||||
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20251103181224-f26f9409b101 // indirect
|
||||||
|
google.golang.org/grpc v1.76.0 // indirect
|
||||||
|
google.golang.org/protobuf v1.36.10 // indirect
|
||||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||||
gopkg.in/ns1/ns1-go.v2 v2.7.6 // indirect
|
gopkg.in/ns1/ns1-go.v2 v2.15.1 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ type GlobalContext struct {
|
|||||||
DefaultCSP string
|
DefaultCSP string
|
||||||
PagesDomain string
|
PagesDomain string
|
||||||
Gitea *gitea.GiteaClient
|
Gitea *gitea.GiteaClient
|
||||||
MetricConfig *metrics.LokiMetricConfig
|
MetricConfig *metrics.MetricConfig
|
||||||
Cache *CacheContext
|
Cache *CacheContext
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,6 +36,8 @@ type Context struct {
|
|||||||
// HTTP Stuff
|
// HTTP Stuff
|
||||||
Referrer string
|
Referrer string
|
||||||
UserAgent string
|
UserAgent string
|
||||||
|
DNT string
|
||||||
|
GPC string
|
||||||
Writer http.ResponseWriter
|
Writer http.ResponseWriter
|
||||||
|
|
||||||
// Pointer to the global context
|
// Pointer to the global context
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"code.gitea.io/sdk/gitea"
|
"code.gitea.io/sdk/gitea"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
|
||||||
"git.polynom.me/rio/internal/dns"
|
"git.polynom.me/rio/internal/dns"
|
||||||
)
|
)
|
||||||
@@ -38,6 +39,8 @@ type Repository struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type GiteaClient struct {
|
type GiteaClient struct {
|
||||||
|
Token string
|
||||||
|
|
||||||
GetRepository GetRepositoryMethod
|
GetRepository GetRepositoryMethod
|
||||||
HasBranch HasBranchMethod
|
HasBranch HasBranchMethod
|
||||||
HasUser HasUserMethod
|
HasUser HasUserMethod
|
||||||
@@ -46,8 +49,9 @@ type GiteaClient struct {
|
|||||||
LookupRepoTXT LookupRepoTXTMethod
|
LookupRepoTXT LookupRepoTXTMethod
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewGiteaClient(giteaUrl string, giteaClient *gitea.Client) GiteaClient {
|
func NewGiteaClient(giteaUrl string, token string, giteaClient *gitea.Client) GiteaClient {
|
||||||
return GiteaClient{
|
return GiteaClient{
|
||||||
|
Token: token,
|
||||||
GetRepository: func(username, repositoryName string) (Repository, error) {
|
GetRepository: func(username, repositoryName string) (Repository, error) {
|
||||||
repo, _, err := giteaClient.GetRepo(username, repositoryName)
|
repo, _, err := giteaClient.GetRepo(username, repositoryName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -86,12 +90,19 @@ func NewGiteaClient(giteaUrl string, giteaClient *gitea.Client) GiteaClient {
|
|||||||
path,
|
path,
|
||||||
branch,
|
branch,
|
||||||
)
|
)
|
||||||
|
log.Debugf("GetFile: Requesting '%s'", apiUrl)
|
||||||
client := &http.Client{}
|
client := &http.Client{}
|
||||||
req, err := http.NewRequest("GET", apiUrl, nil)
|
req, err := http.NewRequest("GET", apiUrl, nil)
|
||||||
if since != nil {
|
if since != nil {
|
||||||
sinceFormat := since.Format(time.RFC1123)
|
sinceFormat := since.Format(time.RFC1123)
|
||||||
req.Header.Add("If-Modified-Since", sinceFormat)
|
req.Header.Add("If-Modified-Since", sinceFormat)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add authentication, if we have a token
|
||||||
|
if token != "" {
|
||||||
|
req.Header.Add("Authorization", "token "+token)
|
||||||
|
}
|
||||||
|
|
||||||
resp, err := client.Do(req)
|
resp, err := client.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return []byte{}, true, err
|
return []byte{}, true, err
|
||||||
|
|||||||
@@ -2,29 +2,32 @@ package metrics
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"os"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
type LokiMetricConfig struct {
|
type MetricConfig struct {
|
||||||
Url string
|
Url string
|
||||||
BotUserAgents *[]regexp.Regexp
|
BotUserAgents *[]regexp.Regexp
|
||||||
Enabled bool
|
Enabled bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// Checks if we should send a metric ping to Loki based on the served path.
|
// Checks if we should send a metric ping to page-metrics based on the served path.
|
||||||
func (c *LokiMetricConfig) ShouldSendMetrics(path, userAgent string) bool {
|
func (c *MetricConfig) ShouldSendMetrics(path, userAgent, dnt, gpc string) bool {
|
||||||
if !strings.HasSuffix(path, ".html") || !c.Enabled {
|
if !strings.HasSuffix(path, ".html") || !c.Enabled {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ignore requests where the user have set "Do-Not-Track" or "Do-Not-Sell-My-Data", even though
|
||||||
|
// there is no user data and we're not selling it.
|
||||||
|
if dnt == "1" || gpc == "1" {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// Filter out bots
|
// Filter out bots
|
||||||
for _, pattern := range *c.BotUserAgents {
|
for _, pattern := range *c.BotUserAgents {
|
||||||
if pattern.MatchString(userAgent) {
|
if pattern.MatchString(userAgent) {
|
||||||
@@ -35,35 +38,21 @@ func (c *LokiMetricConfig) ShouldSendMetrics(path, userAgent string) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *LokiMetricConfig) SendMetricPing(domain, path, referrer string) {
|
func (c *MetricConfig) SendMetricPing(domain, path, referrer string) {
|
||||||
msg := fmt.Sprintf("path=\"%s\" referrer=\"%s\"", path, referrer)
|
data := map[string]string{
|
||||||
data := map[string]interface{}{
|
|
||||||
"streams": []map[string]interface{}{
|
|
||||||
{
|
|
||||||
"stream": map[string]string{
|
|
||||||
// Labels
|
|
||||||
"service": "rio",
|
|
||||||
"domain": domain,
|
"domain": domain,
|
||||||
"type": "metric",
|
"path": path,
|
||||||
},
|
"referer": referrer,
|
||||||
"values": [][]interface{}{
|
|
||||||
{
|
|
||||||
strconv.Itoa(int(time.Now().UnixNano())),
|
|
||||||
msg,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
jsonData, err := json.Marshal(data)
|
jsonData, err := json.Marshal(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("Failed to send metric ping to Loki: %v", err)
|
log.Errorf("Failed to send metric ping: %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Debugf("Sending payload %s", string(jsonData))
|
log.Debugf("Sending payload %s", string(jsonData))
|
||||||
|
|
||||||
// Send the ping to the Loki server
|
// Send the ping to the server
|
||||||
go func() {
|
go func() {
|
||||||
res, err := http.Post(
|
res, err := http.Post(
|
||||||
c.Url,
|
c.Url,
|
||||||
@@ -71,19 +60,13 @@ func (c *LokiMetricConfig) SendMetricPing(domain, path, referrer string) {
|
|||||||
strings.NewReader(string(jsonData)),
|
strings.NewReader(string(jsonData)),
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("Failed to send payload to Loki: %v", err)
|
log.Errorf("Failed to send payload to: %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
defer res.Body.Close()
|
defer res.Body.Close()
|
||||||
if res.StatusCode != 204 {
|
if res.StatusCode != 200 {
|
||||||
log.Errorf("Loki returned non-204 status code %d", res.StatusCode)
|
log.Errorf("Server returned non-200 status code %d", res.StatusCode)
|
||||||
body, err := ioutil.ReadAll(res.Body)
|
|
||||||
if err != nil {
|
|
||||||
log.Warnf("Failed to read body. No more specific error message")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
log.Errorf("-> %s", body)
|
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
@@ -91,7 +74,7 @@ func (c *LokiMetricConfig) SendMetricPing(domain, path, referrer string) {
|
|||||||
// Reads a JSON array of bot user agents from disk and parses them
|
// Reads a JSON array of bot user agents from disk and parses them
|
||||||
// into regular expressions.
|
// into regular expressions.
|
||||||
func ReadBotPatterns(file string) ([]regexp.Regexp, error) {
|
func ReadBotPatterns(file string) ([]regexp.Regexp, error) {
|
||||||
content, err := ioutil.ReadFile(file)
|
content, err := os.ReadFile(file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warnf("Failed to read bot metrics file: %v", err)
|
log.Warnf("Failed to read bot metrics file: %v", err)
|
||||||
return []regexp.Regexp{}, err
|
return []regexp.Regexp{}, err
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestShouldPing(t *testing.T) {
|
func TestShouldPing(t *testing.T) {
|
||||||
cfg := LokiMetricConfig{
|
cfg := MetricConfig{
|
||||||
Enabled: true,
|
Enabled: true,
|
||||||
Url: "",
|
Url: "",
|
||||||
BotUserAgents: &[]regexp.Regexp{
|
BotUserAgents: &[]regexp.Regexp{
|
||||||
@@ -14,11 +14,19 @@ func TestShouldPing(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
if cfg.ShouldSendMetrics("/index.html", "random-bot/v23.5") {
|
if cfg.ShouldSendMetrics("/index.html", "random-bot/v23.5", "", "") {
|
||||||
t.Fatalf("Accepted bot user-agent")
|
t.Fatalf("Accepted bot user-agent")
|
||||||
}
|
}
|
||||||
|
|
||||||
if !cfg.ShouldSendMetrics("/index.html", "Firefox/...") {
|
if !cfg.ShouldSendMetrics("/index.html", "Firefox/...", "", "") {
|
||||||
t.Fatalf("Rejected real user-agent")
|
t.Fatalf("Rejected real user-agent")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if cfg.ShouldSendMetrics("/index.html", "Firefox/...", "1", "") {
|
||||||
|
t.Fatalf("Ignored DNT")
|
||||||
|
}
|
||||||
|
|
||||||
|
if cfg.ShouldSendMetrics("/index.html", "Firefox/...", "", "1") {
|
||||||
|
t.Fatalf("Ignored GPC")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ func ServeFile(context *context.Context) {
|
|||||||
context.Writer.Write(content)
|
context.Writer.Write(content)
|
||||||
|
|
||||||
// Tell Loki about if, if desired
|
// Tell Loki about if, if desired
|
||||||
if context.Global.MetricConfig.ShouldSendMetrics(path, context.UserAgent) {
|
if context.Global.MetricConfig.ShouldSendMetrics(path, context.UserAgent, context.DNT, context.GPC) {
|
||||||
context.Global.MetricConfig.SendMetricPing(context.Domain, path, context.Referrer)
|
context.Global.MetricConfig.SendMetricPing(context.Domain, path, context.Referrer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ func equals(a, b []string) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
for i, _ := range a {
|
for i := range a {
|
||||||
if a[i] != b[i] {
|
if a[i] != b[i] {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user