Added plugin interface definations

- Added wip plugin interface
- Merged in PR for lego update
- Minor code optimization
This commit is contained in:
Toby Chui
2025-02-19 21:25:50 +08:00
parent de9d3bfb65
commit 1116b643b5
9 changed files with 620 additions and 223 deletions

View File

@@ -0,0 +1,67 @@
package plugins
import (
"encoding/json"
"errors"
"os/exec"
"path/filepath"
)
func (m *Manager) StartPlugin(pluginID string) error {
plugin, ok := m.LoadedPlugins.Load(pluginID)
if !ok {
return errors.New("plugin not found")
}
//Get the plugin Entry point
pluginEntryPoint, err := m.GetPluginEntryPoint(pluginID)
if err != nil {
//Plugin removed after introspect?
return err
}
//Get the absolute path of the plugin entry point to prevent messing up with the cwd
absolutePath, err := filepath.Abs(pluginEntryPoint)
if err != nil {
return err
}
//Prepare plugin start configuration
pluginConfiguration := ConfigureSpec{
Port: getRandomPortNumber(),
RuntimeConst: *m.Options.SystemConst,
}
js, _ := json.Marshal(pluginConfiguration)
cmd := exec.Command(absolutePath, "-configure="+string(js))
cmd.Dir = filepath.Dir(absolutePath)
if err := cmd.Start(); err != nil {
return err
}
// Store the cmd object so it can be accessed later for stopping the plugin
plugin.(*Plugin).Process = cmd
plugin.(*Plugin).Enabled = true
return nil
}
// Check if the plugin is still running
func (m *Manager) PluginStillRunning(pluginID string) bool {
plugin, ok := m.LoadedPlugins.Load(pluginID)
if !ok {
return false
}
return plugin.(*Plugin).Process.ProcessState == nil
}
// BlockUntilAllProcessExited blocks until all the plugins processes have exited
func (m *Manager) BlockUntilAllProcessExited() {
m.LoadedPlugins.Range(func(key, value interface{}) bool {
plugin := value.(*Plugin)
if m.PluginStillRunning(value.(*Plugin).Spec.ID) {
//Wait for the plugin to exit
plugin.Process.Wait()
}
return true
})
}