mirror of
https://github.com/turbot/steampipe.git
synced 2025-12-20 02:20:57 -05:00
46 lines
1.7 KiB
Go
46 lines
1.7 KiB
Go
package grpc
|
|
|
|
import (
|
|
"strings"
|
|
|
|
sdkplugin "github.com/turbot/steampipe-plugin-sdk/v5/plugin"
|
|
"github.com/turbot/steampipe-plugin-sdk/v5/sperr"
|
|
)
|
|
|
|
// HandleStartFailure is used to handle errors when starting both Steampipe plugins an dthe plugin manage
|
|
// (which is itself a GRPC plugin)
|
|
//
|
|
// When starting a GRPC plugin, a specific handshake sequence is expected on stdout.
|
|
// (This is automatically written in the case of a successfulty startup)
|
|
// If the handshae is missing (because the startup failed or anything else was written to stdout)
|
|
// we get the error "Unrecognized remote plugin message"
|
|
//
|
|
// If the plugin startup fails with an error panic, it constructs a message string
|
|
// starting with the prefix "Plugin startup failed: " , detailing the error.
|
|
//
|
|
// This function checks whether the error returned from startup is "Unrecognized remote plugin message",
|
|
// and if so, it looks for ""Plugin startup failed: " in the plugin message and if found,
|
|
// extracts the underlying error message. This is returnerd as an error
|
|
func HandleStartFailure(err error) error {
|
|
// extract the plugin message
|
|
_, pluginMessage, found := strings.Cut(err.Error(), sdkplugin.UnrecognizedRemotePluginMessage)
|
|
if !found {
|
|
return err
|
|
}
|
|
pluginMessage, _, found = strings.Cut(pluginMessage, sdkplugin.UnrecognizedRemotePluginMessageSuffix)
|
|
if !found {
|
|
return err
|
|
}
|
|
|
|
// if this was an error during startup, reraise an error with the error string
|
|
_, pluginError, found := strings.Cut(pluginMessage, sdkplugin.PluginStartupFailureMessage)
|
|
if !found {
|
|
return err
|
|
}
|
|
|
|
if strings.Contains(pluginMessage, sdkplugin.PluginStartupFailureMessage) {
|
|
return sperr.New("%s", pluginError)
|
|
}
|
|
return err
|
|
}
|