feat: add support for plugin index (#6674)

Signed-off-by: knqyf263 <knqyf263@gmail.com>
Co-authored-by: DmitriyLewen <91113035+DmitriyLewen@users.noreply.github.com>
This commit is contained in:
Teppei Fukuda
2024-05-14 12:29:20 +04:00
committed by GitHub
parent 150a77313e
commit 26faf8f3f0
27 changed files with 1447 additions and 700 deletions

View File

@@ -1,6 +1,7 @@
package commands
import (
"context"
"encoding/json"
"errors"
"fmt"
@@ -111,20 +112,24 @@ func NewApp() *cobra.Command {
}
func loadPluginCommands() []*cobra.Command {
ctx := context.Background()
manager := plugin.NewManager()
var commands []*cobra.Command
plugins, err := plugin.LoadAll()
plugins, err := manager.LoadAll(ctx)
if err != nil {
log.Debug("No plugins loaded")
log.DebugContext(ctx, "No plugins loaded")
return nil
}
for _, p := range plugins {
p := p
cmd := &cobra.Command{
Use: fmt.Sprintf("%s [flags]", p.Name),
Short: p.Usage,
Short: p.Summary,
Long: p.Description,
GroupID: groupPlugin,
RunE: func(cmd *cobra.Command, args []string) error {
if err = p.Run(cmd.Context(), plugin.RunOptions{Args: args}); err != nil {
if err = p.Run(cmd.Context(), plugin.Options{Args: args}); err != nil {
return xerrors.Errorf("plugin error: %w", err)
}
return nil
@@ -719,14 +724,15 @@ func NewPluginCommand() *cobra.Command {
}
cmd.AddCommand(
&cobra.Command{
Use: "install URL | FILE_PATH",
Use: "install NAME | URL | FILE_PATH",
Aliases: []string{"i"},
Short: "Install a plugin",
SilenceErrors: true,
SilenceUsage: true,
DisableFlagsInUseLine: true,
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
if _, err := plugin.Install(cmd.Context(), args[0], true); err != nil {
if _, err := plugin.Install(cmd.Context(), args[0], plugin.Options{}); err != nil {
return xerrors.Errorf("plugin install error: %w", err)
}
return nil
@@ -735,12 +741,13 @@ func NewPluginCommand() *cobra.Command {
&cobra.Command{
Use: "uninstall PLUGIN_NAME",
Aliases: []string{"u"},
SilenceErrors: true,
DisableFlagsInUseLine: true,
Short: "Uninstall a plugin",
SilenceErrors: true,
SilenceUsage: true,
Args: cobra.ExactArgs(1),
RunE: func(_ *cobra.Command, args []string) error {
if err := plugin.Uninstall(args[0]); err != nil {
RunE: func(cmd *cobra.Command, args []string) error {
if err := plugin.Uninstall(cmd.Context(), args[0]); err != nil {
return xerrors.Errorf("plugin uninstall error: %w", err)
}
return nil
@@ -749,62 +756,86 @@ func NewPluginCommand() *cobra.Command {
&cobra.Command{
Use: "list",
Aliases: []string{"l"},
SilenceErrors: true,
DisableFlagsInUseLine: true,
SilenceErrors: true,
SilenceUsage: true,
Short: "List installed plugin",
Args: cobra.NoArgs,
RunE: func(cmd *cobra.Command, args []string) error {
info, err := plugin.List()
if err != nil {
if err := plugin.List(cmd.Context()); err != nil {
return xerrors.Errorf("plugin list display error: %w", err)
}
if _, err := fmt.Fprint(os.Stdout, info); err != nil {
return xerrors.Errorf("print error: %w", err)
}
return nil
},
},
&cobra.Command{
Use: "info PLUGIN_NAME",
Short: "Show information about the specified plugin",
SilenceErrors: true,
DisableFlagsInUseLine: true,
SilenceErrors: true,
SilenceUsage: true,
Args: cobra.ExactArgs(1),
RunE: func(_ *cobra.Command, args []string) error {
info, err := plugin.Information(args[0])
if err != nil {
if err := plugin.Information(args[0]); err != nil {
return xerrors.Errorf("plugin information display error: %w", err)
}
if _, err := fmt.Fprint(os.Stdout, info); err != nil {
return xerrors.Errorf("print error: %w", err)
}
return nil
},
},
&cobra.Command{
Use: "run URL | FILE_PATH",
Use: "run NAME | URL | FILE_PATH",
Aliases: []string{"r"},
SilenceErrors: true,
DisableFlagsInUseLine: true,
SilenceErrors: true,
SilenceUsage: true,
Short: "Run a plugin on the fly",
Args: cobra.MinimumNArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
return plugin.RunWithURL(cmd.Context(), args[0], plugin.RunOptions{Args: args[1:]})
return plugin.RunWithURL(cmd.Context(), args[0], plugin.Options{Args: args[1:]})
},
},
&cobra.Command{
Use: "update PLUGIN_NAME",
Short: "Update an existing plugin",
SilenceErrors: true,
Use: "update",
Short: "Update the local copy of the plugin index",
DisableFlagsInUseLine: true,
Args: cobra.ExactArgs(1),
RunE: func(_ *cobra.Command, args []string) error {
if err := plugin.Update(args[0]); err != nil {
SilenceErrors: true,
SilenceUsage: true,
Args: cobra.NoArgs,
RunE: func(cmd *cobra.Command, _ []string) error {
if err := plugin.Update(cmd.Context()); err != nil {
return xerrors.Errorf("plugin update error: %w", err)
}
return nil
},
},
&cobra.Command{
Use: "search [KEYWORD]",
DisableFlagsInUseLine: true,
SilenceErrors: true,
SilenceUsage: true,
Short: "List Trivy plugins available on the plugin index and search among them",
Args: cobra.MaximumNArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
var keyword string
if len(args) == 1 {
keyword = args[0]
}
return plugin.Search(cmd.Context(), keyword)
},
},
&cobra.Command{
Use: "upgrade [PLUGIN_NAMES]",
Short: "Upgrade installed plugins to newer versions",
DisableFlagsInUseLine: true,
SilenceErrors: true,
SilenceUsage: true,
RunE: func(cmd *cobra.Command, args []string) error {
if err := plugin.Upgrade(cmd.Context(), args); err != nil {
return xerrors.Errorf("plugin upgrade error: %w", err)
}
return nil
},
},
)
cmd.SetFlagErrorFunc(flagErrorFunc)
return cmd