cscli: generic hubappsec (#2642)
This commit is contained in:
parent
493880824b
commit
8fa84e5cd9
8 changed files with 301 additions and 413 deletions
|
@ -1,192 +0,0 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
log "github.com/sirupsen/logrus"
|
||||
"github.com/spf13/cobra"
|
||||
"golang.org/x/text/cases"
|
||||
"golang.org/x/text/language"
|
||||
"gopkg.in/yaml.v3"
|
||||
|
||||
"github.com/crowdsecurity/crowdsec/cmd/crowdsec-cli/require"
|
||||
"github.com/crowdsecurity/crowdsec/pkg/appsec"
|
||||
"github.com/crowdsecurity/crowdsec/pkg/appsec/appsec_rule"
|
||||
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
||||
)
|
||||
|
||||
func NewAppsecRulesCmd() *cobra.Command {
|
||||
cmdAppsecRules := &cobra.Command{
|
||||
Use: "appsec-rules <action> [appsec-rule]...",
|
||||
Short: "Manage hub appsec rules",
|
||||
Example: `cscli appsec-rules list -a
|
||||
cscli appsec-rules install crowdsecurity/crs
|
||||
cscli appsec-rules inspect crowdsecurity/crs
|
||||
cscli appsec-rules upgrade crowdsecurity/crs
|
||||
cscli appsec-rules remove crowdsecurity/crs
|
||||
`,
|
||||
Args: cobra.MinimumNArgs(1),
|
||||
Aliases: []string{"appsec-rule"},
|
||||
DisableAutoGenTag: true,
|
||||
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
|
||||
if _, err := require.Hub(csConfig, require.RemoteHub(csConfig)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
},
|
||||
PersistentPostRun: func(cmd *cobra.Command, args []string) {
|
||||
if cmd.Name() == "inspect" || cmd.Name() == "list" {
|
||||
return
|
||||
}
|
||||
log.Infof(ReloadMessage())
|
||||
},
|
||||
}
|
||||
|
||||
cmdAppsecRules.AddCommand(NewCmdAppsecRulesInstall())
|
||||
cmdAppsecRules.AddCommand(NewCmdAppsecRulesRemove())
|
||||
cmdAppsecRules.AddCommand(NewCmdAppsecRulesUpgrade())
|
||||
cmdAppsecRules.AddCommand(NewCmdAppsecRulesInspect())
|
||||
cmdAppsecRules.AddCommand(NewCmdAppsecRulesList())
|
||||
|
||||
return cmdAppsecRules
|
||||
}
|
||||
|
||||
func NewCmdAppsecRulesInstall() *cobra.Command {
|
||||
cmdAppsecRulesInstall := &cobra.Command{
|
||||
Use: "install <appsec-rule>...",
|
||||
Short: "Install given appsec rule(s)",
|
||||
Long: `Fetch and install one or more appsec rules from the hub`,
|
||||
Example: `cscli appsec-rules install crowdsecurity/crs`,
|
||||
Args: cobra.MinimumNArgs(1),
|
||||
DisableAutoGenTag: true,
|
||||
ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
|
||||
return compAllItems(cwhub.APPSEC_RULES, args, toComplete)
|
||||
},
|
||||
RunE: hubItemTypes[cwhub.APPSEC_RULES].Install,
|
||||
}
|
||||
|
||||
flags := cmdAppsecRulesInstall.Flags()
|
||||
flags.BoolP("download-only", "d", false, "Only download packages, don't enable")
|
||||
flags.Bool("force", false, "Force install: overwrite tainted and outdated files")
|
||||
flags.Bool("ignore", false, "Ignore errors when installing multiple appsec rules")
|
||||
|
||||
return cmdAppsecRulesInstall
|
||||
}
|
||||
|
||||
func NewCmdAppsecRulesRemove() *cobra.Command {
|
||||
cmdAppsecRulesRemove := &cobra.Command{
|
||||
Use: "remove <appsec-rule>...",
|
||||
Short: "Remove given appsec rule(s)",
|
||||
Long: `remove one or more appsec rules`,
|
||||
Example: `cscli appsec-rules remove crowdsecurity/crs`,
|
||||
Aliases: []string{"delete"},
|
||||
DisableAutoGenTag: true,
|
||||
ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
|
||||
return compInstalledItems(cwhub.APPSEC_RULES, args, toComplete)
|
||||
},
|
||||
RunE: hubItemTypes[cwhub.APPSEC_RULES].Remove,
|
||||
}
|
||||
|
||||
flags := cmdAppsecRulesRemove.Flags()
|
||||
flags.Bool("purge", false, "Delete source file too")
|
||||
flags.Bool("force", false, "Force remove: remove tainted and outdated files")
|
||||
flags.Bool("all", false, "Remove all the appsec rules")
|
||||
|
||||
return cmdAppsecRulesRemove
|
||||
}
|
||||
|
||||
func NewCmdAppsecRulesUpgrade() *cobra.Command {
|
||||
cmdAppsecRulesUpgrade := &cobra.Command{
|
||||
Use: "upgrade <appsec-rule>...",
|
||||
Short: "Upgrade given appsec rule(s)",
|
||||
Long: `Fetch and upgrade one or more appsec rules from the hub`,
|
||||
Example: `cscli appsec-rules upgrade crowdsecurity/crs`,
|
||||
DisableAutoGenTag: true,
|
||||
ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
|
||||
return compInstalledItems(cwhub.APPSEC_RULES, args, toComplete)
|
||||
},
|
||||
RunE: hubItemTypes[cwhub.APPSEC_RULES].Upgrade,
|
||||
}
|
||||
|
||||
flags := cmdAppsecRulesUpgrade.Flags()
|
||||
flags.BoolP("all", "a", false, "Upgrade all the appsec rules")
|
||||
flags.Bool("force", false, "Force upgrade: overwrite tainted and outdated files")
|
||||
|
||||
return cmdAppsecRulesUpgrade
|
||||
}
|
||||
|
||||
func AppsecRulesInspectRunner(itemType hubItemType) func(cmd *cobra.Command, args []string) error {
|
||||
return func(cmd *cobra.Command, args []string) error {
|
||||
f := hubItemTypes[cwhub.APPSEC_RULES].Inspect
|
||||
if err := f(cmd, args); err != nil {
|
||||
return err
|
||||
}
|
||||
if csConfig.Cscli.Output == "human" {
|
||||
hub, _ := require.Hub(csConfig, nil)
|
||||
for _, name := range args {
|
||||
hubItem := hub.GetItem(itemType.name, name)
|
||||
appsecRule := appsec.AppsecCollectionConfig{}
|
||||
yamlContent, err := os.ReadFile(hubItem.State.LocalPath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to read file %s : %s", hubItem.State.LocalPath, err)
|
||||
}
|
||||
if err := yaml.Unmarshal(yamlContent, &appsecRule); err != nil {
|
||||
return fmt.Errorf("unable to unmarshal yaml file %s : %s", hubItem.State.LocalPath, err)
|
||||
}
|
||||
|
||||
for _, ruleType := range appsec_rule.SupportedTypes() {
|
||||
fmt.Printf("\n%s format:\n", cases.Title(language.Und, cases.NoLower).String(ruleType))
|
||||
for _, rule := range appsecRule.Rules {
|
||||
convertedRule, _, err := rule.Convert(ruleType, appsecRule.Name)
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to convert rule %s : %s", rule.Name, err)
|
||||
}
|
||||
fmt.Println(convertedRule)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func NewCmdAppsecRulesInspect() *cobra.Command {
|
||||
cmdAppsecRulesInspect := &cobra.Command{
|
||||
Use: "inspect <appsec-rule>",
|
||||
Short: "Inspect a appsec rule",
|
||||
Long: `Inspect a appsec rule`,
|
||||
Example: `cscli appsec-rules inspect crowdsecurity/crs`,
|
||||
Args: cobra.MinimumNArgs(1),
|
||||
DisableAutoGenTag: true,
|
||||
ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
|
||||
return compInstalledItems(cwhub.APPSEC_RULES, args, toComplete)
|
||||
},
|
||||
RunE: AppsecRulesInspectRunner(hubItemTypes[cwhub.APPSEC_RULES]),
|
||||
}
|
||||
|
||||
flags := cmdAppsecRulesInspect.Flags()
|
||||
flags.StringP("url", "u", "", "Prometheus url")
|
||||
flags.Bool("no-metrics", false, "Don't show metrics (when cscli.output=human)")
|
||||
|
||||
return cmdAppsecRulesInspect
|
||||
}
|
||||
|
||||
func NewCmdAppsecRulesList() *cobra.Command {
|
||||
cmdAppsecRulesList := &cobra.Command{
|
||||
Use: "list [appsec-rule]...",
|
||||
Short: "List appsec rules",
|
||||
Long: `List of installed/available/specified appsec rules`,
|
||||
Example: `cscli appsec-rules list
|
||||
cscli appsec-rules list -a
|
||||
cscli appsec-rules list crowdsecurity/crs`,
|
||||
DisableAutoGenTag: true,
|
||||
RunE: hubItemTypes[cwhub.APPSEC_RULES].List,
|
||||
}
|
||||
|
||||
flags := cmdAppsecRulesList.Flags()
|
||||
flags.BoolP("all", "a", false, "List disabled items as well")
|
||||
|
||||
return cmdAppsecRulesList
|
||||
}
|
105
cmd/crowdsec-cli/hubappsec.go
Normal file
105
cmd/crowdsec-cli/hubappsec.go
Normal file
|
@ -0,0 +1,105 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"golang.org/x/text/cases"
|
||||
"golang.org/x/text/language"
|
||||
"gopkg.in/yaml.v3"
|
||||
|
||||
"github.com/crowdsecurity/crowdsec/pkg/appsec"
|
||||
"github.com/crowdsecurity/crowdsec/pkg/appsec/appsec_rule"
|
||||
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
||||
)
|
||||
|
||||
func NewAppsecConfigCLI() *itemCLI {
|
||||
return &itemCLI{
|
||||
name: cwhub.APPSEC_CONFIGS,
|
||||
singular: "appsec-config",
|
||||
oneOrMore: "appsec-config(s)",
|
||||
help: cliHelp{
|
||||
example: `cscli appsec-configs list -a
|
||||
cscli appsec-configs install crowdsecurity/vpatch
|
||||
cscli appsec-configs inspect crowdsecurity/vpatch
|
||||
cscli appsec-configs upgrade crowdsecurity/vpatch
|
||||
cscli appsec-configs remove crowdsecurity/vpatch
|
||||
`,
|
||||
},
|
||||
installHelp: cliHelp{
|
||||
example: `cscli appsec-configs install crowdsecurity/vpatch`,
|
||||
},
|
||||
removeHelp: cliHelp{
|
||||
example: `cscli appsec-configs remove crowdsecurity/vpatch`,
|
||||
},
|
||||
upgradeHelp: cliHelp{
|
||||
example: `cscli appsec-configs upgrade crowdsecurity/vpatch`,
|
||||
},
|
||||
inspectHelp: cliHelp{
|
||||
example: `cscli appsec-configs inspect crowdsecurity/vpatch`,
|
||||
},
|
||||
listHelp: cliHelp{
|
||||
example: `cscli appsec-configs list
|
||||
cscli appsec-configs list -a
|
||||
cscli appsec-configs list crowdsecurity/vpatch`,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func NewAppsecRuleCLI() *itemCLI {
|
||||
inspectDetail := func(item *cwhub.Item) error {
|
||||
appsecRule := appsec.AppsecCollectionConfig{}
|
||||
yamlContent, err := os.ReadFile(item.State.LocalPath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to read file %s : %s", item.State.LocalPath, err)
|
||||
}
|
||||
if err := yaml.Unmarshal(yamlContent, &appsecRule); err != nil {
|
||||
return fmt.Errorf("unable to unmarshal yaml file %s : %s", item.State.LocalPath, err)
|
||||
}
|
||||
|
||||
for _, ruleType := range appsec_rule.SupportedTypes() {
|
||||
fmt.Printf("\n%s format:\n", cases.Title(language.Und, cases.NoLower).String(ruleType))
|
||||
for _, rule := range appsecRule.Rules {
|
||||
convertedRule, _, err := rule.Convert(ruleType, appsecRule.Name)
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to convert rule %s : %s", rule.Name, err)
|
||||
}
|
||||
fmt.Println(convertedRule)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
return &itemCLI{
|
||||
name: "appsec-rules",
|
||||
singular: "appsec-rule",
|
||||
oneOrMore: "appsec-rule(s)",
|
||||
help: cliHelp{
|
||||
example: `cscli appsec-rules list -a
|
||||
cscli appsec-rules install crowdsecurity/crs
|
||||
cscli appsec-rules inspect crowdsecurity/crs
|
||||
cscli appsec-rules upgrade crowdsecurity/crs
|
||||
cscli appsec-rules remove crowdsecurity/crs
|
||||
`,
|
||||
},
|
||||
installHelp: cliHelp{
|
||||
example: `cscli appsec-rules install crowdsecurity/crs`,
|
||||
},
|
||||
removeHelp: cliHelp{
|
||||
example: `cscli appsec-rules remove crowdsecurity/crs`,
|
||||
},
|
||||
upgradeHelp: cliHelp{
|
||||
example: `cscli appsec-rules upgrade crowdsecurity/crs`,
|
||||
},
|
||||
inspectHelp: cliHelp{
|
||||
example: `cscli appsec-rules inspect crowdsecurity/crs`,
|
||||
},
|
||||
inspectDetail: inspectDetail,
|
||||
listHelp: cliHelp{
|
||||
example: `cscli appsec-rules list
|
||||
cscli appsec-rules list -a
|
||||
cscli appsec-rules list crowdsecurity/crs`,
|
||||
},
|
||||
}
|
||||
}
|
40
cmd/crowdsec-cli/hubcollection.go
Normal file
40
cmd/crowdsec-cli/hubcollection.go
Normal file
|
@ -0,0 +1,40 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
||||
)
|
||||
|
||||
func NewCollectionCLI() *itemCLI {
|
||||
return &itemCLI{
|
||||
name: cwhub.COLLECTIONS,
|
||||
singular: "collection",
|
||||
oneOrMore: "collection(s)",
|
||||
help: cliHelp{
|
||||
example: `cscli collections list -a
|
||||
cscli collections install crowdsecurity/http-cve crowdsecurity/iptables
|
||||
cscli collections inspect crowdsecurity/http-cve crowdsecurity/iptables
|
||||
cscli collections upgrade crowdsecurity/http-cve crowdsecurity/iptables
|
||||
cscli collections remove crowdsecurity/http-cve crowdsecurity/iptables
|
||||
`,
|
||||
},
|
||||
installHelp: cliHelp{
|
||||
example: `cscli collections install crowdsecurity/http-cve crowdsecurity/iptables`,
|
||||
},
|
||||
removeHelp: cliHelp{
|
||||
example: `cscli collections remove crowdsecurity/http-cve crowdsecurity/iptables`,
|
||||
},
|
||||
upgradeHelp: cliHelp{
|
||||
example: `cscli collections upgrade crowdsecurity/http-cve crowdsecurity/iptables`,
|
||||
},
|
||||
inspectHelp: cliHelp{
|
||||
example: `cscli collections inspect crowdsecurity/http-cve crowdsecurity/iptables`,
|
||||
},
|
||||
listHelp: cliHelp{
|
||||
example: `cscli collections list
|
||||
cscli collections list -a
|
||||
cscli collections list crowdsecurity/http-cve crowdsecurity/iptables
|
||||
|
||||
List only enabled collections unless "-a" or names are specified.`,
|
||||
},
|
||||
}
|
||||
}
|
40
cmd/crowdsec-cli/hubparser.go
Normal file
40
cmd/crowdsec-cli/hubparser.go
Normal file
|
@ -0,0 +1,40 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
||||
)
|
||||
|
||||
func NewParserCLI() *itemCLI {
|
||||
return &itemCLI{
|
||||
name: cwhub.PARSERS,
|
||||
singular: "parser",
|
||||
oneOrMore: "parser(s)",
|
||||
help: cliHelp{
|
||||
example: `cscli parsers list -a
|
||||
cscli parsers install crowdsecurity/caddy-logs crowdsecurity/sshd-logs
|
||||
cscli parsers inspect crowdsecurity/caddy-logs crowdsecurity/sshd-logs
|
||||
cscli parsers upgrade crowdsecurity/caddy-logs crowdsecurity/sshd-logs
|
||||
cscli parsers remove crowdsecurity/caddy-logs crowdsecurity/sshd-logs
|
||||
`,
|
||||
},
|
||||
installHelp: cliHelp{
|
||||
example: `cscli parsers install crowdsecurity/caddy-logs crowdsecurity/sshd-logs`,
|
||||
},
|
||||
removeHelp: cliHelp{
|
||||
example: `cscli parsers remove crowdsecurity/caddy-logs crowdsecurity/sshd-logs`,
|
||||
},
|
||||
upgradeHelp: cliHelp{
|
||||
example: `cscli parsers upgrade crowdsecurity/caddy-logs crowdsecurity/sshd-logs`,
|
||||
},
|
||||
inspectHelp: cliHelp{
|
||||
example: `cscli parsers inspect crowdsecurity/httpd-logs crowdsecurity/sshd-logs`,
|
||||
},
|
||||
listHelp: cliHelp{
|
||||
example: `cscli parsers list
|
||||
cscli parsers list -a
|
||||
cscli parsers list crowdsecurity/caddy-logs crowdsecurity/sshd-logs
|
||||
|
||||
List only enabled parsers unless "-a" or names are specified.`,
|
||||
},
|
||||
}
|
||||
}
|
40
cmd/crowdsec-cli/hubpostoverflow.go
Normal file
40
cmd/crowdsec-cli/hubpostoverflow.go
Normal file
|
@ -0,0 +1,40 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
||||
)
|
||||
|
||||
func NewPostOverflowCLI() *itemCLI {
|
||||
return &itemCLI{
|
||||
name: cwhub.POSTOVERFLOWS,
|
||||
singular: "postoverflow",
|
||||
oneOrMore: "postoverflow(s)",
|
||||
help: cliHelp{
|
||||
example: `cscli postoverflows list -a
|
||||
cscli postoverflows install crowdsecurity/cdn-whitelist crowdsecurity/rdns
|
||||
cscli postoverflows inspect crowdsecurity/cdn-whitelist crowdsecurity/rdns
|
||||
cscli postoverflows upgrade crowdsecurity/cdn-whitelist crowdsecurity/rdns
|
||||
cscli postoverflows remove crowdsecurity/cdn-whitelist crowdsecurity/rdns
|
||||
`,
|
||||
},
|
||||
installHelp: cliHelp{
|
||||
example: `cscli postoverflows install crowdsecurity/cdn-whitelist crowdsecurity/rdns`,
|
||||
},
|
||||
removeHelp: cliHelp{
|
||||
example: `cscli postoverflows remove crowdsecurity/cdn-whitelist crowdsecurity/rdns`,
|
||||
},
|
||||
upgradeHelp: cliHelp{
|
||||
example: `cscli postoverflows upgrade crowdsecurity/cdn-whitelist crowdsecurity/rdns`,
|
||||
},
|
||||
inspectHelp: cliHelp{
|
||||
example: `cscli postoverflows inspect crowdsecurity/cdn-whitelist crowdsecurity/rdns`,
|
||||
},
|
||||
listHelp: cliHelp{
|
||||
example: `cscli postoverflows list
|
||||
cscli postoverflows list -a
|
||||
cscli postoverflows list crowdsecurity/cdn-whitelist crowdsecurity/rdns
|
||||
|
||||
List only enabled postoverflows unless "-a" or names are specified.`,
|
||||
},
|
||||
}
|
||||
}
|
40
cmd/crowdsec-cli/hubscenario.go
Normal file
40
cmd/crowdsec-cli/hubscenario.go
Normal file
|
@ -0,0 +1,40 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
||||
)
|
||||
|
||||
func NewScenarioCLI() *itemCLI {
|
||||
return &itemCLI{
|
||||
name: cwhub.SCENARIOS,
|
||||
singular: "scenario",
|
||||
oneOrMore: "scenario(s)",
|
||||
help: cliHelp{
|
||||
example: `cscli scenarios list -a
|
||||
cscli scenarios install crowdsecurity/ssh-bf crowdsecurity/http-probing
|
||||
cscli scenarios inspect crowdsecurity/ssh-bf crowdsecurity/http-probing
|
||||
cscli scenarios upgrade crowdsecurity/ssh-bf crowdsecurity/http-probing
|
||||
cscli scenarios remove crowdsecurity/ssh-bf crowdsecurity/http-probing
|
||||
`,
|
||||
},
|
||||
installHelp: cliHelp{
|
||||
example: `cscli scenarios install crowdsecurity/ssh-bf crowdsecurity/http-probing`,
|
||||
},
|
||||
removeHelp: cliHelp{
|
||||
example: `cscli scenarios remove crowdsecurity/ssh-bf crowdsecurity/http-probing`,
|
||||
},
|
||||
upgradeHelp: cliHelp{
|
||||
example: `cscli scenarios upgrade crowdsecurity/ssh-bf crowdsecurity/http-probing`,
|
||||
},
|
||||
inspectHelp: cliHelp{
|
||||
example: `cscli scenarios inspect crowdsecurity/ssh-bf crowdsecurity/http-probing`,
|
||||
},
|
||||
listHelp: cliHelp{
|
||||
example: `cscli scenarios list
|
||||
cscli scenarios list -a
|
||||
cscli scenarios list crowdsecurity/ssh-bf crowdsecurity/http-probing
|
||||
|
||||
List only enabled scenarios unless "-a" or names are specified.`,
|
||||
},
|
||||
}
|
||||
}
|
|
@ -13,7 +13,7 @@ import (
|
|||
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
||||
)
|
||||
|
||||
type cmdHelp struct {
|
||||
type cliHelp struct {
|
||||
// Example is required, the others have a default value
|
||||
// generated from the item type
|
||||
use string
|
||||
|
@ -22,212 +22,20 @@ type cmdHelp struct {
|
|||
example string
|
||||
}
|
||||
|
||||
type hubItemType struct {
|
||||
name string // plural, as used in the hub index
|
||||
singular string
|
||||
oneOrMore string // parenthetical pluralizaion: "parser(s)"
|
||||
help cmdHelp
|
||||
installHelp cmdHelp
|
||||
removeHelp cmdHelp
|
||||
upgradeHelp cmdHelp
|
||||
inspectHelp cmdHelp
|
||||
listHelp cmdHelp
|
||||
type itemCLI struct {
|
||||
name string // plural, as used in the hub index
|
||||
singular string
|
||||
oneOrMore string // parenthetical pluralizaion: "parser(s)"
|
||||
help cliHelp
|
||||
installHelp cliHelp
|
||||
removeHelp cliHelp
|
||||
upgradeHelp cliHelp
|
||||
inspectHelp cliHelp
|
||||
inspectDetail func(item *cwhub.Item) error
|
||||
listHelp cliHelp
|
||||
}
|
||||
|
||||
var hubItemTypes = map[string]hubItemType{
|
||||
"parsers": {
|
||||
name: cwhub.PARSERS,
|
||||
singular: "parser",
|
||||
oneOrMore: "parser(s)",
|
||||
help: cmdHelp{
|
||||
example: `cscli parsers list -a
|
||||
cscli parsers install crowdsecurity/caddy-logs crowdsecurity/sshd-logs
|
||||
cscli parsers inspect crowdsecurity/caddy-logs crowdsecurity/sshd-logs
|
||||
cscli parsers upgrade crowdsecurity/caddy-logs crowdsecurity/sshd-logs
|
||||
cscli parsers remove crowdsecurity/caddy-logs crowdsecurity/sshd-logs
|
||||
`,
|
||||
},
|
||||
installHelp: cmdHelp{
|
||||
example: `cscli parsers install crowdsecurity/caddy-logs crowdsecurity/sshd-logs`,
|
||||
},
|
||||
removeHelp: cmdHelp{
|
||||
example: `cscli parsers remove crowdsecurity/caddy-logs crowdsecurity/sshd-logs`,
|
||||
},
|
||||
upgradeHelp: cmdHelp{
|
||||
example: `cscli parsers upgrade crowdsecurity/caddy-logs crowdsecurity/sshd-logs`,
|
||||
},
|
||||
inspectHelp: cmdHelp{
|
||||
example: `cscli parsers inspect crowdsecurity/httpd-logs crowdsecurity/sshd-logs`,
|
||||
},
|
||||
listHelp: cmdHelp{
|
||||
example: `cscli parsers list
|
||||
cscli parsers list -a
|
||||
cscli parsers list crowdsecurity/caddy-logs crowdsecurity/sshd-logs
|
||||
|
||||
List only enabled parsers unless "-a" or names are specified.`,
|
||||
},
|
||||
},
|
||||
"postoverflows": {
|
||||
name: cwhub.POSTOVERFLOWS,
|
||||
singular: "postoverflow",
|
||||
oneOrMore: "postoverflow(s)",
|
||||
help: cmdHelp{
|
||||
example: `cscli postoverflows list -a
|
||||
cscli postoverflows install crowdsecurity/cdn-whitelist crowdsecurity/rdns
|
||||
cscli postoverflows inspect crowdsecurity/cdn-whitelist crowdsecurity/rdns
|
||||
cscli postoverflows upgrade crowdsecurity/cdn-whitelist crowdsecurity/rdns
|
||||
cscli postoverflows remove crowdsecurity/cdn-whitelist crowdsecurity/rdns
|
||||
`,
|
||||
},
|
||||
installHelp: cmdHelp{
|
||||
example: `cscli postoverflows install crowdsecurity/cdn-whitelist crowdsecurity/rdns`,
|
||||
},
|
||||
removeHelp: cmdHelp{
|
||||
example: `cscli postoverflows remove crowdsecurity/cdn-whitelist crowdsecurity/rdns`,
|
||||
},
|
||||
upgradeHelp: cmdHelp{
|
||||
example: `cscli postoverflows upgrade crowdsecurity/cdn-whitelist crowdsecurity/rdns`,
|
||||
},
|
||||
inspectHelp: cmdHelp{
|
||||
example: `cscli postoverflows inspect crowdsecurity/cdn-whitelist crowdsecurity/rdns`,
|
||||
},
|
||||
listHelp: cmdHelp{
|
||||
example: `cscli postoverflows list
|
||||
cscli postoverflows list -a
|
||||
cscli postoverflows list crowdsecurity/cdn-whitelist crowdsecurity/rdns
|
||||
|
||||
List only enabled postoverflows unless "-a" or names are specified.`,
|
||||
},
|
||||
},
|
||||
"scenarios": {
|
||||
name: cwhub.SCENARIOS,
|
||||
singular: "scenario",
|
||||
oneOrMore: "scenario(s)",
|
||||
help: cmdHelp{
|
||||
example: `cscli scenarios list -a
|
||||
cscli scenarios install crowdsecurity/ssh-bf crowdsecurity/http-probing
|
||||
cscli scenarios inspect crowdsecurity/ssh-bf crowdsecurity/http-probing
|
||||
cscli scenarios upgrade crowdsecurity/ssh-bf crowdsecurity/http-probing
|
||||
cscli scenarios remove crowdsecurity/ssh-bf crowdsecurity/http-probing
|
||||
`,
|
||||
},
|
||||
installHelp: cmdHelp{
|
||||
example: `cscli scenarios install crowdsecurity/ssh-bf crowdsecurity/http-probing`,
|
||||
},
|
||||
removeHelp: cmdHelp{
|
||||
example: `cscli scenarios remove crowdsecurity/ssh-bf crowdsecurity/http-probing`,
|
||||
},
|
||||
upgradeHelp: cmdHelp{
|
||||
example: `cscli scenarios upgrade crowdsecurity/ssh-bf crowdsecurity/http-probing`,
|
||||
},
|
||||
inspectHelp: cmdHelp{
|
||||
example: `cscli scenarios inspect crowdsecurity/ssh-bf crowdsecurity/http-probing`,
|
||||
},
|
||||
listHelp: cmdHelp{
|
||||
example: `cscli scenarios list
|
||||
cscli scenarios list -a
|
||||
cscli scenarios list crowdsecurity/ssh-bf crowdsecurity/http-probing
|
||||
|
||||
List only enabled scenarios unless "-a" or names are specified.`,
|
||||
},
|
||||
},
|
||||
"appsec-rules": {
|
||||
name: "appsec-rules",
|
||||
singular: "appsec-rule",
|
||||
oneOrMore: "appsec-rule(s)",
|
||||
help: cmdHelp{
|
||||
example: `cscli appsec-rules list -a
|
||||
cscli appsec-rules install crowdsecurity/crs
|
||||
cscli appsec-rules inspect crowdsecurity/crs
|
||||
cscli appsec-rules upgrade crowdsecurity/crs
|
||||
cscli appsec-rules remove crowdsecurity/crs
|
||||
`,
|
||||
},
|
||||
installHelp: cmdHelp{
|
||||
example: `cscli appsec-rules install crowdsecurity/crs`,
|
||||
},
|
||||
removeHelp: cmdHelp{
|
||||
example: `cscli appsec-rules remove crowdsecurity/crs`,
|
||||
},
|
||||
upgradeHelp: cmdHelp{
|
||||
example: `cscli appsec-rules upgrade crowdsecurity/crs`,
|
||||
},
|
||||
inspectHelp: cmdHelp{
|
||||
example: `cscli appsec-rules inspect crowdsecurity/crs`,
|
||||
},
|
||||
listHelp: cmdHelp{
|
||||
example: `cscli appsec-rules list
|
||||
cscli appsec-rules list -a
|
||||
cscli appsec-rules list crowdsecurity/crs`,
|
||||
},
|
||||
},
|
||||
"appsec-configs": {
|
||||
name: "appsec-configs",
|
||||
singular: "appsec-config",
|
||||
oneOrMore: "appsec-config(s)",
|
||||
help: cmdHelp{
|
||||
example: `cscli appsec-configs list -a
|
||||
cscli appsec-configs install crowdsecurity/vpatch
|
||||
cscli appsec-configs inspect crowdsecurity/vpatch
|
||||
cscli appsec-configs upgrade crowdsecurity/vpatch
|
||||
cscli appsec-configs remove crowdsecurity/vpatch
|
||||
`,
|
||||
},
|
||||
installHelp: cmdHelp{
|
||||
example: `cscli appsec-configs install crowdsecurity/vpatch`,
|
||||
},
|
||||
removeHelp: cmdHelp{
|
||||
example: `cscli appsec-configs remove crowdsecurity/vpatch`,
|
||||
},
|
||||
upgradeHelp: cmdHelp{
|
||||
example: `cscli appsec-configs upgrade crowdsecurity/vpatch`,
|
||||
},
|
||||
inspectHelp: cmdHelp{
|
||||
example: `cscli appsec-configs inspect crowdsecurity/vpatch`,
|
||||
},
|
||||
listHelp: cmdHelp{
|
||||
example: `cscli appsec-configs list
|
||||
cscli appsec-configs list -a
|
||||
cscli appsec-configs list crowdsecurity/vpatch`,
|
||||
},
|
||||
},
|
||||
"collections": {
|
||||
name: cwhub.COLLECTIONS,
|
||||
singular: "collection",
|
||||
oneOrMore: "collection(s)",
|
||||
help: cmdHelp{
|
||||
example: `cscli collections list -a
|
||||
cscli collections install crowdsecurity/http-cve crowdsecurity/iptables
|
||||
cscli collections inspect crowdsecurity/http-cve crowdsecurity/iptables
|
||||
cscli collections upgrade crowdsecurity/http-cve crowdsecurity/iptables
|
||||
cscli collections remove crowdsecurity/http-cve crowdsecurity/iptables
|
||||
`,
|
||||
},
|
||||
installHelp: cmdHelp{
|
||||
example: `cscli collections install crowdsecurity/http-cve crowdsecurity/iptables`,
|
||||
},
|
||||
removeHelp: cmdHelp{
|
||||
example: `cscli collections remove crowdsecurity/http-cve crowdsecurity/iptables`,
|
||||
},
|
||||
upgradeHelp: cmdHelp{
|
||||
example: `cscli collections upgrade crowdsecurity/http-cve crowdsecurity/iptables`,
|
||||
},
|
||||
inspectHelp: cmdHelp{
|
||||
example: `cscli collections inspect crowdsecurity/http-cve crowdsecurity/iptables`,
|
||||
},
|
||||
listHelp: cmdHelp{
|
||||
example: `cscli collections list
|
||||
cscli collections list -a
|
||||
cscli collections list crowdsecurity/http-cve crowdsecurity/iptables
|
||||
|
||||
List only enabled collections unless "-a" or names are specified.`,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
func NewItemsCmd(typeName string) *cobra.Command {
|
||||
it := hubItemTypes[typeName]
|
||||
|
||||
func (it itemCLI) NewCommand() *cobra.Command {
|
||||
cmd := &cobra.Command{
|
||||
Use: coalesce.String(it.help.use, fmt.Sprintf("%s <action> [item]...", it.name)),
|
||||
Short: coalesce.String(it.help.short, fmt.Sprintf("Manage hub %s", it.name)),
|
||||
|
@ -247,7 +55,7 @@ func NewItemsCmd(typeName string) *cobra.Command {
|
|||
return cmd
|
||||
}
|
||||
|
||||
func (it hubItemType) Install(cmd *cobra.Command, args []string) error {
|
||||
func (it itemCLI) Install(cmd *cobra.Command, args []string) error {
|
||||
flags := cmd.Flags()
|
||||
|
||||
downloadOnly, err := flags.GetBool("download-only")
|
||||
|
@ -295,7 +103,7 @@ func (it hubItemType) Install(cmd *cobra.Command, args []string) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (it hubItemType) NewInstallCmd() *cobra.Command {
|
||||
func (it itemCLI) NewInstallCmd() *cobra.Command {
|
||||
cmd := &cobra.Command{
|
||||
Use: coalesce.String(it.installHelp.use, "install [item]..."),
|
||||
Short: coalesce.String(it.installHelp.short, fmt.Sprintf("Install given %s", it.oneOrMore)),
|
||||
|
@ -330,7 +138,7 @@ func istalledParentNames(item *cwhub.Item) []string {
|
|||
return ret
|
||||
}
|
||||
|
||||
func (it hubItemType) Remove(cmd *cobra.Command, args []string) error {
|
||||
func (it itemCLI) Remove(cmd *cobra.Command, args []string) error {
|
||||
flags := cmd.Flags()
|
||||
|
||||
purge, err := flags.GetBool("purge")
|
||||
|
@ -424,7 +232,7 @@ func (it hubItemType) Remove(cmd *cobra.Command, args []string) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (it hubItemType) NewRemoveCmd() *cobra.Command {
|
||||
func (it itemCLI) NewRemoveCmd() *cobra.Command {
|
||||
cmd := &cobra.Command{
|
||||
Use: coalesce.String(it.removeHelp.use, "remove [item]..."),
|
||||
Short: coalesce.String(it.removeHelp.short, fmt.Sprintf("Remove given %s", it.oneOrMore)),
|
||||
|
@ -446,7 +254,7 @@ func (it hubItemType) NewRemoveCmd() *cobra.Command {
|
|||
return cmd
|
||||
}
|
||||
|
||||
func (it hubItemType) Upgrade(cmd *cobra.Command, args []string) error {
|
||||
func (it itemCLI) Upgrade(cmd *cobra.Command, args []string) error {
|
||||
flags := cmd.Flags()
|
||||
|
||||
force, err := flags.GetBool("force")
|
||||
|
@ -520,7 +328,7 @@ func (it hubItemType) Upgrade(cmd *cobra.Command, args []string) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (it hubItemType) NewUpgradeCmd() *cobra.Command {
|
||||
func (it itemCLI) NewUpgradeCmd() *cobra.Command {
|
||||
cmd := &cobra.Command{
|
||||
Use: coalesce.String(it.upgradeHelp.use, "upgrade [item]..."),
|
||||
Short: coalesce.String(it.upgradeHelp.short, fmt.Sprintf("Upgrade given %s", it.oneOrMore)),
|
||||
|
@ -540,7 +348,7 @@ func (it hubItemType) NewUpgradeCmd() *cobra.Command {
|
|||
return cmd
|
||||
}
|
||||
|
||||
func (it hubItemType) Inspect(cmd *cobra.Command, args []string) error {
|
||||
func (it itemCLI) Inspect(cmd *cobra.Command, args []string) error {
|
||||
flags := cmd.Flags()
|
||||
|
||||
url, err := flags.GetString("url")
|
||||
|
@ -570,12 +378,18 @@ func (it hubItemType) Inspect(cmd *cobra.Command, args []string) error {
|
|||
if err = InspectItem(item, !noMetrics); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if it.inspectDetail != nil {
|
||||
if err = it.inspectDetail(item); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (it hubItemType) NewInspectCmd() *cobra.Command {
|
||||
func (it itemCLI) NewInspectCmd() *cobra.Command {
|
||||
cmd := &cobra.Command{
|
||||
Use: coalesce.String(it.inspectHelp.use, "inspect [item]..."),
|
||||
Short: coalesce.String(it.inspectHelp.short, fmt.Sprintf("Inspect given %s", it.oneOrMore)),
|
||||
|
@ -596,7 +410,7 @@ func (it hubItemType) NewInspectCmd() *cobra.Command {
|
|||
return cmd
|
||||
}
|
||||
|
||||
func (it hubItemType) List(cmd *cobra.Command, args []string) error {
|
||||
func (it itemCLI) List(cmd *cobra.Command, args []string) error {
|
||||
flags := cmd.Flags()
|
||||
|
||||
all, err := flags.GetBool("all")
|
||||
|
@ -623,7 +437,7 @@ func (it hubItemType) List(cmd *cobra.Command, args []string) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (it hubItemType) NewListCmd() *cobra.Command {
|
||||
func (it itemCLI) NewListCmd() *cobra.Command {
|
||||
cmd := &cobra.Command{
|
||||
Use: coalesce.String(it.listHelp.use, "list [item... | -a]"),
|
||||
Short: coalesce.String(it.listHelp.short, fmt.Sprintf("List %s", it.oneOrMore)),
|
|
@ -241,12 +241,13 @@ It is meant to allow you to manage bans, parsers/scenarios/etc, api and generall
|
|||
rootCmd.AddCommand(NewHubTestCmd())
|
||||
rootCmd.AddCommand(NewNotificationsCmd())
|
||||
rootCmd.AddCommand(NewSupportCmd())
|
||||
rootCmd.AddCommand(NewAppsecRulesCmd()) // Keep it like this for now, we'll switch later to the generic implementation
|
||||
rootCmd.AddCommand(NewItemsCmd("collections"))
|
||||
rootCmd.AddCommand(NewItemsCmd("parsers"))
|
||||
rootCmd.AddCommand(NewItemsCmd("scenarios"))
|
||||
rootCmd.AddCommand(NewItemsCmd("postoverflows"))
|
||||
rootCmd.AddCommand(NewItemsCmd("appsec-configs"))
|
||||
|
||||
rootCmd.AddCommand(NewCollectionCLI().NewCommand())
|
||||
rootCmd.AddCommand(NewParserCLI().NewCommand())
|
||||
rootCmd.AddCommand(NewScenarioCLI().NewCommand())
|
||||
rootCmd.AddCommand(NewPostOverflowCLI().NewCommand())
|
||||
rootCmd.AddCommand(NewAppsecConfigCLI().NewCommand())
|
||||
rootCmd.AddCommand(NewAppsecRuleCLI().NewCommand())
|
||||
|
||||
if fflag.CscliSetup.IsEnabled() {
|
||||
rootCmd.AddCommand(NewSetupCmd())
|
||||
|
|
Loading…
Reference in a new issue