我写了一个golang程序,它将规则附加到文件中,如下所述所需格式:
customRules:
custom-rules.yaml: |-
- rule: Pod Created in Kube Namespace
append: true
condition: and (k8s_audit_never_true)
source: k8s_audit
- rule: Create files below dev
append: true
condition: and (never_true)
source: syscall
我写了一个围棋程序,如果没有上面的格式,我就找不到我缺少的东西。
package main
import (
"fmt"
"io/ioutil"
"log"
"gopkg.in/yaml.v2"
)
type AutoGenerated struct {
CustomRules CustomRules `yaml:"customRules"`
}
type CustomRulesYaml struct {
Rule string `yaml:"rule"`
Append bool `yaml:"append"`
Condition string `yaml:"condition"`
Source string `yaml:"source"`
}
type CustomRules struct {
CustomRulesYaml []CustomRulesYaml `yaml:"custom-rules.yaml"`
}
func main() {
// yfile, err := ioutil.ReadFile("/home/revaa/falco/custom_rules.yaml")
// if err != nil {
// log.Fatal(err)
// }
c1 := CustomRulesYaml{"K8s serviceaccount created", false, "(never_true)", "k8s-audit"}
c2 := CustomRulesYaml{"k8s service created", false, "never_true", "k8s-audit"}
c := []CustomRulesYaml{c1, c2}
c3 := CustomRules{c}
data := AutoGenerated{c3}
check, err := yaml.Marshal(&data)
if err != nil {
log.Fatal(err)
}
err2 := ioutil.WriteFile("/home/revaa/falco/custom_rules.yaml", check, 0)
if err2 != nil {
log.Fatal(err2)
}
fmt.Println("data written")
}
这是我的go代码,在运行程序时,YAML不会以上述格式附加。值的附加方式如下。
customRules:
custom-rules.yaml:
- rule: K8s serviceaccount created
append: false
condition: (never_true)
source: k8s-audit
- rule: k8s service created
append: false
condition: never_true
source: k8s-audit
为什么我没有得到所需格式的YAML文件?
您所需的输入格式表示以下YAML结构:
- 有一个字典有一个键值对。
- 关键是
customRules
- 该值是一个字典
- 关键是
存储在上述值中的字典有一个条目:
- 关键是
custom-rules.yaml
- 该值是一个字符串
存储在上述值中的字符串为:
"- rule: Pod Created in Kube Namespacen append: truen condition: and (k8s_audit_never_true)n source: k8s_auditn- rule: Create files below devn append: truen condition: and (never_true)n source: syscall"
也就是说,此不是列表类型。这是一根绳子。
现在,事实是,这个字符串是有效的——尽管有点不可靠——YAML,如果读取,它将生成一个由2个元素组成的列表(Go中的切片(,每个元素都是一个字典(通常对应于Go中的映射或结构类型(。
如果您真的需要这个,那么您的代码是接近正确的。您需要封送两次,而不是将[]CustomRulesYaml
封装在类型中。以下是Go Playground上的代码变体,其输出为:
custom-rules.yaml: |
- rule: K8s serviceaccount created
append: false
condition: (never_true)
source: k8s-audit
- rule: k8s service created
append: false
condition: never_true
source: k8s-audit
现在,请注意,该输出有一个管道符号|
,没有后缀连字符-
。这是因为封送处理后的字符串string(asBytes)
以换行符结尾。它可能应该以换行符结束,这就是yaml.Marshal
产生换行符的原因。但是您的示例输入并没有以换行符结束,这就是为什么您的示例输出具有|-
而不仅仅是|
:-
的意思是";不要包含换行符;。
要从现有代码中获得,您必须去掉换行符,例如,添加:
asBytes = asBytes[0:len(asBytes)-1] // delete trailing newline
在c3
中构建字符串并对其进行封送之前。