72 lines
1.3 KiB
Go
72 lines
1.3 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"go/ast"
|
|
"go/parser"
|
|
"go/token"
|
|
"log"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
func main() {
|
|
|
|
configs := map[string]string{
|
|
"sshpiperd": "../../main.go",
|
|
"workingdir": "../../../../plugin/workingdir/main.go",
|
|
"yaml": "../../../../plugin/yaml/main.go",
|
|
"fixed": "../../../../plugin/fixed/main.go",
|
|
"failtoban": "../../../../plugin/failtoban/main.go",
|
|
}
|
|
|
|
for k, v := range configs {
|
|
extractFlags(k, v)
|
|
}
|
|
}
|
|
|
|
func extractFlags(namespace, filePath string) {
|
|
file, err := os.Open(filePath)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer file.Close()
|
|
|
|
fset := token.NewFileSet()
|
|
|
|
node, err := parser.ParseFile(fset, filePath, file, parser.AllErrors)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
ast.Inspect(node, func(n ast.Node) bool {
|
|
|
|
if cl, ok := n.(*ast.CompositeLit); ok {
|
|
|
|
if t, ok := cl.Type.(*ast.SelectorExpr); ok {
|
|
|
|
o, ok := t.X.(*ast.Ident)
|
|
if !ok {
|
|
return true
|
|
}
|
|
|
|
if o.Name != "cli" {
|
|
return true
|
|
}
|
|
|
|
if !strings.HasSuffix(t.Sel.Name, "Flag") {
|
|
return true
|
|
}
|
|
|
|
for _, v := range cl.Elts {
|
|
if kv, ok := v.(*ast.KeyValueExpr); ok {
|
|
if kv.Key.(*ast.Ident).Name == "Name" {
|
|
fmt.Println(namespace + "." + strings.Trim(kv.Value.(*ast.BasicLit).Value, " \""))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return true
|
|
})
|
|
}
|