Skip to content

Commit 91193c4

Browse files
committed
Support event hook
1 parent 4df61ca commit 91193c4

File tree

5 files changed

+71
-0
lines changed

5 files changed

+71
-0
lines changed

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,14 @@ Flags:
5858
5959
-u, --disable-upnp Disable UPnP
6060
61+
-x, --event-hook Execute command when event triggered:
62+
escape:
63+
%%: percent sign
64+
%e: Event: connecting fail success disconnected
65+
%m: Error message
66+
%p: Local hole port
67+
%a: Hole addr
68+
6169
-h, --help help for mnh
6270
```
6371

README_zh.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,14 @@ Flags:
5959
6060
-u, --disable-upnp 禁用UPnP
6161
62+
-x, --event-hook 在事件触发后执行命令:
63+
转义符:
64+
%%: 百分号
65+
%e: 事件: connecting fail success disconnected
66+
%m: 错误消息
67+
%p: 本地洞端口
68+
%a: 洞地址
69+
6270
-h, --help 输出本帮助
6371
```
6472

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module github.com/hzyitc/mnh
33
go 1.16
44

55
require (
6+
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
67
github.com/hzyitc/netutils v0.1.0
78
github.com/libp2p/go-reuseport v0.0.2
89
github.com/spf13/cobra v1.1.3

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi
6262
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
6363
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
6464
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
65+
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
66+
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
6567
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
6668
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
6769
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=

main.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package main
22

33
import (
4+
"net"
45
"os"
6+
"os/exec"
57
"os/signal"
8+
"strings"
69
"syscall"
710
"time"
811

12+
"github.com/google/shlex"
913
"github.com/spf13/cobra"
1014

1115
"github.com/hzyitc/mnh/TCPMode"
@@ -47,6 +51,8 @@ var (
4751
service string
4852

4953
upnpD bool
54+
55+
eventHook string
5056
)
5157

5258
func commonCmdRegister(cmd *cobra.Command) {
@@ -58,6 +64,8 @@ func commonCmdRegister(cmd *cobra.Command) {
5864
cmd.PersistentFlags().StringVarP(&service, "service", "t", "127.0.0.1:80", "Target service address. Only need in proxy mode")
5965

6066
cmd.PersistentFlags().BoolVarP(&upnpD, "disable-upnp", "u", false, "Disable UPnP")
67+
68+
cmd.PersistentFlags().StringVarP(&eventHook, "event-hook", "x", "", "Execute command when event triggered")
6169
}
6270

6371
func tcpCmdRegister(cmd *cobra.Command) {
@@ -74,6 +82,34 @@ func udpCmdRegister(cmd *cobra.Command) {
7482
cmd.AddCommand(udpCmd)
7583
}
7684

85+
func runHook(event string, errmsg string, port string, addr string) {
86+
if eventHook == "" {
87+
return
88+
}
89+
90+
cmdline := strings.NewReplacer(
91+
"%%", "%",
92+
"%e", event,
93+
"%m", errmsg,
94+
"%p", port,
95+
"%a", addr,
96+
).Replace(eventHook)
97+
log.Debug("Running hook:", cmdline)
98+
99+
args, err := shlex.Split(cmdline)
100+
if err != nil {
101+
log.Error("Split hook error:", err.Error())
102+
return
103+
}
104+
105+
cmd := exec.Command(args[0], args[1:]...)
106+
err = cmd.Start()
107+
if err != nil {
108+
log.Error("Run hook error:", err.Error())
109+
return
110+
}
111+
}
112+
77113
func main() {
78114
tcpCmdRegister(rootCmd)
79115
udpCmdRegister(rootCmd)
@@ -122,9 +158,12 @@ func tcp() {
122158

123159
for {
124160
func() {
161+
runHook("connecting", "", "", "")
162+
125163
protocol, err := TCPProtocol.NewMnhv1(mode, server, id)
126164
if err != nil {
127165
log.Error("NewMnhv1 error:", err.Error())
166+
runHook("fail", err.Error(), "", "")
128167
return
129168
}
130169
defer protocol.Close()
@@ -136,6 +175,11 @@ func tcp() {
136175

137176
log.Info("\n\nNow you can use " + protocol.RemoteHoleAddr().String() + " to access your service")
138177

178+
_, port, _ := net.SplitHostPort(protocol.LocalHoleAddr().String())
179+
addr := protocol.RemoteHoleAddr().String()
180+
runHook("success", "", port, addr)
181+
defer runHook("disconnected", "", port, addr)
182+
139183
select {
140184
case <-protocol.ClosedChan():
141185
return
@@ -193,9 +237,12 @@ func udp() {
193237

194238
for {
195239
func() {
240+
runHook("connecting", "", "", "")
241+
196242
protocol, err := UDPProtocol.NewMnhv1(mode, server, id)
197243
if err != nil {
198244
log.Error("NewMnhv1 error:", err.Error())
245+
runHook("fail", err.Error(), "", "")
199246
return
200247
}
201248
defer protocol.Close()
@@ -207,6 +254,11 @@ func udp() {
207254

208255
log.Info("\n\nNow you can use " + protocol.RemoteHoleAddr().String() + " to access your service")
209256

257+
_, port, _ := net.SplitHostPort(protocol.LocalHoleAddr().String())
258+
addr := protocol.RemoteHoleAddr().String()
259+
runHook("success", "", port, addr)
260+
defer runHook("disconnected", "", port, addr)
261+
210262
select {
211263
case <-protocol.ClosedChan():
212264
return

0 commit comments

Comments
 (0)