96 lines
1.9 KiB
Go
96 lines
1.9 KiB
Go
package pluginheart
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"log/slog"
|
|
"net/http"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
type Engine struct {
|
|
api string
|
|
cli *http.Client
|
|
name string
|
|
}
|
|
|
|
func NewEngine(name, api string) *Engine {
|
|
e := Engine{
|
|
api: api,
|
|
name: name,
|
|
cli: &http.Client{
|
|
Timeout: 5 * time.Second,
|
|
},
|
|
}
|
|
return &e
|
|
}
|
|
|
|
func (e *Engine) AutoHeart(in HeartInput, isService bool) {
|
|
ticker := time.NewTicker(5 * time.Second)
|
|
defer ticker.Stop()
|
|
|
|
maxFaildCount := 3
|
|
if isService {
|
|
maxFaildCount = 17280
|
|
}
|
|
|
|
var faildCount int
|
|
for {
|
|
if faildCount > maxFaildCount {
|
|
fmt.Println("heart failed")
|
|
os.Exit(0)
|
|
}
|
|
|
|
resp, err := e.Heart(in)
|
|
<-ticker.C
|
|
|
|
if err != nil {
|
|
slog.Error("heart failed", "error", err)
|
|
e.api = strings.ReplaceAll(e.api, "127.0.0.1", "localhost")
|
|
faildCount++
|
|
continue
|
|
}
|
|
body, _ := io.ReadAll(resp.Body)
|
|
resp.Body.Close()
|
|
if resp.StatusCode != 200 {
|
|
slog.Error("heart failed", "error", resp.StatusCode, "body", string(body))
|
|
faildCount++
|
|
continue
|
|
}
|
|
faildCount = 0
|
|
}
|
|
}
|
|
|
|
func (e *Engine) Heart(in HeartInput) (*http.Response, error) {
|
|
in.PID = os.Getpid()
|
|
b, _ := json.Marshal(in)
|
|
const path = `/extensions/heartbeat`
|
|
|
|
req, _ := http.NewRequest(http.MethodPost, e.api+path, bytes.NewReader(b))
|
|
SetExtensionName(req, e.name)
|
|
return e.cli.Do(req)
|
|
}
|
|
|
|
func (e *Engine) Console(in ConsoleInput) (*http.Response, error) {
|
|
b, _ := json.Marshal(in)
|
|
const path = `/extensions/console`
|
|
|
|
req, _ := http.NewRequest(http.MethodPost, e.api+path, bytes.NewReader(b))
|
|
SetExtensionName(req, e.name)
|
|
return e.cli.Do(req)
|
|
}
|
|
|
|
// GetExtensionName 获取扩展名称
|
|
func GetExtensionName(req *http.Request) string {
|
|
return req.Header.Get("X-Extension-Name")
|
|
}
|
|
|
|
func SetExtensionName(req *http.Request, name string) {
|
|
req.Header.Set("Content-Type", "application/json")
|
|
req.Header.Set("X-Extension-Name", name)
|
|
}
|