2017-04-06 19:20:10 +00:00
|
|
|
package dbplugin
|
|
|
|
|
|
|
|
import (
|
2017-05-02 21:40:11 +00:00
|
|
|
"crypto/tls"
|
2017-04-11 00:12:52 +00:00
|
|
|
|
2017-04-06 19:20:10 +00:00
|
|
|
"github.com/hashicorp/go-plugin"
|
|
|
|
)
|
|
|
|
|
2017-05-02 09:00:39 +00:00
|
|
|
// Serve is called from within a plugin and wraps the provided
|
2017-04-24 20:59:12 +00:00
|
|
|
// Database implementation in a databasePluginRPCServer object and starts a
|
2017-04-06 19:20:10 +00:00
|
|
|
// RPC server.
|
2017-05-02 21:40:11 +00:00
|
|
|
func Serve(db Database, tlsProvider func() (*tls.Config, error)) {
|
2017-04-06 19:20:10 +00:00
|
|
|
dbPlugin := &DatabasePlugin{
|
|
|
|
impl: db,
|
|
|
|
}
|
|
|
|
|
|
|
|
// pluginMap is the map of plugins we can dispense.
|
|
|
|
var pluginMap = map[string]plugin.Plugin{
|
|
|
|
"database": dbPlugin,
|
|
|
|
}
|
|
|
|
|
|
|
|
plugin.Serve(&plugin.ServeConfig{
|
|
|
|
HandshakeConfig: handshakeConfig,
|
|
|
|
Plugins: pluginMap,
|
2017-05-02 21:40:11 +00:00
|
|
|
TLSProvider: tlsProvider,
|
2017-04-06 19:20:10 +00:00
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
// ---- RPC server domain ----
|
|
|
|
|
2017-04-24 20:59:12 +00:00
|
|
|
// databasePluginRPCServer implements an RPC version of Database and is run
|
|
|
|
// inside a plugin. It wraps an underlying implementation of Database.
|
2017-04-06 19:20:10 +00:00
|
|
|
type databasePluginRPCServer struct {
|
2017-04-24 20:59:12 +00:00
|
|
|
impl Database
|
2017-04-06 19:20:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (ds *databasePluginRPCServer) Type(_ struct{}, resp *string) error {
|
2017-04-12 23:41:06 +00:00
|
|
|
var err error
|
|
|
|
*resp, err = ds.impl.Type()
|
|
|
|
return err
|
2017-04-06 19:20:10 +00:00
|
|
|
}
|
|
|
|
|
2017-04-10 19:24:16 +00:00
|
|
|
func (ds *databasePluginRPCServer) CreateUser(args *CreateUserRequest, resp *CreateUserResponse) error {
|
|
|
|
var err error
|
2017-06-06 13:49:49 +00:00
|
|
|
resp.Username, resp.Password, err = ds.impl.CreateUser(args.Statements, args.UsernameConfig, 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
|
|
|
|
}
|