From ffcbec4edef88cc64e90980c424af6ac53014235 Mon Sep 17 00:00:00 2001 From: Yuzuki616 Date: Wed, 30 Oct 2024 01:07:17 +0900 Subject: [PATCH] update add hook for handler change map to cmap for Trigger.hashs --- conf/node.go | 8 ++++++++ go.mod | 3 ++- go.sum | 8 ++++---- handler/handler.go | 10 ++++++++++ handler/hook.go | 18 ++++++++++++++++++ handler/node.go | 29 ++++++++++++++++++++++++++++- trigger/handle.go | 6 +++--- trigger/trigger.go | 3 ++- 8 files changed, 75 insertions(+), 10 deletions(-) create mode 100644 handler/hook.go diff --git a/conf/node.go b/conf/node.go index 60b72e0..9560438 100644 --- a/conf/node.go +++ b/conf/node.go @@ -25,6 +25,7 @@ type Options struct { Panel string `json:"Panel"` Acme string `json:"Acme"` Cert Cert `json:"Cert"` + Hook Hook `json:"Hook"` Expand map[string]interface{} `json:"Other"` } @@ -41,6 +42,13 @@ type Cert struct { KeyPath string `json:"Key"` } +type Hook struct { + BeforeAddNode string `json:"BeforeAddNode"` + AfterAddNode string `json:"AfterAddNode"` + BeforeDelNode string `json:"BeforeDelNode"` + AfterDelNode string `json:"AfterDelNode"` +} + type Node struct { Name string `json:"Name"` Remote Remote `json:"-"` diff --git a/go.mod b/go.mod index 1960a4f..f7206d0 100644 --- a/go.mod +++ b/go.mod @@ -5,10 +5,11 @@ go 1.22.0 toolchain go1.23.1 require ( - github.com/Yuzuki616/Ratte-Interface v0.0.0-20240911204230-d6204ff1f3e0 + github.com/Yuzuki616/Ratte-Interface v0.0.0-20241025203935-a64517afc32b github.com/fsnotify/fsnotify v1.7.0 github.com/go-acme/lego/v4 v4.18.0 github.com/goccy/go-json v0.10.3 + github.com/orcaman/concurrent-map/v2 v2.0.1 github.com/robfig/cron/v3 v3.0.1 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.8.0 diff --git a/go.sum b/go.sum index 37352af..102042b 100644 --- a/go.sum +++ b/go.sum @@ -64,10 +64,8 @@ github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXY github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87 h1:xPMsUicZ3iosVPSIP7bW5EcGUzjiiMl1OYTe14y/R24= github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87/go.mod h1:iGLljf5n9GjT6kc0HBvyI1nOKnGQbNB66VzSNbK5iks= -github.com/Yuzuki616/Ratte-Interface v0.0.0-20240911195516-cdd49f9593d6 h1:vHQZO/S9b6idTO9JDY74ISwHgw8NskrXJWe4BOxsppQ= -github.com/Yuzuki616/Ratte-Interface v0.0.0-20240911195516-cdd49f9593d6/go.mod h1:oW6wbZfawdudu9VbTy2YIWoMNpfttYX8qcsM19oXCCI= -github.com/Yuzuki616/Ratte-Interface v0.0.0-20240911204230-d6204ff1f3e0 h1:rsxhN/GRu3BJKsMckQOP3e+oRrRrAwILFtMEoNeQ34A= -github.com/Yuzuki616/Ratte-Interface v0.0.0-20240911204230-d6204ff1f3e0/go.mod h1:oW6wbZfawdudu9VbTy2YIWoMNpfttYX8qcsM19oXCCI= +github.com/Yuzuki616/Ratte-Interface v0.0.0-20241025203935-a64517afc32b h1:ipw6740pMlWCAxhoINURmXw+JwIOI+MhgRVx2eiReas= +github.com/Yuzuki616/Ratte-Interface v0.0.0-20241025203935-a64517afc32b/go.mod h1:oW6wbZfawdudu9VbTy2YIWoMNpfttYX8qcsM19oXCCI= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/akamai/AkamaiOPEN-edgegrid-golang v1.2.2 h1:F1j7z+/DKEsYqZNoxC6wvfmaiDneLsQOFQmuq9NADSY= github.com/akamai/AkamaiOPEN-edgegrid-golang v1.2.2/go.mod h1:QlXr/TrICfQ/ANa76sLeQyhAJyNR9sEcfNuZBkY9jgY= @@ -540,6 +538,8 @@ github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b h1:Ff github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b/go.mod h1:AC62GU6hc0BrNm+9RK9VSiwa/EUe1bkIeFORAMcHvJU= github.com/oracle/oci-go-sdk/v65 v65.63.1 h1:dYL7sk9L1+C9LCmoq+zjPMNteuJJfk54YExq/4pV9xQ= github.com/oracle/oci-go-sdk/v65 v65.63.1/go.mod h1:IBEV9l1qBzUpo7zgGaRUhbB05BVfcDGYRFBCPlTcPp0= +github.com/orcaman/concurrent-map/v2 v2.0.1 h1:jOJ5Pg2w1oeB6PeDurIYf6k9PQ+aTITr/6lP/L/zp6c= +github.com/orcaman/concurrent-map/v2 v2.0.1/go.mod h1:9Eq3TG2oBe5FirmYWQfYO5iH1q0Jv47PLaNK++uCdOM= github.com/ovh/go-ovh v1.5.1 h1:P8O+7H+NQuFK9P/j4sFW5C0fvSS2DnHYGPwdVCp45wI= github.com/ovh/go-ovh v1.5.1/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= diff --git a/handler/handler.go b/handler/handler.go index b3b6e57..e1a2900 100644 --- a/handler/handler.go +++ b/handler/handler.go @@ -42,6 +42,16 @@ func New( func (h *Handler) Close() error { if h.nodeAdded.Load() { + err := h.execHookCmd(h.Hook.BeforeDelNode, h.nodeName) + if err != nil { + h.l.WithError(err).Warn("Exec before del node hook failed") + } + defer func() { + err = h.execHookCmd(h.Hook.AfterDelNode, h.nodeName) + if err != nil { + h.l.WithError(err).Warn("Exec after del node hook failed") + } + }() return h.c.DelNode(h.nodeName) } return nil diff --git a/handler/hook.go b/handler/hook.go new file mode 100644 index 0000000..08d576e --- /dev/null +++ b/handler/hook.go @@ -0,0 +1,18 @@ +package handler + +import ( + "os" + "os/exec" +) + +func (h *Handler) execHookCmd(cmd string, ares ...string) error { + c := exec.Command(cmd, ares...) + c.Stdin = os.Stdin + c.Stdout = os.Stdout + c.Stderr = os.Stderr + err := c.Run() + if err != nil { + return err + } + return nil +} diff --git a/handler/node.go b/handler/node.go index 2bb46d7..4825dd1 100644 --- a/handler/node.go +++ b/handler/node.go @@ -20,11 +20,34 @@ func (h *Handler) PullNodeHandle(n *panel.NodeInfo) error { return fmt.Errorf("create cert error: %w", err) } } - err := h.c.AddNode(&core.AddNodeParams{ + var protocol, port string + switch n.Type { + case "vmess": + protocol = "vmess" + port = n.VMess.Port + case "vless": + protocol = "vless" + port = n.VLess.Port + case "shadowsocks": + protocol = "shadowsocks" + port = n.Shadowsocks.Port + case "trojan": + protocol = "trojana" + port = n.Trojan.Port + case "other": + protocol = "other" + port = n.Other.Port + } + err := h.execHookCmd(h.Hook.BeforeAddNode, h.nodeName, protocol, port) + if err != nil { + h.l.WithError(err).Error("Exec before add node hook failed") + } + err = h.c.AddNode(&core.AddNodeParams{ NodeInfo: core.NodeInfo{ CommonNodeInfo: params.CommonNodeInfo{ Type: n.Type, VMess: n.VMess, + VLess: n.VLess, Shadowsocks: n.Shadowsocks, Trojan: n.Trojan, Hysteria: n.Hysteria, @@ -43,6 +66,10 @@ func (h *Handler) PullNodeHandle(n *panel.NodeInfo) error { if err != nil { return fmt.Errorf("add node error: %w", err) } + err = h.execHookCmd(h.Hook.AfterAddNode, h.nodeName, protocol, port) + if err != nil { + h.l.WithError(err).Warn("Exec after add node hook failed") + } if h.nodeAdded.Load() { h.nodeAdded.Store(true) } diff --git a/trigger/handle.go b/trigger/handle.go index 9126cd9..2fa4fb3 100644 --- a/trigger/handle.go +++ b/trigger/handle.go @@ -17,13 +17,13 @@ func (t *Trigger) addCronHandle(cron any, job cron.FuncJob) (cron.EntryID, error } func (t *Trigger) hashEqualsOrStore(name, hash string) bool { - if h, ok := t.hashs[name]; ok { + if h, ok := t.hashs.Get(name); ok { if h == hash { return true } - t.hashs[name] = hash + t.hashs.Set(name, hash) } else { - t.hashs[name] = hash + t.hashs.Set(name, hash) } return false } diff --git a/trigger/trigger.go b/trigger/trigger.go index 60bd923..43b5b93 100644 --- a/trigger/trigger.go +++ b/trigger/trigger.go @@ -5,6 +5,7 @@ import ( "Ratte/handler" "fmt" "github.com/Yuzuki616/Ratte-Interface/panel" + cmap "github.com/orcaman/concurrent-map/v2" "github.com/robfig/cron/v3" "github.com/sirupsen/logrus" ) @@ -16,7 +17,7 @@ type Trigger struct { p panel.Panel remoteId int remoteC *conf.Remote - hashs map[string]string + hashs cmap.ConcurrentMap[string, string] } func NewTrigger(