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  }