plugmgr

package module
v0.0.0-...-63e01da Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 25, 2025 License: MIT Imports: 26 Imported by: 0

README

Go 语言插件管理器

一个用于Go应用程序的插件管理库,支持动态加载、热重载、依赖管理及 Web 框架适配。旨在提供一个轻量、安全、高性能的插件系统,使开发者能够轻松地构建可扩展的应用程序。通过解耦核心应用程序和插件,我们实现了更灵活的架构和更好的可维护性。

功能特点

  • 动态加载和卸载插件
  • 版本控制和依赖管理
  • 热重载支持
  • 生命周期事件系统
  • 沙箱功能以提高安全性
  • 插件性能的指标收集
  • 灵活的配置管理
  • 插件签名验证
  • 支持多种 Web 框架适配器

主要优势

  1. 模块化设计:将应用程序功能解耦,提高系统的可扩展性
  2. 安全隔离:通过沙箱机制确保插件运行的安全性
  3. 动态管理:支持运行时加载、卸载和热重载插件
  4. 跨平台兼容:支持主流操作系统和 Web 框架
  5. 性能优化:最小化插件加载和执行的性能开销

安装与快速开始

安装

使用 Go 包管理器获取最新版本:

go get github.com/darkit/plugmgr
基础使用
package main

import (
    "log"
    pm "github.com/darkit/plugmgr"
)

func main() {
    // 初始化插件管理器
    manager, err := pm.NewManager(
        "./plugins",        // 插件目录
        "./config.db",      // 配置文件路径
        "./public_key.pem", // 可选的公钥路径
    )
    if err != nil {
        log.Fatal(err)
    }

    // 加载插件
    err = manager.LoadPlugin("./plugins/demo.so")
    if err != nil {
        log.Printf("加载插件失败: %v", err)
    }

    // 执行插件
    result, err := manager.ExecutePlugin("demo", data)
    if err != nil {
        log.Printf("执行插件失败: %v", err)
    }
}
初始化插件管理器
manager, err := pm.NewManager("./plugins", "config.db", "public_key.pem")

参数:

  • pluginDir(字符串):存储插件的目录。
  • configPath(字符串):用于管理插件启用/禁用的配置文件。
  • publicKeyPath(字符串,可选):用于验证插件签名的公钥文件路径。
加载、执行和卸载插件
err = manager.LoadPlugin("./plugins/myplugin.so")
err = manager.ExecutePlugin("MyPlugin")
err = manager.UnloadPlugin("MyPlugin")
err = manager.HotReload("MyPlugin", "./plugins/myplugin_v2.so")

Web 框架集成

通用适配器接口

插件管理器提供了一个通用的适配器接口,可以轻松集成到不同的 Web 框架中:

type Handler[T any] interface {
    // 基础插件管理
    ListPlugins() T
    LoadPlugin() T
    UnloadPlugin() T
    EnablePlugin() T
    DisablePlugin() T
    PreloadPlugin() T
    HotReloadPlugin() T

    // 插件配置
    GetPluginConfig() T
    PluginConfigUpdated() T

    // 插件执行
    ExecutePlugin() T

    // 插件权限
    GetPluginPermission() T
    SetPluginPermission() T
    RemovePluginPermission() T

    // 插件市场
    ListMarketPlugins() T
    InstallPlugin() T
    RollbackPlugin() T

    // 插件统计
    GetPluginStats() T
}
标准 HTTP 集成
// 创建 HTTP 处理器
Http := adapter.NewPluginHandler(manager, func(h http.HandlerFunc) http.HandlerFunc {
    return h
})

// 获取处理器接口
HttpHandlers := Http.GetHandlers()

// 创建路由
mux := http.NewServeMux()

// 设置路由
mux.HandleFunc("/plugins", HttpHandlers.ListPlugins())
mux.HandleFunc("/plugins/load/", HttpHandlers.LoadPlugin())
// ... 其他路由

log.Fatal(http.ListenAndServe(":8080", mux))
Gin 框架集成
// 创建 Gin 处理器
Gin := adapter.NewPluginHandler(manager, func(h http.HandlerFunc) gin.HandlerFunc {
    return func(c *gin.Context) {
        h(c.Writer, c.Request)
    }
})

// 获取处理器接口
GinHandlers := Gin.GetHandlers()

// 创建 Gin 路由
r := gin.Default()

// 设置路由
r.GET("/plugins", GinHandlers.ListPlugins())
r.POST("/plugins/load/:name", GinHandlers.LoadPlugin())
// ... 其他路由

log.Fatal(r.Run(":8080"))
API 端点说明
方法 路径 说明
GET /plugins 获取插件列表
POST /plugins/load/:name 加载插件
POST /plugins/unload/:name 卸载插件
POST /plugins/enable/:name 启用插件
POST /plugins/disable/:name 禁用插件
POST /plugins/preload/:name 预加载插件
POST /plugins/hotreload/:name 热重载插件
GET /plugins/config/:name 获取插件配置
PUT /plugins/config/:name 更新插件配置
GET /plugins/permission/:name 获取插件权限
PUT /plugins/permission/:name 设置插件权限
DELETE /plugins/permission/:name 移除插件权限
GET /plugins/stats/:name 获取插件统计信息
GET /market 获取插件市场列表
POST /market/install/:name 安装插件
POST /market/rollback/:name 回滚插件版本

插件开发指南

插件需实现 Plugin 接口:

type Plugin interface {
    // Metadata 返回插件的元数据信息
    // 包括:插件名称、版本、作者、描述、依赖等
    Metadata() PluginMetadata

    // Init 插件初始化
    // 在插件首次加载时调用,用于初始化资源
    Init() error

    // PostLoad 加载后处理
    // 在插件加载完成后调用,可以进行一些额外的设置
    PostLoad() error

    // PreUnload 卸载前处理
    // 在插件卸载前调用,用于清理资源
    PreUnload() error

    // Shutdown 关闭处理
    // 在插件管理器关闭时调用,用于释放资源
    Shutdown() error

    // PreLoad 加载前配置处理
    // 在插件加载前调用,用于处理初始配置
    // config: 包含插件的初始配置数据
    PreLoad(config []byte) error

    // ConfigUpdated 配置管理
    // 处理插件的配置更新
    // config: 新的配置数据
    // 返回: 处理后的配置数据和可能的错误
    ConfigUpdated(config []byte) ([]byte, error)

    // Execute 执行插件功能
    // data: 输入参数
    // 返回: 执行结果和可能的错误
    Execute(data any) (any, error)
}

插件生命周期与事件系统

事件系统概述

插件管理器提供了完整的事件系统,用于监控和响应插件的各种状态变化。事件系统是插件生命周期管理的核心组件,允许开发者在插件的不同阶段进行精细化的监控和处理。

内置事件类型
事件名称 触发时机 事件数据
PluginLoaded 插件加载完成时 插件名称
PluginInitialized 插件初始化完成时 插件名称
PluginExecuted 插件执行完成时 插件名称、执行结果
PluginConfigUpdated 插件配置更新时 插件名称、新配置
PluginPreUnload 插件卸载前 插件名称
PluginUnloaded 插件卸载完成时 插件名称
PluginExecutionError 插件执行出错时 插件名称、错误信息
PluginHotReloaded 插件热重载完成时 插件名称
事件订阅
基本订阅
// 创建事件总线(可选配置超时时间)
eventBus := pm.NewEventBus(
    pm.WithTimeout(3 * time.Second), // 设置事件处理超时时间
)

// 订阅插件加载事件
eventBus.Subscribe("PluginLoaded", func(e pm.Event) {
    fmt.Printf("插件已加载: %s\n", e.Data.Name)
})

// 订阅插件执行错误事件
eventBus.Subscribe("PluginExecutionError", func(e pm.Event) {
    fmt.Printf("插件执行错误: %s, 错误: %v\n", 
        e.Data.Name, 
        e.Data.Error,
    )
})
事件发布方式

支持同步和异步两种事件发布方式:

// 同步发布(阻塞等待所有处理器执行完成)
err := eventBus.Publish(pm.Event{
    EventName: "PluginLoaded",
    Data: pm.EventData{
        Name: "demo",
    },
})

// 异步发布(带超时控制)
err := eventBus.PublishAsync(pm.Event{
    EventName: "PluginExecuted",
    Data: pm.EventData{
        Name: "demo",
        Data: result,
    },
})
事件管理功能
// 取消订阅事件
handler := func(e pm.Event) { ... }
eventBus.Unsubscribe("PluginLoaded", handler)

// 检查事件是否有订阅者
if eventBus.HasSubscribers("PluginLoaded") {
    // ...
}

// 获取事件订阅者数量
count := eventBus.SubscribersCount("PluginLoaded")

// 关闭事件总线
err := eventBus.Close()
事件处理特性
  • 超时控制:可配置事件处理超时时间,防止处理器阻塞
  • 并发安全:支持多个 goroutine 同时订阅和发布事件
  • 优雅关闭:支持事件总线的安全关闭
  • 灵活订阅:支持同一事件多个处理器
  • 处理器隔离:单个处理器的错误不影响其他处理器

插件示例

type MyPlugin struct{}

func (p *MyPlugin) Metadata() pm.PluginMetadata {
    return pm.PluginMetadata{
        Name:         "MyPlugin",
        Version:      "1.0.0",
        Dependencies: map[string]string{},
    }
}

func (p *MyPlugin) Init() error {
    fmt.Println("插件初始化")
    return nil
}

func (p *MyPlugin) PostLoad() error {
    fmt.Println("插件加载后处理")
    return nil
}

func (p *MyPlugin) PreUnload() error {
    fmt.Println("插件卸载前处理")
    return nil
}

func (p *MyPlugin) Shutdown() error {
    fmt.Println("插件关闭")
    return nil
}

func (p *MyPlugin) PreLoad(config []byte) error {
    fmt.Println("插件预加载配置")
    return nil
}

func (p *MyPlugin) ConfigUpdated(config []byte) ([]byte, error) {
    fmt.Println("管理插件配置")
    return config, nil
}

func (p *MyPlugin) Execute(data any) (any, error) {
    fmt.Println("插件执行")
    return nil, nil
}
插件变量

插件管理器通过 Plugin 变量发现你的插件,必须定义如下:

var Plugin *MyPlugin
编译插件
go build -buildmode=plugin -o myplugin.so myplugin.go

远程插件库与自动更新

repo, err := manager.SetupRemoteRepository("[email protected]:/path/to/repo")
安装 Redbean 作为插件服务器
err := manager.InstallRedbean("1.5.3", "./redbean", "[email protected]:/path/to/repo")

优势:

  • 轻量级:Redbean 体积小,占用资源少。
  • 高效性:提供快速插件分发能力。
  • 安全性:内置插件签名验证。

安全性

  • 插件签名验证:确保插件来源可信。
  • 沙箱隔离:防止插件影响宿主应用。
  • 权限控制:限制插件访问的资源。

项目结构

.
├── adapter/                   // Web 框架适配器
│   └── adapter.go             // 适配器接口
├── docs/                      // 文档
│   ├── PluginSignature.md     // 插件签名指南
│   └── Redbean.md             // Redbean 配置说明
├── examples/                  // 示例代码
│   ├── http/                  // Http 框架示例
│   └── plugins/               // 插件示例
├── config.go                  // 配置管理
├── discovery.go               // 插件发现和验证
├── errors.go                  // 错误定义
├── event.go                   // 事件系统
├── logger.go                  // 日志接口
├── manager.go                 // 插件管理器核心
├── plugin.go                  // 插件接口和相关结构
├── sandbox.go                 // 沙箱接口
├── sandbox_other.go           // 非 Windows 平台的沙箱实现
└── sandbox_windows.go         // Windows 平台的沙箱实现

许可证 & 贡献

本项目采用 MIT License 许可证,欢迎提交 Issue 和 Pull Request!

Documentation

Index

Constants

View Source
const (
	PluginLoaded         = "PluginLoaded"
	PluginInitialized    = "PluginInitialized"
	PluginExecuted       = "PluginExecuted"
	PluginConfigUpdated  = "PluginConfigUpdated"
	PluginPreUnload      = "PluginPreUnload"
	PluginUnloaded       = "PluginUnloaded"
	PluginExecutionError = "PluginExecutionError"
	PluginHotReloaded    = "PluginHotReloaded"
)
View Source
const PluginSymbol = "Plugin"

Variables

View Source
var (
	ErrPluginAlreadyLoaded    = newPluginError("插件已加载", errTypeValidation)
	ErrInvalidPluginInterface = newPluginError("无效的插件接口", errTypeValidation)
	ErrPluginNotFound         = newPluginError("未找到插件", errTypeValidation)
	ErrIncompatibleVersion    = newPluginError("插件版本不兼容", errTypeValidation)
	ErrMissingDependency      = newPluginError("缺少插件依赖", errTypeValidation)
	ErrCircularDependency     = newPluginError("检测到循环依赖", errTypeValidation)
	ErrPluginSandboxViolation = newPluginError("插件违反沙箱规则", errTypeRuntime)
)

常用的插件错误

Functions

func Deserializer

func Deserializer(data []byte, v any) error

Deserializer 反序列化数据

参数:
- data: 待反序列化的字节数组
- v: 目标结构体指针
返回:
- error: 反序列化过程中的错误
功能:
- 将字节数组反序列化为指定类型
- 用于配置加载和数据恢复

func ExecutePluginGeneric

func ExecutePluginGeneric[T any, R any](m *Manager, name string, data T) (R, error)

ExecutePluginGeneric 通用插件执行函数

类型参数:
- T: 输入数据类型
- R: 返回结果类型
参数:
- m: 插件管理器实例
- name: 插件名称
- data: 传递给插件的数据
功能:
- 在沙箱环境中安全执行插件
- 记录执行时间和统计信息
- 确保类型安全的结果转换
返回:
- R: 类型安全的执行结果
- error: 执行过程中的错误信息

func LoadConfig

func LoadConfig(filename string, pluginDir ...string) (*config, error)

LoadConfig 加载配置文件

func NewConfig

func NewConfig(filename string) *config

NewConfig 创建新的配置实例

func Serializer

func Serializer(data any) ([]byte, error)

Serializer 序列化数据

参数:
- data: 需要序列化的数据
返回:
- []byte: 序列化后的字节数组
- error: 序列化过程中的错误
功能:
- 将任意类型数据序列化为字节数组
- 用于配置存储和数据传输

Types

type Event

type Event struct {
	EventName string
	Data      EventData
}

type EventData

type EventData struct {
	Name  string
	Data  interface{}
	Error error
}

type EventHandler

type EventHandler func(Event)

type ISandbox

type ISandbox struct {
	// contains filtered or unexported fields
}

func (*ISandbox) Disable

func (s *ISandbox) Disable() error

Disable 关闭沙箱

func (*ISandbox) Enable

func (s *ISandbox) Enable() error

Enable 激活沙箱

func (*ISandbox) VerifyPluginPath

func (s *ISandbox) VerifyPluginPath(path string) error

VerifyPluginPath 验证插件路径是否在沙箱目录内

参数:
- path: 插件路径
返回:
- error: 验证过程中的错误
功能:
- 使用 filepath.Abs 获取插件的绝对路径
- 使用 filepath.Clean 规范化路径
- 检查插件路径是否在沙箱目录内

type Logger

type Logger interface {
	Debug(msg string, args ...any)
	Info(msg string, args ...any)
	Warn(msg string, args ...any)
	Error(msg string, args ...any)
}

Logger 日志接口

type Manager

type Manager struct {
	// contains filtered or unexported fields
}

Manager 插件管理器

功能:
- 管理插件的生命周期(加载、执行、卸载)
- 处理插件配置和依赖关系
- 提供插件权限控制
字段说明:
- plugins: 已加载的插件映射
- config: 插件配置管理器
- dependencies: 插件依赖关系映射
- stats: 插件执行统计信息
- eventBus: 事件总线,用于插件事件通知
- sandbox: 插件沙箱环境
- publicKeyPath: 插件签名验证公钥路径
- pluginDir: 插件目录路径
- logger: 日志记录器
- versionManager: 插件版本管理器
- pluginMarket: 插件市场接口
- permissions: 插件权限配置映射

func NewManager

func NewManager(pluginDir, configPath string, publicKeyPath ...string) (*Manager, error)

NewManager 创建新的插件管理器实例

参数:
- pluginDir: 插件目录路径
- configPath: 配置文件路径
- publicKeyPath: 可选的公钥路径,用于验证插件签名
功能:
- 初始化插件管理器及其依赖组件
- 加载配置文件
- 设置沙箱环境
- 初始化事件总线、版本管理器和插件市场
- 如果未指定启用的插件,则加载所有插件
返回:
- *Manager: 插件管理器实例
- error: 初始化过程中的错误信息

func (*Manager) ConfigUpdated

func (m *Manager) ConfigUpdated(name string, config any) ([]byte, error)

ConfigUpdated 管理插件配置

name: 插件名称
config: 新的配置数据
功能:
- 序列化配置数据
- 更新插件配置
- 保存配置到持久化存储

func (*Manager) DeployRepository

func (m *Manager) DeployRepository(repo *PluginRepository, localPath string) error

DeployRepository 部署插件仓库

参数:
- repo: 插件仓库配置对象
- localPath: 本地部署路径
返回:
- error: 部署过程中的错误
功能:
- 下载 redbean 执行文件
- 使用 SSH 或本地方式部署仓库
- 验证部署结果

func (*Manager) DisablePlugin

func (m *Manager) DisablePlugin(name string) error

DisablePlugin 禁用插件

name: 插件名称
功能:
- 更新插件禁用状态
- 卸载插件

func (*Manager) EnablePlugin

func (m *Manager) EnablePlugin(name string) error

EnablePlugin 启用插件

name: 插件名称
功能:
- 更新插件启用状态
- 加载插件

func (*Manager) ExecutePlugin

func (m *Manager) ExecutePlugin(name string, data any) (any, error)

ExecutePlugin 执行插件并返回通用类型结果

name: 插件名称
data: 传递给插件的数据
功能:
- 在沙箱环境中执行插件
- 更新执行统计信息
- 返回任意类型的结果

func (*Manager) ExecutePluginInt

func (m *Manager) ExecutePluginInt(name string, data any) (int, error)

ExecutePluginInt 执行插件并返回整数结果

name: 插件名称
data: 传递给插件的数据
功能:
- 执行插件并确保返回整数类型

func (*Manager) ExecutePluginString

func (m *Manager) ExecutePluginString(name string, data any) (string, error)

ExecutePluginString 执行插件并返回字符串结果

name: 插件名称
data: 传递给插件的数据
功能:
- 执行插件并确保返回字符串类型

func (*Manager) GetEventBus

func (m *Manager) GetEventBus() *eventBus

GetEventBus 获取事件总线

功能:
- 获取事件总线实例

func (*Manager) GetPluginConfig

func (m *Manager) GetPluginConfig(name string) (*PluginData, error)

GetPluginConfig 获取插件配置

name: 插件名称
功能:
- 返回插件的当前配置

func (*Manager) GetPluginMarket

func (m *Manager) GetPluginMarket() *PluginMarket

GetPluginMarket 获取插件市场

功能:
- 获取插件市场实例

func (*Manager) GetPluginStats

func (m *Manager) GetPluginStats(name string) (*PluginStats, error)

GetPluginStats 获取插件统计信息

name: 插件名称
功能:
- 返回插件的执行统计信息

func (*Manager) GetVersionManager

func (m *Manager) GetVersionManager() *VersionManager

GetVersionManager 获取版本管理器

功能:
- 获取版本管理器实例

func (*Manager) HasPermission

func (m *Manager) HasPermission(pluginName, action string) bool

HasPermission 检查插件权限

EventName: 插件名称
action: 操作名称
功能:
- 验证插件是否有权限执行指定操作

func (*Manager) HotReload

func (m *Manager) HotReload(name string, path string) error

HotReload 热重载插件

name: 插件名称
path: 新插件文件的路径
功能:
- 验证新插件签名
- 保持原有配置的情况下更新插件
- 触发热重载事件

func (*Manager) HotUpdatePlugin

func (m *Manager) HotUpdatePlugin(name, newVersion string) error

HotUpdatePlugin 热更新插件

参数:
- name: 插件名称
- newVersion: 新版本号
返回:
- error: 更新过程中的错误
功能:
- 在不停止系统的情况下更新插件
- 保持原有配置
- 更新版本信息

func (*Manager) InstallPlugin

func (m *Manager) InstallPlugin(name, version string) error

InstallPlugin 下载并安装插件

参数:
- name: 插件名称
- version: 插件版本
返回:
- error: 下载或安装过程中的错误
功能:
- 从插件市场下载指定版本的插件
- 安装并初始化插件
- 更新版本信息

func (*Manager) ListAvailablePlugins

func (m *Manager) ListAvailablePlugins() []PluginInfo

ListAvailablePlugins 列出可用插件

返回:
- []PluginInfo: 可用插件信息列表
功能:
- 获取插件市场中所有可用插件的信息
- 包含插件名称、版本等元数据

func (*Manager) ListPlugins

func (m *Manager) ListPlugins() []string

ListPlugins 列出所有已加载的插件

功能:
- 返回当前已加载的插件名称列表

func (*Manager) LoadEnabledPlugins

func (m *Manager) LoadEnabledPlugins(pluginDir string) error

LoadEnabledPlugins 加载所有启用的插件

pluginDir: 插件目录路径
功能:
- 并发加载所有启用的插件

func (*Manager) LoadPlugin

func (m *Manager) LoadPlugin(path string) error

LoadPlugin 加载一个插件

path: 插件文件的完整路径
功能:
- 验证插件签名(如果启用)
- 加载插件并初始化
- 设置默认权限
- 触发加载事件

func (*Manager) LoadPluginPermissions

func (m *Manager) LoadPluginPermissions(permissions map[string]*PluginPermission)

LoadPluginPermissions 从配置加载插件权限

参数:
- permissions: 插件权限配置映射,key为插件名称,value为权限配置
功能:
- 批量导入插件权限配置
- 用于系统启动时初始化权限
- 支持动态更新多个插件的权限

func (*Manager) LoadPluginWithData

func (m *Manager) LoadPluginWithData(path string, data ...any) error

LoadPluginWithData 加载插件并设置初始数据

path: 插件文件路径
data: 可选的初始配置数据
功能:
- 加载插件
- 设置初始配置
- 执行完整的插件初始化流程

func (*Manager) PreloadPlugins

func (m *Manager) PreloadPlugins(names []string) error

PreloadPlugins 添加预加载方法

参数:
- names: 插件名称列表
返回:
- error: 预加载过程中的错误
功能:
- 预加载指定插件
- 不立即初始化,仅加载插件符号

func (*Manager) PublishPlugin

func (m *Manager) PublishPlugin(info PluginInfo) error

PublishPlugin 发布插件到插件市场

参数:
- info: 插件信息
返回:
- error: 发布过程中的错误
功能:
- 将插件信息添加到插件市场
- 使插件对其他用户可见

func (*Manager) RemovePluginPermission

func (m *Manager) RemovePluginPermission(pluginName string)

RemovePluginPermission 移除插件权限

参数:
- EventName: 插件名称
功能:
- 从权限管理器中删除指定插件的所有权限配置
- 用于插件卸载或权限重置场景

func (*Manager) RollbackPlugin

func (m *Manager) RollbackPlugin(name, version string) error

RollbackPlugin 回滚插件版本

参数:
- name: 插件名称
- version: 目标版本号
返回:
- error: 回滚过程中的错误
功能:
- 将插件回滚到指定版本
- 恢复该版本的配置
- 更新版本信息

func (*Manager) SetLogger

func (m *Manager) SetLogger(logger Logger)

SetLogger 设置日志记录器

logger: 日志记录器实例

func (*Manager) SetPluginPermission

func (m *Manager) SetPluginPermission(pluginName string, permission *PluginPermission)

SetPluginPermission 设置插件权限

EventName: 插件名称
permission: 权限配置
功能:
- 更新插件的权限配置

func (*Manager) SetSandbox

func (m *Manager) SetSandbox(sandbox Sandbox)

SetSandbox 设置沙箱环境

功能:
- 设置插件管理器的沙箱环境

func (*Manager) SetupRemoteRepository

func (m *Manager) SetupRemoteRepository(url, sshKeyPath string) (*PluginRepository, error)

SetupRemoteRepository 设置远程插件仓库

参数:
- url: 远程仓库的 URL 地址
- sshKeyPath: SSH 密钥文件的路径
返回:
- *PluginRepository: 配置好的插件仓库对象
- error: 设置过程中的错误
功能:
- 读取并解析 SSH 密钥
- 创建并返回插件仓库配置对象

func (*Manager) SubscribeToEvent

func (m *Manager) SubscribeToEvent(eventName string, handler EventHandler)

SubscribeToEvent 订阅插件事件 参数: - eventName: 事件名称 - handler: 事件处理函数 功能: - 注册事件处理器 - 当指定事件发生时触发处理函数

func (*Manager) UnloadPlugin

func (m *Manager) UnloadPlugin(name string) error

UnloadPlugin 卸载指定的插件

name: 插件名称
功能:
- 执行插件的预卸载和关闭钩子
- 清理插件资源和权限
- 触发卸载事件

func (*Manager) VerifyPluginSignature

func (m *Manager) VerifyPluginSignature(pluginPath string, publicKeyPath string) error

VerifyPluginSignature 验证插件签名

参数:
- pluginPath: 插件文件路径
- publicKeyPath: 公钥文件路径
返回:
- error: 验证过程中的错误
功能:
- 读取插件文件和签名文件
- 解析公钥并验证签名
- 使用 RSA-SHA256 算法进行签名验证

type Plugin

type Plugin interface {
	// Metadata 返回插件的元数据信息
	// 包含插件名称、版本、依赖关系等基本信息
	Metadata() PluginMetadata

	// Init 插件初始化
	// 在插件加载后执行,用于初始化插件的资源和状态
	Init() error

	// PostLoad 加载后处理
	// 在插件初始化完成后执行,用于处理依赖项和建立连接
	PostLoad() error

	// PreUnload 卸载前处理
	// 在插件卸载前执行,用于清理资源和保存状态
	PreUnload() error

	// Shutdown 关闭插件
	// 在插件完全卸载前执行,用于释放所有资源
	Shutdown() error

	// PreLoad 加载前处理
	// 在插件初始化前执行,用于加载配置和验证环境
	// 参数 config: 插件的配置数据
	PreLoad(config []byte) error

	// ConfigUpdated 管理插件配置
	// 用于更新和维护插件的配置信息
	// 参数 config: 新的配置数据
	// 返回: 处理后的配置数据和可能的错误
	ConfigUpdated(config []byte) ([]byte, error)

	// Execute 执行插件功能
	// 插件的主要业务逻辑实现
	// 参数 data: 输入数据
	// 返回: 处理结果和可能的错误
	Execute(data any) (any, error)
}

Plugin 定义了插件必须实现的接口

func LoadPlugin

func LoadPlugin(path string) (Plugin, error)

LoadPlugin 加载插件

type PluginData

type PluginData struct {
	Config      []byte            `msgpack:"config"`     // 插件的配置数据
	UpdatedAt   time.Time         `msgpack:"updated_at"` // 最后更新时间
	Permissions *PluginPermission `msgpack:"permissions,omitempty"`
}

PluginData 存储插件配置的详细信息

type PluginError

type PluginError struct {
	// contains filtered or unexported fields
}

PluginError 定义插件错误结构

func (*PluginError) Error

func (e *PluginError) Error() string

Error 实现 error 接口

func (*PluginError) Metadata

func (e *PluginError) Metadata() map[string]interface{}

Metadata 获取错误的元数据

func (*PluginError) Stack

func (e *PluginError) Stack() string

Stack 返回错误堆栈

func (*PluginError) Type

func (e *PluginError) Type() string

Type 返回错误类型

func (*PluginError) WithMetadata

func (e *PluginError) WithMetadata(key string, value interface{}) *PluginError

WithMetadata 添加元数据到错误

type PluginInfo

type PluginInfo struct {
	Name        string   `json:"name"`
	Description string   `json:"description"`
	Author      string   `json:"author"`
	Version     string   `json:"version"`
	Versions    []string `json:"versions"`
}

type PluginMarket

type PluginMarket struct {
	// contains filtered or unexported fields
}

func (*PluginMarket) AddPlugin

func (pm *PluginMarket) AddPlugin(info PluginInfo)

func (*PluginMarket) GetPlugin

func (pm *PluginMarket) GetPlugin(name string) (PluginInfo, bool)

func (*PluginMarket) ListPlugins

func (pm *PluginMarket) ListPlugins() []PluginInfo

type PluginMetadata

type PluginMetadata struct {
	Name         string
	Version      string
	Dependencies map[string]string
	GoVersion    string
	Signature    []byte
	Config       any
}

type PluginPermission

type PluginPermission struct {
	AllowedActions map[string]bool // 允许的操作列表
	Roles          []string        // 角色列表
}

PluginPermission 插件权限定义

type PluginRepository

type PluginRepository struct {
	URL       string
	SSHKey    string
	PublicKey ssh.PublicKey
}

type PluginStats

type PluginStats struct {
	ExecutionCount     int64
	LastExecutionTime  time.Duration
	TotalExecutionTime time.Duration
}

type Sandbox

type Sandbox interface {
	Enable() error
	Disable() error
	VerifyPluginPath(path string) error
}

type VersionManager

type VersionManager struct {
	// contains filtered or unexported fields
}

func (*VersionManager) AddVersion

func (vm *VersionManager) AddVersion(pluginName, version string)

func (*VersionManager) GetActiveVersion

func (vm *VersionManager) GetActiveVersion(pluginName string) (string, bool)

func (*VersionManager) GetVersions

func (vm *VersionManager) GetVersions(pluginName string) []string

func (*VersionManager) SetActiveVersion

func (vm *VersionManager) SetActiveVersion(pluginName, version string)

Directories

Path Synopsis
http command
plugins/hello command
plugins/math command

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL