-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathmain.go
123 lines (95 loc) · 2.59 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package main
import (
"context"
"encoding/json"
"flag"
"log"
"net"
"os"
"os/signal"
"github.com/loopholelabs/drafter/pkg/forwarder"
"github.com/loopholelabs/goroutine-manager/pkg/manager"
)
func main() {
rawHostVethCIDR := flag.String("host-veth-cidr", "10.0.8.0/22", "CIDR for the veths outside the namespace")
defaultPortForwards, err := json.Marshal([]forwarder.PortForward{
{
Netns: "ark0",
InternalPort: "6379",
Protocol: "tcp",
ExternalAddr: "127.0.0.1:3333",
},
})
if err != nil {
panic(err)
}
rawPortForwards := flag.String("port-forwards", string(defaultPortForwards), "Port forwards configuration (wildcard IPs like 0.0.0.0 are not valid, be explicit)")
flag.Parse()
var portForwards []forwarder.PortForward
if err := json.Unmarshal([]byte(*rawPortForwards), &portForwards); err != nil {
panic(err)
}
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
var errs error
defer func() {
if errs != nil {
panic(errs)
}
}()
goroutineManager := manager.NewGoroutineManager(
ctx,
&errs,
manager.GoroutineManagerHooks{},
)
defer goroutineManager.Wait()
defer goroutineManager.StopAllGoroutines()
defer goroutineManager.CreateBackgroundPanicCollector()()
go func() {
done := make(chan os.Signal, 1)
signal.Notify(done, os.Interrupt)
<-done
log.Println("Exiting gracefully")
cancel()
}()
_, hostVethCIDR, err := net.ParseCIDR(*rawHostVethCIDR)
if err != nil {
panic(err)
}
forwardedPorts, err := forwarder.ForwardPorts(
goroutineManager.Context(),
hostVethCIDR,
portForwards,
forwarder.PortForwardHooks{
OnAfterPortForward: func(portID int, netns, internalIP, internalPort, externalIP, externalPort, protocol string) {
log.Printf("Forwarding port with ID %v from %v:%v/%v in network namespace %v to %v:%v/%v", portID, internalIP, internalPort, protocol, netns, externalIP, externalPort, protocol)
},
OnBeforePortUnforward: func(portID int) {
log.Println("Unforwarding port with ID", portID)
},
},
)
defer func() {
defer goroutineManager.CreateForegroundPanicCollector()()
if err := forwardedPorts.Wait(); err != nil {
panic(err)
}
}()
if err != nil {
panic(err)
}
defer func() {
defer goroutineManager.CreateForegroundPanicCollector()()
if err := forwardedPorts.Close(); err != nil {
panic(err)
}
}()
goroutineManager.StartForegroundGoroutine(func(_ context.Context) {
if err := forwardedPorts.Wait(); err != nil {
panic(err)
}
})
log.Println("Forwarded all configured ports")
<-goroutineManager.Context().Done()
log.Println("Shutting down")
}