update
All checks were successful
Build Multi-Platform Binaries / build-frontend (push) Successful in 38s
Build Multi-Platform Binaries / build-binaries (amd64, darwin, server, false) (push) Successful in 1m12s
Build Multi-Platform Binaries / build-binaries (amd64, linux, client, true) (push) Successful in 54s
Build Multi-Platform Binaries / build-binaries (amd64, linux, server, true) (push) Successful in 1m32s
Build Multi-Platform Binaries / build-binaries (amd64, windows, client, true) (push) Successful in 48s
Build Multi-Platform Binaries / build-binaries (amd64, windows, server, true) (push) Successful in 2m2s
Build Multi-Platform Binaries / build-binaries (arm, 7, linux, client, true) (push) Successful in 1m7s
Build Multi-Platform Binaries / build-binaries (arm, 7, linux, server, true) (push) Successful in 1m56s
Build Multi-Platform Binaries / build-binaries (arm64, darwin, server, false) (push) Successful in 1m22s
Build Multi-Platform Binaries / build-binaries (arm64, linux, client, true) (push) Successful in 57s
Build Multi-Platform Binaries / build-binaries (arm64, linux, server, true) (push) Successful in 1m46s
Build Multi-Platform Binaries / build-binaries (arm64, windows, server, false) (push) Successful in 1m26s

This commit is contained in:
2026-01-02 14:25:25 +08:00
parent 790c004f6e
commit d63ff7169e

View File

@@ -1241,7 +1241,7 @@ func (s *Server) RestartClientPlugin(clientID, pluginName, ruleName string) erro
return fmt.Errorf("client %s not found or not online", clientID) return fmt.Errorf("client %s not found or not online", clientID)
} }
// 查找规则 // 查找规则(用于内置插件)
var rule *protocol.ProxyRule var rule *protocol.ProxyRule
for _, r := range cs.Rules { for _, r := range cs.Rules {
if r.Name == ruleName && r.Type == pluginName { if r.Name == ruleName && r.Type == pluginName {
@@ -1249,17 +1249,63 @@ func (s *Server) RestartClientPlugin(clientID, pluginName, ruleName string) erro
break break
} }
} }
if rule == nil {
return fmt.Errorf("rule %s not found for plugin %s", ruleName, pluginName)
}
// 先停止 // 先停止
if err := s.sendClientPluginStop(cs.Session, pluginName, ruleName); err != nil { if err := s.sendClientPluginStop(cs.Session, pluginName, ruleName); err != nil {
log.Printf("[Server] Stop plugin warning: %v", err) log.Printf("[Server] Stop plugin warning: %v", err)
} }
// 再启动 // 如果找到规则,使用规则重启(内置插件)
if rule != nil {
return s.sendClientPluginStart(cs.Session, *rule) return s.sendClientPluginStart(cs.Session, *rule)
}
// 否则发送 JS 插件重启命令
return s.sendJSPluginRestart(cs.Session, pluginName, ruleName)
}
// sendJSPluginRestart 发送 JS 插件重启命令
func (s *Server) sendJSPluginRestart(session *yamux.Session, pluginName, ruleName string) error {
stream, err := session.Open()
if err != nil {
return err
}
defer stream.Close()
// 使用 PluginConfigUpdate 消息触发重启
req := protocol.PluginConfigUpdateRequest{
PluginName: pluginName,
RuleName: ruleName,
Config: nil,
Restart: true,
}
msg, err := protocol.NewMessage(protocol.MsgTypePluginConfigUpdate, req)
if err != nil {
return err
}
if err := protocol.WriteMessage(stream, msg); err != nil {
return err
}
// 等待响应
resp, err := protocol.ReadMessage(stream)
if err != nil {
return err
}
var result struct {
Success bool `json:"success"`
Error string `json:"error,omitempty"`
}
if err := resp.ParsePayload(&result); err != nil {
return err
}
if !result.Success {
return fmt.Errorf("restart failed: %s", result.Error)
}
log.Printf("[Server] JS plugin %s restarted on client", pluginName)
return nil
} }
// UpdateClientPluginConfig 更新客户端插件配置 // UpdateClientPluginConfig 更新客户端插件配置