github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/libnetwork/cmd/proxy/main.go (about) 1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "log" 7 "net" 8 "os" 9 "os/signal" 10 "syscall" 11 12 "github.com/ishidawataru/sctp" 13 ) 14 15 func main() { 16 f := os.NewFile(3, "signal-parent") 17 host, container := parseHostContainerAddrs() 18 19 p, err := NewProxy(host, container) 20 if err != nil { 21 fmt.Fprintf(f, "1\n%s", err) 22 f.Close() 23 os.Exit(1) 24 } 25 go handleStopSignals(p) 26 fmt.Fprint(f, "0\n") 27 f.Close() 28 29 // Run will block until the proxy stops 30 p.Run() 31 } 32 33 // parseHostContainerAddrs parses the flags passed on reexec to create the TCP/UDP/SCTP 34 // net.Addrs to map the host and container ports 35 func parseHostContainerAddrs() (host net.Addr, container net.Addr) { 36 var ( 37 proto = flag.String("proto", "tcp", "proxy protocol") 38 hostIP = flag.String("host-ip", "", "host ip") 39 hostPort = flag.Int("host-port", -1, "host port") 40 containerIP = flag.String("container-ip", "", "container ip") 41 containerPort = flag.Int("container-port", -1, "container port") 42 ) 43 44 flag.Parse() 45 46 switch *proto { 47 case "tcp": 48 host = &net.TCPAddr{IP: net.ParseIP(*hostIP), Port: *hostPort} 49 container = &net.TCPAddr{IP: net.ParseIP(*containerIP), Port: *containerPort} 50 case "udp": 51 host = &net.UDPAddr{IP: net.ParseIP(*hostIP), Port: *hostPort} 52 container = &net.UDPAddr{IP: net.ParseIP(*containerIP), Port: *containerPort} 53 case "sctp": 54 host = &sctp.SCTPAddr{IPAddrs: []net.IPAddr{{IP: net.ParseIP(*hostIP)}}, Port: *hostPort} 55 container = &sctp.SCTPAddr{IPAddrs: []net.IPAddr{{IP: net.ParseIP(*containerIP)}}, Port: *containerPort} 56 default: 57 log.Fatalf("unsupported protocol %s", *proto) 58 } 59 60 return host, container 61 } 62 63 func handleStopSignals(p Proxy) { 64 s := make(chan os.Signal, 10) 65 signal.Notify(s, os.Interrupt, syscall.SIGTERM) 66 67 for range s { 68 p.Close() 69 70 os.Exit(0) 71 } 72 }