github.com/hashicorp/vault/sdk@v0.13.0/plugin/backend.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: MPL-2.0 3 4 package plugin 5 6 import ( 7 "context" 8 "sync/atomic" 9 10 log "github.com/hashicorp/go-hclog" 11 "github.com/hashicorp/go-plugin" 12 "github.com/hashicorp/vault/sdk/helper/pluginutil" 13 "github.com/hashicorp/vault/sdk/logical" 14 "github.com/hashicorp/vault/sdk/plugin/pb" 15 "google.golang.org/grpc" 16 ) 17 18 var ( 19 _ plugin.Plugin = (*GRPCBackendPlugin)(nil) 20 _ plugin.GRPCPlugin = (*GRPCBackendPlugin)(nil) 21 ) 22 23 // GRPCBackendPlugin is the plugin.Plugin implementation that only supports GRPC 24 // transport 25 type GRPCBackendPlugin struct { 26 Factory logical.Factory 27 MetadataMode bool 28 Logger log.Logger 29 30 MultiplexingSupport bool 31 32 // Embeding this will disable the netRPC protocol 33 plugin.NetRPCUnsupportedPlugin 34 } 35 36 func (b GRPCBackendPlugin) GRPCServer(broker *plugin.GRPCBroker, s *grpc.Server) error { 37 server := backendGRPCPluginServer{ 38 broker: broker, 39 factory: b.Factory, 40 instances: make(map[string]backendInstance), 41 // We pass the logger down into the backend so go-plugin will 42 // forward logs for us. 43 logger: b.Logger, 44 } 45 46 if b.MultiplexingSupport { 47 // Multiplexing is enabled for this plugin, register the server so we 48 // can tell the client in Vault. 49 pluginutil.RegisterPluginMultiplexingServer(s, pluginutil.PluginMultiplexingServerImpl{ 50 Supported: true, 51 }) 52 server.multiplexingSupport = true 53 } 54 55 pb.RegisterBackendServer(s, &server) 56 logical.RegisterPluginVersionServer(s, &server) 57 return nil 58 } 59 60 func (b *GRPCBackendPlugin) GRPCClient(ctx context.Context, broker *plugin.GRPCBroker, c *grpc.ClientConn) (interface{}, error) { 61 ret := &backendGRPCPluginClient{ 62 client: pb.NewBackendClient(c), 63 versionClient: logical.NewPluginVersionClient(c), 64 broker: broker, 65 cleanupCh: make(chan struct{}), 66 doneCtx: ctx, 67 metadataMode: b.MetadataMode, 68 } 69 70 // Create the value and set the type 71 ret.server = new(atomic.Value) 72 ret.server.Store((*grpc.Server)(nil)) 73 74 return ret, nil 75 }