* bump gopkg.in/yaml.v3 * test: cannot remove local items with cscli * test dangling links * test: cannot install local item with cscli * pkg/cwhub: reorg (move) functions in files * allow hub upgrade with local items * data download: honor Last-Modified header * fatal -> warning when attempting to remove a local item (allows remove --all) * cscli...inspect -o yaml|human: rename remote_path -> path * Correct count of removed items Still no separate counter for the --purge option, but should be clear enough
86 lines
2 KiB
Go
86 lines
2 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/agext/levenshtein"
|
|
"github.com/spf13/cobra"
|
|
"slices"
|
|
|
|
"github.com/crowdsecurity/crowdsec/cmd/crowdsec-cli/require"
|
|
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
|
)
|
|
|
|
// suggestNearestMessage returns a message with the most similar item name, if one is found
|
|
func suggestNearestMessage(hub *cwhub.Hub, itemType string, itemName string) string {
|
|
const maxDistance = 7
|
|
|
|
score := 100
|
|
nearest := ""
|
|
|
|
for _, item := range hub.GetItemMap(itemType) {
|
|
d := levenshtein.Distance(itemName, item.Name, nil)
|
|
if d < score {
|
|
score = d
|
|
nearest = item.Name
|
|
}
|
|
}
|
|
|
|
msg := fmt.Sprintf("can't find '%s' in %s", itemName, itemType)
|
|
|
|
if score < maxDistance {
|
|
msg += fmt.Sprintf(", did you mean '%s'?", nearest)
|
|
}
|
|
|
|
return msg
|
|
}
|
|
|
|
func compAllItems(itemType string, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
|
|
hub, err := require.Hub(csConfig, nil)
|
|
if err != nil {
|
|
return nil, cobra.ShellCompDirectiveDefault
|
|
}
|
|
|
|
comp := make([]string, 0)
|
|
|
|
for _, item := range hub.GetItemMap(itemType) {
|
|
if !slices.Contains(args, item.Name) && strings.Contains(item.Name, toComplete) {
|
|
comp = append(comp, item.Name)
|
|
}
|
|
}
|
|
|
|
cobra.CompDebugln(fmt.Sprintf("%s: %+v", itemType, comp), true)
|
|
|
|
return comp, cobra.ShellCompDirectiveNoFileComp
|
|
}
|
|
|
|
func compInstalledItems(itemType string, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
|
|
hub, err := require.Hub(csConfig, nil)
|
|
if err != nil {
|
|
return nil, cobra.ShellCompDirectiveDefault
|
|
}
|
|
|
|
items, err := hub.GetInstalledItemNames(itemType)
|
|
if err != nil {
|
|
cobra.CompDebugln(fmt.Sprintf("list installed %s err: %s", itemType, err), true)
|
|
return nil, cobra.ShellCompDirectiveDefault
|
|
}
|
|
|
|
comp := make([]string, 0)
|
|
|
|
if toComplete != "" {
|
|
for _, item := range items {
|
|
if strings.Contains(item, toComplete) {
|
|
comp = append(comp, item)
|
|
}
|
|
}
|
|
} else {
|
|
comp = items
|
|
}
|
|
|
|
cobra.CompDebugln(fmt.Sprintf("%s: %+v", itemType, comp), true)
|
|
|
|
return comp, cobra.ShellCompDirectiveNoFileComp
|
|
}
|