Some checks failed
Docker image builds / build (push) Waiting to run
Asset Build Verification / asset_verification (push) Has been cancelled
Docs deploy / build (push) Has been cancelled
Go Mod Tidy Check / go_mod_tidy_check (push) Has been cancelled
Go / go_tests (push) Has been cancelled
Package builds (unstable) / package_builds (push) Has been cancelled
Smoke tests / smoke-test (default-config-macro) (push) Has been cancelled
Smoke tests / smoke-test (docker-registry) (push) Has been cancelled
Smoke tests / smoke-test (double_slash) (push) Has been cancelled
Smoke tests / smoke-test (forced-language) (push) Has been cancelled
Smoke tests / smoke-test (git-clone) (push) Has been cancelled
Smoke tests / smoke-test (git-push) (push) Has been cancelled
Smoke tests / smoke-test (healthcheck) (push) Has been cancelled
Smoke tests / smoke-test (i18n) (push) Has been cancelled
Smoke tests / smoke-test (log-file) (push) Has been cancelled
Smoke tests / smoke-test (nginx) (push) Has been cancelled
Smoke tests / smoke-test (palemoon/amd64) (push) Has been cancelled
Smoke tests / smoke-test (robots_txt) (push) Has been cancelled
Check Spelling / Check Spelling (push) Has been cancelled
SSH CI / ssh (aarch64-16k) (push) Has been cancelled
SSH CI / ssh (aarch64-4k) (push) Has been cancelled
SSH CI / ssh (ppc64le) (push) Has been cancelled
SSH CI / ssh (riscv64) (push) Has been cancelled
zizmor / zizmor latest via PyPI (push) Has been cancelled
79 lines
2 KiB
Go
79 lines
2 KiB
Go
package config
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
|
|
"git.sad.ovh/sophie/nuke"
|
|
)
|
|
|
|
var (
|
|
ErrNoThresholdRulesDefined = errors.New("config: no thresholds defined")
|
|
ErrThresholdMustHaveName = errors.New("config.Threshold: must set name")
|
|
ErrThresholdMustHaveExpression = errors.New("config.Threshold: must set expression")
|
|
ErrThresholdChallengeMustHaveChallenge = errors.New("config.Threshold: a threshold with the CHALLENGE action must have challenge set")
|
|
ErrThresholdCannotHaveWeighAction = errors.New("config.Threshold: a threshold cannot have the WEIGH action")
|
|
|
|
DefaultThresholds = []Threshold{
|
|
{
|
|
Name: "legacy-nuke-behaviour",
|
|
Expression: &ExpressionOrList{
|
|
Expression: "weight > 0",
|
|
},
|
|
Action: RuleChallenge,
|
|
Challenge: &ChallengeRules{
|
|
Algorithm: "fast",
|
|
Difficulty: nuke.DefaultDifficulty,
|
|
},
|
|
},
|
|
}
|
|
)
|
|
|
|
type Threshold struct {
|
|
Expression *ExpressionOrList `json:"expression" yaml:"expression"`
|
|
Challenge *ChallengeRules `json:"challenge" yaml:"challenge"`
|
|
Name string `json:"name" yaml:"name"`
|
|
Action Rule `json:"action" yaml:"action"`
|
|
}
|
|
|
|
func (t Threshold) Valid() error {
|
|
var errs []error
|
|
|
|
if len(t.Name) == 0 {
|
|
errs = append(errs, ErrThresholdMustHaveName)
|
|
}
|
|
|
|
if t.Expression == nil {
|
|
errs = append(errs, ErrThresholdMustHaveExpression)
|
|
}
|
|
|
|
if t.Expression != nil {
|
|
if err := t.Expression.Valid(); err != nil {
|
|
errs = append(errs, err)
|
|
}
|
|
}
|
|
|
|
if err := t.Action.Valid(); err != nil {
|
|
errs = append(errs, err)
|
|
}
|
|
|
|
if t.Action == RuleWeigh {
|
|
errs = append(errs, ErrThresholdCannotHaveWeighAction)
|
|
}
|
|
|
|
if t.Action == RuleChallenge && t.Challenge == nil {
|
|
errs = append(errs, ErrThresholdChallengeMustHaveChallenge)
|
|
}
|
|
|
|
if t.Challenge != nil {
|
|
if err := t.Challenge.Valid(); err != nil {
|
|
errs = append(errs, err)
|
|
}
|
|
}
|
|
|
|
if len(errs) != 0 {
|
|
return fmt.Errorf("config: threshold entry for %q is not valid:\n%w", t.Name, errors.Join(errs...))
|
|
}
|
|
|
|
return nil
|
|
}
|