feat: static load monitoring package

This commit is contained in:
Isma 2023-12-21 10:13:50 +01:00 committed by mortimr
parent 4ee3d26d26
commit 6662686e72
No known key found for this signature in database
GPG key ID: DD423776176B50E8
3 changed files with 50 additions and 93 deletions

View file

@ -3,25 +3,19 @@ package pgeth
import ( import (
"context" "context"
"fmt" "fmt"
"io/ioutil"
"os" "os"
"path/filepath"
"plugin"
"runtime/debug" "runtime/debug"
"github.com/mattn/go-colorable"
"gopkg.in/yaml.v2"
"github.com/ethereum/go-ethereum/internal/ethapi" "github.com/ethereum/go-ethereum/internal/ethapi"
"github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/node" "github.com/ethereum/go-ethereum/node"
"github.com/mattn/go-colorable" "github.com/ethereum/go-ethereum/pgeth/toolkit"
"gopkg.in/yaml.v2" pgeth_monitoring "github.com/ethereum/go-ethereum/plugins/pgeth-monitoring"
) )
type PluginToolkit struct {
Node *node.Node
Backend ethapi.Backend
Logger log.Logger
}
type PluginDetails struct { type PluginDetails struct {
Name string `yaml:"name"` Name string `yaml:"name"`
Config map[string]interface{} `yaml:"config"` Config map[string]interface{} `yaml:"config"`
@ -29,7 +23,7 @@ type PluginDetails struct {
type Plugin struct { type Plugin struct {
Details PluginDetails Details PluginDetails
Start func(*PluginToolkit, map[string]interface{}, context.Context, chan (error)) Start func(*toolkit.PluginToolkit, map[string]interface{}, context.Context, chan (error))
Version func() Version func()
} }
@ -59,30 +53,19 @@ func NewEngine(cfg *PluginEngineConfig) *PluginEngine {
} }
func (p *PluginEngine) Version(ctx context.Context) error { func (p *PluginEngine) Version(ctx context.Context) error {
pluginDirectory := os.Getenv("PGETH_DIRECTORY") var plugins []*Plugin
if len(pluginDirectory) == 0 { // load monitoring plugin
p.logger.Warn("Skipping plugin engine startup: PGETH_DIRECTORY is empty") if pluginMonitoringDirectory := os.Getenv("PGETH_MONITORING_CONFIG"); len(pluginMonitoringDirectory) != 0 {
return nil monitoringDetails, err := p.loadPluginDetails(pluginMonitoringDirectory)
}
p.logger.Info("Starting plugin engine")
files, err := ioutil.ReadDir(pluginDirectory)
if err != nil { if err != nil {
return err return err
} }
plugins = append(plugins, &Plugin{
plugins := []*Plugin{} Details: monitoringDetails,
Version: pgeth_monitoring.Version,
for _, file := range files { Start: pgeth_monitoring.Start,
if file.IsDir() { })
newPlugin, err := p.loadPluginDetailsFromDirectory(filepath.Join(pluginDirectory, file.Name()))
if err != nil {
return err
}
plugins = append(plugins, newPlugin)
}
} }
errChan := make(chan error) errChan := make(chan error)
@ -106,33 +89,22 @@ func (p *PluginEngine) Version(ctx context.Context) error {
} }
func (p *PluginEngine) Start(ctx context.Context) error { func (p *PluginEngine) Start(ctx context.Context) error {
pluginDirectory := os.Getenv("PGETH_DIRECTORY") var plugins []*Plugin
if len(pluginDirectory) == 0 { // load monitoring plugin
p.logger.Warn("Skipping plugin engine startup: PGETH_DIRECTORY is empty") if pluginConfigFile := os.Getenv("PGETH_MONITORING_CONFIG"); len(pluginConfigFile) != 0 {
return nil monitoringDetails, err := p.loadPluginDetails(pluginConfigFile)
}
p.logger.Info("Starting plugin engine")
files, err := ioutil.ReadDir(pluginDirectory)
if err != nil { if err != nil {
return err return err
} }
plugins = append(plugins, &Plugin{
plugins := []*Plugin{} Details: monitoringDetails,
Version: pgeth_monitoring.Version,
for _, file := range files { Start: pgeth_monitoring.Start,
if file.IsDir() { })
newPlugin, err := p.loadPluginDetailsFromDirectory(filepath.Join(pluginDirectory, file.Name()))
if err != nil {
return err
}
plugins = append(plugins, newPlugin)
}
} }
var toolkit *PluginToolkit = &PluginToolkit{ var toolkit = &toolkit.PluginToolkit{
Node: p.node, Node: p.node,
Backend: p.backend, Backend: p.backend,
Logger: p.logger, Logger: p.logger,
@ -168,39 +140,19 @@ func (p *PluginEngine) Start(ctx context.Context) error {
return nil return nil
} }
func (p *PluginEngine) loadPluginDetailsFromDirectory(pluginDirectoryPath string) (*Plugin, error) { func (p *PluginEngine) loadPluginDetails(pluginConfigPath string) (PluginDetails, error) {
p.logger.Info(fmt.Sprintf("Loading plugin from %s", pluginDirectoryPath)) var pluginDetails PluginDetails
var plug Plugin yamlFile, err := os.ReadFile(pluginConfigPath)
yamlFile, err := ioutil.ReadFile(filepath.Join(pluginDirectoryPath, "config.yaml"))
if err != nil { if err != nil {
return nil, err return PluginDetails{}, err
} }
err = yaml.Unmarshal(yamlFile, &plug.Details) err = yaml.Unmarshal(yamlFile, &pluginDetails)
if err != nil { if err != nil {
return nil, err return PluginDetails{}, err
} }
p.logger.Info(fmt.Sprintf("Loading config for \"%s\" = %+v", plug.Details.Name, plug.Details.Config)) p.logger.Info(fmt.Sprintf("Loading config for \"%s\" = %+v", pluginDetails.Name, pluginDetails.Config))
pluginSo, err := plugin.Open(filepath.Join(pluginDirectoryPath, "plugin.so")) return pluginDetails, nil
if err != nil {
panic(err)
}
startFunc, err := pluginSo.Lookup("Start")
if err != nil {
panic(err)
}
versionFunc, err := pluginSo.Lookup("Version")
if err != nil {
panic(err)
}
plug.Start = startFunc.(func(*PluginToolkit, map[string]interface{}, context.Context, chan (error)))
plug.Version = versionFunc.(func())
return &plug, nil
} }

13
pgeth/toolkit/toolkit.go Normal file
View file

@ -0,0 +1,13 @@
package toolkit
import (
"github.com/ethereum/go-ethereum/internal/ethapi"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/node"
)
type PluginToolkit struct {
Node *node.Node
Backend ethapi.Backend
Logger log.Logger
}

View file

@ -7,11 +7,3 @@ for d in plugins/*/ ; do
./dependencies.sh ./dependencies.sh
cd "$CWD" cd "$CWD"
done done
for d in plugins/*/ ; do
CWD=$(pwd)
echo "building $d"
cd "$d"
/usr/local/go/bin/go build -buildmode=plugin -ldflags "-extldflags '-Wl,-z,stack-size=0x800000'" -tags "urfave_cli_no_docs,ckzg,purego" -trimpath -v -o plugin.so
cd "$CWD"
done