mirror of
https://github.com/tobychui/zoraxy.git
synced 2025-05-31 04:37:20 +02:00
70 lines
3.1 KiB
Go
70 lines
3.1 KiB
Go
package plugins
|
|
|
|
import (
|
|
_ "embed"
|
|
"net/http"
|
|
"os/exec"
|
|
"sync"
|
|
"time"
|
|
|
|
"imuslab.com/zoraxy/mod/database"
|
|
"imuslab.com/zoraxy/mod/dynamicproxy/dpcore"
|
|
"imuslab.com/zoraxy/mod/info/logger"
|
|
zoraxyPlugin "imuslab.com/zoraxy/mod/plugins/zoraxy_plugin"
|
|
)
|
|
|
|
//go:embed no_img.png
|
|
var noImg []byte
|
|
|
|
type Plugin struct {
|
|
RootDir string //The root directory of the plugin
|
|
Spec *zoraxyPlugin.IntroSpect //The plugin specification
|
|
Enabled bool //Whether the plugin is enabled
|
|
|
|
//Runtime
|
|
AssignedPort int //The assigned port for the plugin
|
|
uiProxy *dpcore.ReverseProxy //The reverse proxy for the plugin UI
|
|
staticRouteProxy map[string]*dpcore.ReverseProxy //Storing longest prefix => dpcore map for static route
|
|
dynamicRouteProxy *dpcore.ReverseProxy //The reverse proxy for the dynamic route
|
|
process *exec.Cmd //The process of the plugin
|
|
}
|
|
|
|
type ManagerOptions struct {
|
|
/* Plugins */
|
|
PluginDir string //The directory where the plugins are stored
|
|
PluginGroups map[string][]string //The plugin groups,key is the tag name and the value is an array of plugin IDs
|
|
PluginGroupsConfig string //The group / tag configuration file, if set the plugin groups will be loaded from this file
|
|
|
|
/* Plugin Downloader */
|
|
PluginStoreURLs []string //The plugin store URLs, used to download the plugins
|
|
DownloadablePluginCache []*DownloadablePlugin //The cache for the downloadable plugins, key is the plugin ID and value is the DownloadablePlugin struct
|
|
LastSuccPluginSyncTime int64 //The last sync time for the plugin store URLs, used to check if the plugin store URLs need to be synced again
|
|
|
|
/* Runtime */
|
|
SystemConst *zoraxyPlugin.RuntimeConstantValue //The system constant value
|
|
CSRFTokenGen func(*http.Request) string `json:"-"` //The CSRF token generator function
|
|
Database *database.Database `json:"-"`
|
|
Logger *logger.Logger `json:"-"`
|
|
|
|
/* Development */
|
|
EnableHotReload bool //Check if the plugin file is changed and reload the plugin automatically
|
|
HotReloadInterval int //The interval for checking the plugin file change, in seconds
|
|
}
|
|
|
|
type Manager struct {
|
|
LoadedPlugins map[string]*Plugin //Storing *Plugin
|
|
tagPluginMap sync.Map //Storing *radix.Tree for each plugin tag
|
|
tagPluginListMutex sync.RWMutex //Mutex for the tagPluginList
|
|
tagPluginList map[string][]*Plugin //Storing the plugin list for each tag, only concurrent READ is allowed
|
|
Options *ManagerOptions
|
|
|
|
PluginHash map[string]string //The hash of the plugin file, used to check if the plugin file is changed
|
|
|
|
/* Internal */
|
|
loadedPluginsMutex sync.RWMutex //Mutex for the loadedPlugins
|
|
pluginGroupsMutex sync.RWMutex //Mutex for the pluginGroups
|
|
pluginCheckMutex sync.RWMutex //Mutex for the plugin hash
|
|
pluginReloadTicker *time.Ticker //Ticker for the plugin reload
|
|
pluginReloadStop chan bool //Channel to stop the plugin reload ticker
|
|
}
|