2017-04-06 19:20:10 +00:00
|
|
|
package dbplugin
|
|
|
|
|
|
|
|
import (
|
2017-04-11 00:12:52 +00:00
|
|
|
"fmt"
|
|
|
|
|
2017-04-06 19:20:10 +00:00
|
|
|
"github.com/hashicorp/go-plugin"
|
|
|
|
"github.com/hashicorp/vault/helper/pluginutil"
|
|
|
|
)
|
|
|
|
|
|
|
|
// NewPluginServer is called from within a plugin and wraps the provided
|
2017-04-11 18:50:34 +00:00
|
|
|
// DatabaseType implementation in a databasePluginRPCServer object and starts a
|
2017-04-06 19:20:10 +00:00
|
|
|
// RPC server.
|
|
|
|
func NewPluginServer(db DatabaseType) {
|
|
|
|
dbPlugin := &DatabasePlugin{
|
|
|
|
impl: db,
|
|
|
|
}
|
|
|
|
|
|
|
|
// pluginMap is the map of plugins we can dispense.
|
|
|
|
var pluginMap = map[string]plugin.Plugin{
|
|
|
|
"database": dbPlugin,
|
|
|
|
}
|
|
|
|
|
2017-04-11 00:12:52 +00:00
|
|
|
err := pluginutil.OptionallyEnableMlock()
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2017-04-06 19:20:10 +00:00
|
|
|
plugin.Serve(&plugin.ServeConfig{
|
|
|
|
HandshakeConfig: handshakeConfig,
|
|
|
|
Plugins: pluginMap,
|
|
|
|
TLSProvider: pluginutil.VaultPluginTLSProvider,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
// ---- RPC server domain ----
|
|
|
|
|
2017-04-11 18:50:34 +00:00
|
|
|
// databasePluginRPCServer implements an RPC version of DatabaseType and is run
|
|
|
|
// inside a plugin. It wraps an underlying implementation of DatabaseType.
|
2017-04-06 19:20:10 +00:00
|
|
|
type databasePluginRPCServer struct {
|
|
|
|
impl DatabaseType
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ds *databasePluginRPCServer) Type(_ struct{}, resp *string) error {
|
|
|
|
*resp = ds.impl.Type()
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2017-04-10 19:24:16 +00:00
|
|
|
func (ds *databasePluginRPCServer) CreateUser(args *CreateUserRequest, resp *CreateUserResponse) error {
|
|
|
|
var err error
|
|
|
|
resp.Username, resp.Password, err = ds.impl.CreateUser(args.Statements, args.UsernamePrefix, args.Expiration)
|
2017-04-06 19:20:10 +00:00
|
|
|
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ds *databasePluginRPCServer) RenewUser(args *RenewUserRequest, _ *struct{}) error {
|
|
|
|
err := ds.impl.RenewUser(args.Statements, args.Username, args.Expiration)
|
|
|
|
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ds *databasePluginRPCServer) RevokeUser(args *RevokeUserRequest, _ *struct{}) error {
|
|
|
|
err := ds.impl.RevokeUser(args.Statements, args.Username)
|
|
|
|
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2017-04-10 22:36:59 +00:00
|
|
|
func (ds *databasePluginRPCServer) Initialize(args *InitializeRequest, _ *struct{}) error {
|
|
|
|
err := ds.impl.Initialize(args.Config, args.VerifyConnection)
|
2017-04-06 19:20:10 +00:00
|
|
|
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ds *databasePluginRPCServer) Close(_ struct{}, _ *struct{}) error {
|
|
|
|
ds.impl.Close()
|
|
|
|
return nil
|
|
|
|
}
|