github.com/zhuohuang-hust/src-cbuild@v0.0.0-20230105071821-c7aab3e7c840/mergeCode/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 13 func main() { 14 f := os.NewFile(3, "signal-parent") 15 host, container := parseHostContainerAddrs() 16 17 p, err := NewProxy(host, container) 18 if err != nil { 19 fmt.Fprintf(f, "1\n%s", err) 20 f.Close() 21 os.Exit(1) 22 } 23 go handleStopSignals(p) 24 fmt.Fprint(f, "0\n") 25 f.Close() 26 27 // Run will block until the proxy stops 28 p.Run() 29 } 30 31 // parseHostContainerAddrs parses the flags passed on reexec to create the TCP or UDP 32 // net.Addrs to map the host and container ports 33 func parseHostContainerAddrs() (host net.Addr, container net.Addr) { 34 var ( 35 proto = flag.String("proto", "tcp", "proxy protocol") 36 hostIP = flag.String("host-ip", "", "host ip") 37 hostPort = flag.Int("host-port", -1, "host port") 38 containerIP = flag.String("container-ip", "", "container ip") 39 containerPort = flag.Int("container-port", -1, "container port") 40 ) 41 42 flag.Parse() 43 44 switch *proto { 45 case "tcp": 46 host = &net.TCPAddr{IP: net.ParseIP(*hostIP), Port: *hostPort} 47 container = &net.TCPAddr{IP: net.ParseIP(*containerIP), Port: *containerPort} 48 case "udp": 49 host = &net.UDPAddr{IP: net.ParseIP(*hostIP), Port: *hostPort} 50 container = &net.UDPAddr{IP: net.ParseIP(*containerIP), Port: *containerPort} 51 default: 52 log.Fatalf("unsupported protocol %s", *proto) 53 } 54 55 return host, container 56 } 57 58 func handleStopSignals(p Proxy) { 59 s := make(chan os.Signal, 10) 60 signal.Notify(s, os.Interrupt, syscall.SIGTERM) 61 62 for range s { 63 p.Close() 64 65 os.Exit(0) 66 } 67 }