Skip to content

Commit 445b71c

Browse files
committed
🧹 make providers/defaults
Signed-off-by: Dominik Richter <dominik.richter@gmail.com>
1 parent 0d74fa7 commit 445b71c

File tree

5 files changed

+313
-39
lines changed

5 files changed

+313
-39
lines changed

.github/actions/spelling/expect.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ customresources
1515
datapath
1616
Ddos
1717
dfw
18+
DIRECTORYID
1819
dlq
1920
ekm
2021
elbv

Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,10 @@ providers/proto:
158158
providers/config:
159159
go run ./providers-sdk/v1/util/configure/configure.go -f providers.yaml -o providers/builtin_dev.go
160160

161+
.PHONY: providers/defaults
162+
providers/defaults:
163+
go run ./providers-sdk/v1/util/defaults/defaults.go -o providers/defaults.go
164+
161165
.PHONY: providers/lr
162166
providers/lr:
163167
go build -o lr ./providers-sdk/v1/lr/cli/main.go
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
// Copyright (c) Mondoo, Inc.
2+
// SPDX-License-Identifier: BUSL-1.1
3+
4+
package main
5+
6+
import (
7+
"encoding/json"
8+
"errors"
9+
"fmt"
10+
"go/format"
11+
"os"
12+
"os/exec"
13+
"path/filepath"
14+
"sort"
15+
"strings"
16+
17+
"github.com/rs/zerolog"
18+
"github.com/rs/zerolog/log"
19+
"github.com/spf13/cobra"
20+
"go.mondoo.com/cnquery/v9/logger"
21+
"go.mondoo.com/cnquery/v9/providers-sdk/v1/plugin"
22+
)
23+
24+
var rootCmd = &cobra.Command{
25+
Use: "defaults [-o file]",
26+
Short: "configure provider defaults",
27+
Run: func(cmd *cobra.Command, args []string) {
28+
outPath, err := cmd.Flags().GetString("output")
29+
if err != nil {
30+
log.Fatal().Err(err).Msg("Can't get --output")
31+
}
32+
33+
providers, err := getProviders()
34+
if err != nil {
35+
log.Fatal().Err(err).Msg("failed to get providers")
36+
}
37+
38+
var configs []*plugin.Provider
39+
for name, path := range providers {
40+
provider, err := getConfig(name, path)
41+
if err != nil {
42+
log.Error().Err(err).Str("provider", name).Msg("failed to get provider config")
43+
} else {
44+
configs = append(configs, provider)
45+
}
46+
}
47+
48+
sort.Slice(configs, func(i, j int) bool {
49+
return configs[i].Name < configs[j].Name
50+
})
51+
52+
res, err := goGen(configs)
53+
if err != nil {
54+
log.Fatal().Err(err).Msg("failed to generate go code for provideer defaults")
55+
}
56+
57+
if err = os.WriteFile(outPath, res, 0o644); err != nil {
58+
log.Fatal().Err(err).Str("path", outPath).Msg("failed to save file")
59+
} else {
60+
log.Info().Str("path", outPath).Msg("updated")
61+
}
62+
},
63+
}
64+
65+
func goGen(configs []*plugin.Provider) ([]byte, error) {
66+
var body strings.Builder
67+
68+
for i := range configs {
69+
conf := configs[i]
70+
71+
var conns strings.Builder
72+
for j := range conf.Connectors {
73+
conn := conf.Connectors[j]
74+
conns.WriteString(fmt.Sprintf(connectorTemplate, conn.Name, conn.Use, conn.Short))
75+
}
76+
body.WriteString(fmt.Sprintf(providerTemplate, conf.Name, conf.Name, conf.ID, conf.ConnectionTypes, conns.String()))
77+
}
78+
79+
res := fmt.Sprintf(template, body.String())
80+
return format.Source([]byte(res))
81+
}
82+
83+
const template = `// Copyright (c) Mondoo, Inc.
84+
// SPDX-License-Identifier: BUSL-1.1
85+
//
86+
// This file is auto-generated by 'make providers/defaults'
87+
88+
package providers
89+
90+
import "go.mondoo.com/cnquery/v9/providers-sdk/v1/plugin"
91+
92+
// DefaultProviders are useful when working in air-gapped environments
93+
// to tell users what providers are used for common connections, when there
94+
// is no other way to find out.
95+
var DefaultProviders Providers = map[string]*Provider{
96+
%s
97+
}
98+
`
99+
100+
const providerTemplate = `
101+
%#v: {
102+
Provider: &plugin.Provider{
103+
Name: %#v,
104+
ID: %#v,
105+
ConnectionTypes: %#v,
106+
Connectors: []plugin.Connector{
107+
%s
108+
},
109+
},
110+
},
111+
`
112+
113+
const connectorTemplate = `
114+
{
115+
Name: %#v,
116+
Use: %#v,
117+
Short: %#v,
118+
},
119+
`
120+
121+
func getProviders() (map[string]string, error) {
122+
dir, err := os.ReadDir("./providers")
123+
if err != nil {
124+
return nil, err
125+
}
126+
127+
res := map[string]string{}
128+
for i := range dir {
129+
entry := dir[i]
130+
if !entry.IsDir() {
131+
continue
132+
}
133+
name := entry.Name()
134+
res[name] = filepath.Join("./providers", name)
135+
}
136+
return res, nil
137+
}
138+
139+
func getConfig(providerName string, providerPath string) (*plugin.Provider, error) {
140+
log.Info().Str("provider", providerName).Msg("generate provider config")
141+
cmd := exec.Command("go", "run", "./gen/main.go", ".")
142+
cmd.Dir = providerPath
143+
_, err := cmd.Output()
144+
if err != nil {
145+
return nil, errors.New("failed to run:" + cmd.String() + " in " + providerPath)
146+
}
147+
148+
raw, err := os.ReadFile(filepath.Join(providerPath, "dist", providerName+".json"))
149+
if err != nil {
150+
return nil, err
151+
}
152+
153+
var res plugin.Provider
154+
err = json.Unmarshal(raw, &res)
155+
return &res, err
156+
}
157+
158+
func init() {
159+
rootCmd.Flags().StringP("output", "o", "providers/defaults.go", "output go-file for defaults of providers")
160+
}
161+
162+
func main() {
163+
logger.CliCompactLogger(logger.LogOutputWriter)
164+
zerolog.SetGlobalLevel(zerolog.DebugLevel)
165+
166+
if err := rootCmd.Execute(); err != nil {
167+
fmt.Fprintln(os.Stderr, err)
168+
os.Exit(1)
169+
}
170+
}

0 commit comments

Comments
 (0)