introspect.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package plugins
  2. import (
  3. "context"
  4. "fmt"
  5. "os/exec"
  6. "time"
  7. )
  8. // LoadPlugin loads a plugin from the plugin directory
  9. func (m *Manager) IsValidPluginFolder(path string) bool {
  10. _, err := m.GetPluginEntryPoint(path)
  11. return err == nil
  12. }
  13. /*
  14. LoadPluginSpec loads a plugin specification from the plugin directory
  15. Zoraxy will start the plugin binary or the entry point script
  16. with -introspect flag to get the plugin specification
  17. */
  18. func (m *Manager) LoadPluginSpec(pluginPath string) (*Plugin, error) {
  19. pluginEntryPoint, err := m.GetPluginEntryPoint(pluginPath)
  20. if err != nil {
  21. return nil, err
  22. }
  23. pluginSpec, err := m.GetPluginSpec(pluginEntryPoint)
  24. if err != nil {
  25. return nil, err
  26. }
  27. return &Plugin{
  28. Spec: pluginSpec,
  29. Enabled: false,
  30. }, nil
  31. }
  32. // GetPluginEntryPoint returns the plugin entry point
  33. func (m *Manager) GetPluginSpec(entryPoint string) (*IntroSpect, error) {
  34. pluginSpec := &IntroSpect{}
  35. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  36. defer cancel()
  37. cmd := exec.CommandContext(ctx, entryPoint, "-introspect")
  38. err := cmd.Run()
  39. if ctx.Err() == context.DeadlineExceeded {
  40. return nil, fmt.Errorf("plugin introspect timed out")
  41. }
  42. if err != nil {
  43. return nil, err
  44. }
  45. return pluginSpec, nil
  46. }