mirror of
https://github.com/tobychui/zoraxy.git
synced 2025-06-03 06:07:20 +02:00

- Added embeded resources server for plugin library - Added ztnc plugin for global area network - Added wide mode for side wrapper
69 lines
1.6 KiB
Go
69 lines
1.6 KiB
Go
package plugins
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"os/exec"
|
|
"time"
|
|
|
|
zoraxyPlugin "imuslab.com/zoraxy/mod/plugins/zoraxy_plugin"
|
|
)
|
|
|
|
// LoadPlugin loads a plugin from the plugin directory
|
|
func (m *Manager) IsValidPluginFolder(path string) bool {
|
|
_, err := m.GetPluginEntryPoint(path)
|
|
return err == nil
|
|
}
|
|
|
|
/*
|
|
LoadPluginSpec loads a plugin specification from the plugin directory
|
|
Zoraxy will start the plugin binary or the entry point script
|
|
with -introspect flag to get the plugin specification
|
|
*/
|
|
func (m *Manager) LoadPluginSpec(pluginPath string) (*Plugin, error) {
|
|
pluginEntryPoint, err := m.GetPluginEntryPoint(pluginPath)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
pluginSpec, err := m.GetPluginSpec(pluginEntryPoint)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
err = validatePluginSpec(pluginSpec)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &Plugin{
|
|
Spec: pluginSpec,
|
|
Enabled: false,
|
|
}, nil
|
|
}
|
|
|
|
// GetPluginEntryPoint returns the plugin entry point
|
|
func (m *Manager) GetPluginSpec(entryPoint string) (*zoraxyPlugin.IntroSpect, error) {
|
|
pluginSpec := zoraxyPlugin.IntroSpect{}
|
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
|
defer cancel()
|
|
|
|
cmd := exec.CommandContext(ctx, entryPoint, "-introspect")
|
|
output, err := cmd.Output()
|
|
if ctx.Err() == context.DeadlineExceeded {
|
|
return nil, fmt.Errorf("plugin introspect timed out")
|
|
}
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Assuming the output is JSON and needs to be unmarshaled into pluginSpec
|
|
err = json.Unmarshal(output, &pluginSpec)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to unmarshal plugin spec: %v", err)
|
|
}
|
|
|
|
return &pluginSpec, nil
|
|
}
|