Skip to content

Commit f91a4c8

Browse files
authored
Merge branch 'main' into main
2 parents 965eebd + ce9dd70 commit f91a4c8

36 files changed

+1123
-996
lines changed

CHANGELOG.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1111

1212
- Missing `slog.Error` for KEV validations
1313

14+
## [0.7.0] - 2024-05-17
15+
16+
### Changed
17+
18+
- Use ConfigKit with a metaconfig for all commands
19+
20+
### Added
21+
22+
- Gatecheck Config Encoder & Decoder
23+
24+
## [0.6.2] - 2024-05-15
25+
26+
### Changed
27+
28+
- Remove debug information from semgrep decoding
29+
30+
## [0.6.1] - 2024-05-15
31+
32+
### Changed
33+
34+
- Use a table writing package instead of the builtin package
35+
36+
### Added
37+
38+
- `gatecheck list --markdown` support for rendering markdown tables
39+
1440
## [0.6.0] - 2024-04-26
1541

1642
### Changed

cmd/bundle.go

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package cmd
2+
3+
import (
4+
"log/slog"
5+
"os"
6+
"path"
7+
8+
"github.com/gatecheckdev/gatecheck/pkg/gatecheck"
9+
"github.com/spf13/cobra"
10+
)
11+
12+
var bundleCmd = &cobra.Command{
13+
Use: "bundle",
14+
Short: "create and manage a gatecheck bundle",
15+
}
16+
17+
var bundleCreateCmd = &cobra.Command{
18+
Use: "create BUNDLE_FILE TARGET_FILE",
19+
Short: "create a new bundle with a new file",
20+
Aliases: []string{"init"},
21+
Args: cobra.ExactArgs(2),
22+
PreRunE: func(cmd *cobra.Command, args []string) error {
23+
bundleFilename := args[0]
24+
targetFilename := args[1]
25+
26+
bundleFile, err := os.OpenFile(bundleFilename, os.O_CREATE|os.O_WRONLY, 0o644)
27+
if err != nil {
28+
return err
29+
}
30+
targetFile, err := os.Open(targetFilename)
31+
if err != nil {
32+
return err
33+
}
34+
35+
RuntimeConfig.bundleFile = bundleFile
36+
RuntimeConfig.targetFile = targetFile
37+
RuntimeConfig.BundleTagValue = RuntimeConfig.BundleTag.Value().([]string)
38+
return nil
39+
},
40+
RunE: func(cmd *cobra.Command, args []string) error {
41+
targetFilename := args[1]
42+
label := path.Base(targetFilename)
43+
bf, tf := RuntimeConfig.bundleFile, RuntimeConfig.targetFile
44+
tags := RuntimeConfig.BundleTagValue
45+
return gatecheck.CreateBundle(bf, tf, label, tags)
46+
},
47+
}
48+
49+
var bundleAddCmd = &cobra.Command{
50+
Use: "add BUNDLE_FILE TARGET_FILE",
51+
Short: "add a file to a bundle",
52+
Args: cobra.ExactArgs(2),
53+
PreRunE: func(cmd *cobra.Command, args []string) error {
54+
bundleFilename := args[0]
55+
targetFilename := args[1]
56+
57+
bundleFile, err := os.OpenFile(bundleFilename, os.O_RDWR, 0o644)
58+
if err != nil {
59+
return err
60+
}
61+
targetFile, err := os.Open(targetFilename)
62+
if err != nil {
63+
return err
64+
}
65+
66+
RuntimeConfig.bundleFile = bundleFile
67+
RuntimeConfig.targetFile = targetFile
68+
RuntimeConfig.BundleTagValue = RuntimeConfig.BundleTag.Value().([]string)
69+
return nil
70+
},
71+
RunE: func(cmd *cobra.Command, args []string) error {
72+
targetFilename := args[1]
73+
slog.Info("bundle tag", "environment", os.Getenv("GATECHECK_BUNDLE_TAG"))
74+
label := path.Base(targetFilename)
75+
bf, tf := RuntimeConfig.bundleFile, RuntimeConfig.targetFile
76+
tags := RuntimeConfig.BundleTagValue
77+
return gatecheck.AppendToBundle(bf, tf, label, tags)
78+
},
79+
}
80+
81+
var bundleRemoveCmd = &cobra.Command{
82+
Use: "remove BUNDLE_FILE TARGET_FILE",
83+
Short: "remove a file from a bundle by label",
84+
Aliases: []string{"rm"},
85+
Args: cobra.ExactArgs(2),
86+
PreRunE: func(cmd *cobra.Command, args []string) error {
87+
bundleFilename := args[0]
88+
89+
bundleFile, err := os.OpenFile(bundleFilename, os.O_RDWR, 0o644)
90+
if err != nil {
91+
return err
92+
}
93+
RuntimeConfig.bundleFile = bundleFile
94+
return nil
95+
},
96+
RunE: func(cmd *cobra.Command, args []string) error {
97+
label := args[1]
98+
return gatecheck.RemoveFromBundle(RuntimeConfig.bundleFile, label)
99+
},
100+
}
101+
102+
func newBundleCommand() *cobra.Command {
103+
RuntimeConfig.BundleTag.SetupCobra(bundleCreateCmd)
104+
RuntimeConfig.BundleTag.SetupCobra(bundleAddCmd)
105+
106+
bundleCmd.AddCommand(bundleCreateCmd, bundleAddCmd, bundleRemoveCmd)
107+
return bundleCmd
108+
}

cmd/cli-config.go

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
package cmd
2+
3+
import (
4+
"io"
5+
"os"
6+
"strings"
7+
8+
"github.com/gatecheckdev/configkit"
9+
"github.com/gatecheckdev/gatecheck/pkg/gatecheck"
10+
"github.com/spf13/cobra"
11+
)
12+
13+
var (
14+
metadataFlagUsage = "flag_usage"
15+
metadataFieldType = "field_type"
16+
metadataRequired = "required"
17+
metadataActionInputName = "action_input_name"
18+
)
19+
20+
type metaConfig struct {
21+
BundleTag configkit.MetaField
22+
EPSSURL configkit.MetaField
23+
KEVURL configkit.MetaField
24+
EPSSFilename configkit.MetaField
25+
KEVFilename configkit.MetaField
26+
Verbose configkit.MetaField
27+
Silent configkit.MetaField
28+
ConfigFilename configkit.MetaField
29+
Audit configkit.MetaField
30+
BundleTagValue []string
31+
bundleFile *os.File
32+
targetFile *os.File
33+
epssFile *os.File
34+
kevFile *os.File
35+
listSrcReader io.Reader
36+
listSrcName string
37+
listFormat string
38+
listAll bool
39+
configOutputWriter io.Writer
40+
configOutputFormat string
41+
gatecheckConfig *gatecheck.Config
42+
}
43+
44+
var RuntimeConfig = metaConfig{
45+
BundleTag: configkit.MetaField{
46+
FieldName: "BundleTag",
47+
EnvKey: "GATECHECK_BUNDLE_TAG",
48+
DefaultValue: "",
49+
FlagValueP: new([]string),
50+
EnvToValueFunc: func(s string) any {
51+
return strings.Split(s, ",")
52+
},
53+
Metadata: map[string]string{
54+
metadataFlagUsage: "file properties for metadata",
55+
metadataFieldType: "string",
56+
metadataActionInputName: "bundle_tag",
57+
},
58+
CobraSetupFunc: func(f configkit.MetaField, cmd *cobra.Command) {
59+
valueP := f.FlagValueP.(*[]string)
60+
usage := f.Metadata[metadataFlagUsage]
61+
cmd.Flags().StringSliceVarP(valueP, "tag", "t", []string{}, usage)
62+
},
63+
},
64+
EPSSURL: configkit.MetaField{
65+
FieldName: "EPSSURL",
66+
EnvKey: "GATECHECK_EPSS_URL",
67+
DefaultValue: "",
68+
FlagValueP: new(string),
69+
CobraSetupFunc: func(f configkit.MetaField, cmd *cobra.Command) {
70+
valueP := f.FlagValueP.(*string)
71+
usage := f.Metadata[metadataFlagUsage]
72+
cmd.Flags().StringVar(valueP, "epss-url", "", usage)
73+
},
74+
Metadata: map[string]string{
75+
metadataFlagUsage: "The url for the FIRST.org EPSS API (\"\" will use FIRST.org official API)",
76+
metadataFieldType: "string",
77+
metadataActionInputName: "epss_url",
78+
},
79+
},
80+
KEVURL: configkit.MetaField{
81+
FieldName: "KEVURL",
82+
EnvKey: "GATECHECK_KEV_URL",
83+
DefaultValue: "",
84+
FlagValueP: new(string),
85+
CobraSetupFunc: func(f configkit.MetaField, cmd *cobra.Command) {
86+
valueP := f.FlagValueP.(*string)
87+
usage := f.Metadata[metadataFlagUsage]
88+
cmd.Flags().StringVar(valueP, "kev-url", "", usage)
89+
},
90+
Metadata: map[string]string{
91+
metadataFlagUsage: "The url for the CISA KEV API (\"\" will use CISA Official API)",
92+
metadataFieldType: "string",
93+
metadataActionInputName: "kev_url",
94+
},
95+
},
96+
EPSSFilename: configkit.MetaField{
97+
FieldName: "EPSSFilename",
98+
EnvKey: "GATECHECK_EPSS_FILENAME",
99+
DefaultValue: "",
100+
FlagValueP: new(string),
101+
CobraSetupFunc: func(f configkit.MetaField, cmd *cobra.Command) {
102+
valueP := f.FlagValueP.(*string)
103+
usage := f.Metadata[metadataFlagUsage]
104+
cmd.Flags().StringVar(valueP, "epss-filename", "", usage)
105+
},
106+
Metadata: map[string]string{
107+
metadataFlagUsage: "the filename for a FIRST.org EPSS csv file",
108+
metadataFieldType: "string",
109+
metadataActionInputName: "epss_filename",
110+
},
111+
},
112+
KEVFilename: configkit.MetaField{
113+
FieldName: "KEVFilename",
114+
EnvKey: "GATECHECK_EPSS_FILENAME",
115+
DefaultValue: "",
116+
FlagValueP: new(string),
117+
CobraSetupFunc: func(f configkit.MetaField, cmd *cobra.Command) {
118+
valueP := f.FlagValueP.(*string)
119+
usage := f.Metadata[metadataFlagUsage]
120+
cmd.Flags().StringVar(valueP, "kev-filename", "", usage)
121+
},
122+
Metadata: map[string]string{
123+
metadataFlagUsage: "the filename for a FIRST.org KEV json file",
124+
metadataFieldType: "string",
125+
metadataActionInputName: "kev_filename",
126+
},
127+
},
128+
Verbose: configkit.MetaField{
129+
FieldName: "Verbose",
130+
EnvKey: "GATECHECK_VERBOSE",
131+
DefaultValue: false,
132+
FlagValueP: new(bool),
133+
CobraSetupFunc: func(f configkit.MetaField, cmd *cobra.Command) {
134+
valueP := f.FlagValueP.(*bool)
135+
usage := f.Metadata[metadataFlagUsage]
136+
cmd.PersistentFlags().BoolVarP(valueP, "verbose", "v", false, usage)
137+
},
138+
Metadata: map[string]string{
139+
metadataFlagUsage: "log level set to debug",
140+
metadataFieldType: "bool",
141+
metadataActionInputName: "verbose",
142+
},
143+
},
144+
Silent: configkit.MetaField{
145+
FieldName: "Silent",
146+
EnvKey: "GATECHECK_SILENT",
147+
DefaultValue: false,
148+
FlagValueP: new(bool),
149+
CobraSetupFunc: func(f configkit.MetaField, cmd *cobra.Command) {
150+
valueP := f.FlagValueP.(*bool)
151+
usage := f.Metadata[metadataFlagUsage]
152+
cmd.PersistentFlags().BoolVar(valueP, "silent", false, usage)
153+
},
154+
Metadata: map[string]string{
155+
metadataFlagUsage: "log level set to only warnings & errors",
156+
metadataFieldType: "bool",
157+
metadataActionInputName: "silent",
158+
},
159+
},
160+
ConfigFilename: configkit.MetaField{
161+
FieldName: "ConfigFilename",
162+
EnvKey: "GATECHECK_CONFIG_FILENAME",
163+
DefaultValue: "",
164+
FlagValueP: new(string),
165+
CobraSetupFunc: func(f configkit.MetaField, cmd *cobra.Command) {
166+
valueP := f.FlagValueP.(*string)
167+
usage := f.Metadata[metadataFlagUsage]
168+
cmd.PersistentFlags().StringVarP(valueP, "file", "f", "", usage)
169+
},
170+
Metadata: map[string]string{
171+
metadataFlagUsage: "a validation configuration file",
172+
metadataFieldType: "string",
173+
metadataActionInputName: "config_filename",
174+
},
175+
},
176+
Audit: configkit.MetaField{
177+
FieldName: "Audit",
178+
EnvKey: "GATECHECK_AUDIT",
179+
DefaultValue: false,
180+
FlagValueP: new(bool),
181+
CobraSetupFunc: func(f configkit.MetaField, cmd *cobra.Command) {
182+
valueP := f.FlagValueP.(*bool)
183+
usage := f.Metadata[metadataFlagUsage]
184+
cmd.PersistentFlags().BoolVarP(valueP, "audit", "a", false, usage)
185+
},
186+
Metadata: map[string]string{
187+
metadataFlagUsage: "audit mode - will run all rules but wil always exit 0 for validation failures",
188+
metadataFieldType: "bool",
189+
metadataActionInputName: "audit",
190+
},
191+
},
192+
}

0 commit comments

Comments
 (0)