1
0
Fork 0
mirror of https://codeberg.org/Codeberg/pages-server.git synced 2025-09-15 20:56:56 +00:00

feat: make logging interval configurable (#511)

Reviewed-on: https://codeberg.org/Codeberg/pages-server/pulls/511
Reviewed-by: Andreas Shimokawa <ashimokawa@noreply.codeberg.org>
Co-authored-by: crapStone <me@crapstone.dev>
Co-committed-by: crapStone <me@crapstone.dev>
This commit is contained in:
crapStone 2025-09-10 14:22:10 +02:00 committed by Andreas Shimokawa
parent 30bc87089c
commit 2e271575c9
8 changed files with 31 additions and 8 deletions

View file

@ -117,10 +117,16 @@ var (
}, },
&cli.UintFlag{ &cli.UintFlag{
Name: "log-most-active-ips", Name: "log-most-active-ips",
Usage: "logs a the n most active IPs every hour", Usage: "logs a the n most active IPs every hour (or value of --ip-logging-interval)",
EnvVars: []string{"LOG_MOST_ACTIVE_IPS"}, EnvVars: []string{"LOG_MOST_ACTIVE_IPS"},
Value: 10, Value: 10,
}, },
&cli.UintFlag{
Name: "ip-logging-interval",
Usage: "interval in seconds for ip address logging",
EnvVars: []string{"IP_LOGGING_INTERVAL"},
Value: 0,
},
// Default branches to fetch assets from // Default branches to fetch assets from
&cli.StringSliceFlag{ &cli.StringSliceFlag{

View file

@ -16,6 +16,7 @@ type ServerConfig struct {
UseProxyProtocol bool `default:"false"` UseProxyProtocol bool `default:"false"`
LogMostActiveIps bool `default:"false"` LogMostActiveIps bool `default:"false"`
MostActiveIpCount uint `default:"10"` MostActiveIpCount uint `default:"10"`
LoggingInterval uint `default:"0"`
MainDomain string MainDomain string
RawDomain string RawDomain string
PagesBranches []string PagesBranches []string

View file

@ -76,6 +76,9 @@ func mergeServerConfig(ctx *cli.Context, config *ServerConfig) {
config.LogMostActiveIps = true config.LogMostActiveIps = true
config.MostActiveIpCount = ctx.Uint("log-most-active-ips") config.MostActiveIpCount = ctx.Uint("log-most-active-ips")
} }
if ctx.IsSet("ip-logging-interval") {
config.LoggingInterval = ctx.Uint("ip-logging-interval")
}
if ctx.IsSet("pages-domain") { if ctx.IsSet("pages-domain") {
config.MainDomain = ctx.String("pages-domain") config.MainDomain = ctx.String("pages-domain")

View file

@ -143,6 +143,7 @@ func TestMergeConfigShouldReplaceAllExistingValuesGivenAllArgsExist(t *testing.T
UseProxyProtocol: false, UseProxyProtocol: false,
LogMostActiveIps: false, LogMostActiveIps: false,
MostActiveIpCount: 10, MostActiveIpCount: 10,
LoggingInterval: 0,
MainDomain: "original", MainDomain: "original",
RawDomain: "original", RawDomain: "original",
PagesBranches: []string{"original"}, PagesBranches: []string{"original"},
@ -185,6 +186,7 @@ func TestMergeConfigShouldReplaceAllExistingValuesGivenAllArgsExist(t *testing.T
HttpServerEnabled: true, HttpServerEnabled: true,
UseProxyProtocol: true, UseProxyProtocol: true,
LogMostActiveIps: true, LogMostActiveIps: true,
LoggingInterval: 300,
MostActiveIpCount: 42, MostActiveIpCount: 42,
MainDomain: "changed", MainDomain: "changed",
RawDomain: "changed", RawDomain: "changed",
@ -235,6 +237,7 @@ func TestMergeConfigShouldReplaceAllExistingValuesGivenAllArgsExist(t *testing.T
"--enable-http-server", "--enable-http-server",
"--use-proxy-protocol", "--use-proxy-protocol",
"--log-most-active-ips", "42", "--log-most-active-ips", "42",
"--ip-logging-interval", "300",
// Forge // Forge
"--forge-root", "changed", "--forge-root", "changed",
"--forge-api-token", "changed", "--forge-api-token", "changed",
@ -288,6 +291,7 @@ func TestMergeServerConfigShouldReplaceAllExistingValuesGivenAllArgsExist(t *tes
UseProxyProtocol: false, UseProxyProtocol: false,
LogMostActiveIps: false, LogMostActiveIps: false,
MostActiveIpCount: 10, MostActiveIpCount: 10,
LoggingInterval: 0,
MainDomain: "original", MainDomain: "original",
RawDomain: "original", RawDomain: "original",
AllowedCorsDomains: []string{"original"}, AllowedCorsDomains: []string{"original"},
@ -304,6 +308,7 @@ func TestMergeServerConfigShouldReplaceAllExistingValuesGivenAllArgsExist(t *tes
UseProxyProtocol: true, UseProxyProtocol: true,
LogMostActiveIps: true, LogMostActiveIps: true,
MostActiveIpCount: 21, MostActiveIpCount: 21,
LoggingInterval: 300,
MainDomain: "changed", MainDomain: "changed",
RawDomain: "changed", RawDomain: "changed",
AllowedCorsDomains: fixArrayFromCtx(ctx, "allowed-cors-domains", []string{"changed"}), AllowedCorsDomains: fixArrayFromCtx(ctx, "allowed-cors-domains", []string{"changed"}),
@ -325,6 +330,7 @@ func TestMergeServerConfigShouldReplaceAllExistingValuesGivenAllArgsExist(t *tes
"--enable-http-server", "--enable-http-server",
"--use-proxy-protocol", "--use-proxy-protocol",
"--log-most-active-ips", "21", "--log-most-active-ips", "21",
"--ip-logging-interval", "300",
}, },
) )
} }
@ -350,6 +356,7 @@ func TestMergeServerConfigShouldReplaceOnlyOneValueExistingValueGivenOnlyOneArgE
sc.LogMostActiveIps = true sc.LogMostActiveIps = true
sc.MostActiveIpCount = 42 sc.MostActiveIpCount = 42
}}, }},
{args: []string{"--ip-logging-interval", "300"}, callback: func(sc *ServerConfig) { sc.LoggingInterval = 300 }},
} }
for _, pair := range testValuePairs { for _, pair := range testValuePairs {
@ -369,6 +376,7 @@ func TestMergeServerConfigShouldReplaceOnlyOneValueExistingValueGivenOnlyOneArgE
UseProxyProtocol: false, UseProxyProtocol: false,
LogMostActiveIps: false, LogMostActiveIps: false,
MostActiveIpCount: 10, MostActiveIpCount: 10,
LoggingInterval: 0,
} }
expectedConfig := cfg expectedConfig := cfg

6
flake.lock generated
View file

@ -20,11 +20,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1751271578, "lastModified": 1757068644,
"narHash": "sha256-P/SQmKDu06x8yv7i0s8bvnnuJYkxVGBWLWHaU+tt4YY=", "narHash": "sha256-NOrUtIhTkIIumj1E/Rsv1J37Yi3xGStISEo8tZm3KW4=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "3016b4b15d13f3089db8a41ef937b13a9e33a8df", "rev": "8eb28adfa3dc4de28e792e3bf49fcf9007ca8ac9",
"type": "github" "type": "github"
}, },
"original": { "original": {

View file

@ -45,7 +45,7 @@ func GetTargetFromDNS(domain, mainDomainSuffix, firstDefaultBranch string) (targ
_ = lookupCache.Add(domain, cname) _ = lookupCache.Add(domain, cname)
} }
if cname == "" { if cname == "" {
return return targetOwner, targetRepo, targetBranch
} }
cnameParts := strings.Split(strings.TrimSuffix(cname, mainDomainSuffix), ".") cnameParts := strings.Split(strings.TrimSuffix(cname, mainDomainSuffix), ".")
targetOwner = cnameParts[len(cnameParts)-1] targetOwner = cnameParts[len(cnameParts)-1]
@ -62,5 +62,5 @@ func GetTargetFromDNS(domain, mainDomainSuffix, firstDefaultBranch string) (targ
targetBranch = firstDefaultBranch targetBranch = firstDefaultBranch
} }
// if targetBranch is still empty, the caller must find the default branch // if targetBranch is still empty, the caller must find the default branch
return return targetOwner, targetRepo, targetBranch
} }

View file

@ -111,7 +111,7 @@ func (t *writeCacheReader) Read(p []byte) (n int, err error) {
_, _ = t.buffer.Write(p[:n]) _, _ = t.buffer.Write(p[:n])
} }
} }
return return n, err
} }
func (t *writeCacheReader) Close() error { func (t *writeCacheReader) Close() error {

View file

@ -140,7 +140,12 @@ func Serve(ctx *cli.Context) error {
mostActiveIpMap := &sync.Map{} mostActiveIpMap := &sync.Map{}
if cfg.Server.LogMostActiveIps { if cfg.Server.LogMostActiveIps {
go func() { go func() {
ticker := time.NewTicker(1 * time.Hour) interval := 1 * time.Hour
if cfg.Server.LoggingInterval > 0 {
interval = time.Duration(cfg.Server.LoggingInterval) * time.Second
}
ticker := time.NewTicker(interval)
for range ticker.C { for range ticker.C {
type kv struct { type kv struct {
Key string Key string