37 lines
1.4 KiB
Go
37 lines
1.4 KiB
Go
package lint
|
||
|
||
import (
|
||
"strings"
|
||
|
||
"github.com/vladimir/goherence/internal/parser"
|
||
)
|
||
|
||
// DynamicIncludeRule требует, чтобы путь include_tasks/import_role был
|
||
// статической строкой, известной уже на этапе парсинга плейбука — без
|
||
// подстановки переменных внутрь пути. Это убирает GOTO-с-параметрами
|
||
// как способ "программировать" маршрутизацию тасков вместо декларативного
|
||
// описания состояния.
|
||
type DynamicIncludeRule struct{}
|
||
|
||
func (r *DynamicIncludeRule) Name() string { return "static-include-only" }
|
||
|
||
func (r *DynamicIncludeRule) Check(pb *parser.Playbook) []Violation {
|
||
var out []Violation
|
||
walkTasks(pb, func(loc string, t *parser.Task) {
|
||
if t.Module != "include_tasks" && t.Module != "import_role" {
|
||
return
|
||
}
|
||
path, _ := t.Args["path"].(string)
|
||
if path == "" {
|
||
path, _ = t.Args["name"].(string) // import_role обычно использует "name"
|
||
}
|
||
if strings.Contains(path, "{{") {
|
||
out = append(out, Violation{
|
||
Rule: r.Name(), Severity: Error, Location: loc,
|
||
Message: "путь include должен быть статическим — динамический " +
|
||
t.Module + " запрещён: " + path,
|
||
})
|
||
}
|
||
})
|
||
return out
|
||
}
|