mirror of
https://github.com/go-gost/x.git
synced 2026-10-20 00:17:32 +00:00
Add Command []string to PluginConfig and a new x/plugin package that spawns plugin subprocesses (deduplicated by argv) and terminates them on Shutdown. Linux uses Pdeathsig, Windows a kill-on-close job object, so children follow an abrupt parent exit. Wire Spawn into every config/parsing plugin constructor.
49 lines
1.3 KiB
Go
49 lines
1.3 KiB
Go
package observer
|
|
|
|
import (
|
|
"crypto/tls"
|
|
"strings"
|
|
|
|
"github.com/go-gost/core/logger"
|
|
"github.com/go-gost/core/observer"
|
|
"github.com/go-gost/x/config"
|
|
"github.com/go-gost/x/internal/plugin"
|
|
observer_plugin "github.com/go-gost/x/observer/plugin"
|
|
xplugin "github.com/go-gost/x/plugin"
|
|
)
|
|
|
|
// ParseObserver converts an ObserverConfig into an observer.Observer. It only
|
|
// supports plugin backends (HTTP or gRPC); returns nil when cfg or cfg.Plugin
|
|
// is nil.
|
|
func ParseObserver(cfg *config.ObserverConfig) observer.Observer {
|
|
if cfg == nil || cfg.Plugin == nil {
|
|
return nil
|
|
}
|
|
|
|
if err := xplugin.Spawn(cfg.Plugin.Command); err != nil {
|
|
logger.Default().Errorf("spawn plugin %s: %v", cfg.Name, err)
|
|
}
|
|
var tlsCfg *tls.Config
|
|
if cfg.Plugin.TLS != nil {
|
|
tlsCfg = &tls.Config{
|
|
ServerName: cfg.Plugin.TLS.ServerName,
|
|
InsecureSkipVerify: !cfg.Plugin.TLS.Secure,
|
|
}
|
|
}
|
|
switch strings.ToLower(cfg.Plugin.Type) {
|
|
case "http":
|
|
return observer_plugin.NewHTTPPlugin(
|
|
cfg.Name, cfg.Plugin.Addr,
|
|
plugin.TokenOption(cfg.Plugin.Token),
|
|
plugin.TLSConfigOption(tlsCfg),
|
|
plugin.TimeoutOption(cfg.Plugin.Timeout),
|
|
)
|
|
default:
|
|
return observer_plugin.NewGRPCPlugin(
|
|
cfg.Name, cfg.Plugin.Addr,
|
|
plugin.TokenOption(cfg.Plugin.Token),
|
|
plugin.TLSConfigOption(tlsCfg),
|
|
)
|
|
}
|
|
}
|