github.com/moby/docker@v26.1.3+incompatible/libnetwork/cmd/networkdb-test/dbserver/ndbServer.go (about) 1 package dbserver 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "net" 8 "net/http" 9 "os" 10 "strconv" 11 12 "github.com/containerd/log" 13 "github.com/docker/docker/libnetwork/cmd/networkdb-test/dummyclient" 14 "github.com/docker/docker/libnetwork/diagnostic" 15 "github.com/docker/docker/libnetwork/networkdb" 16 ) 17 18 var ( 19 nDB *networkdb.NetworkDB 20 server *diagnostic.Server 21 ipAddr string 22 ) 23 24 func ipaddress(w http.ResponseWriter, r *http.Request) { 25 fmt.Fprintf(w, "%s\n", ipAddr) 26 } 27 28 // Server starts the server 29 func Server(args []string) { 30 log.G(context.TODO()).Infof("[SERVER] Starting with arguments %v", args) 31 if len(args) < 1 { 32 log.G(context.TODO()).Fatal("Port number is a mandatory argument, aborting...") 33 } 34 port, _ := strconv.Atoi(args[0]) 35 var localNodeName string 36 var ok bool 37 if localNodeName, ok = os.LookupEnv("TASK_ID"); !ok { 38 log.G(context.TODO()).Fatal("TASK_ID environment variable not set, aborting...") 39 } 40 log.G(context.TODO()).Infof("[SERVER] Starting node %s on port %d", localNodeName, port) 41 42 ip, err := getIPInterface("eth0") 43 if err != nil { 44 log.G(context.TODO()).Errorf("%s There was a problem with the IP %s\n", localNodeName, err) 45 return 46 } 47 ipAddr = ip 48 log.G(context.TODO()).Infof("%s uses IP %s\n", localNodeName, ipAddr) 49 50 server = diagnostic.New() 51 conf := networkdb.DefaultConfig() 52 conf.Hostname = localNodeName 53 conf.AdvertiseAddr = ipAddr 54 conf.BindAddr = ipAddr 55 nDB, err = networkdb.New(conf) 56 if err != nil { 57 log.G(context.TODO()).Infof("%s error in the DB init %s\n", localNodeName, err) 58 return 59 } 60 61 // Register network db handlers 62 nDB.RegisterDiagnosticHandlers(server) 63 server.HandleFunc("/myip", ipaddress) 64 dummyclient.RegisterDiagnosticHandlers(server, nDB) 65 server.EnableDiagnostic("", port) 66 // block here 67 select {} 68 } 69 70 func getIPInterface(name string) (string, error) { 71 ifaces, err := net.Interfaces() 72 if err != nil { 73 return "", err 74 } 75 for _, iface := range ifaces { 76 if iface.Name != name { 77 continue // not the name specified 78 } 79 80 if iface.Flags&net.FlagUp == 0 { 81 return "", errors.New("Interfaces is down") 82 } 83 84 addrs, err := iface.Addrs() 85 if err != nil { 86 return "", err 87 } 88 for _, addr := range addrs { 89 var ip net.IP 90 switch v := addr.(type) { 91 case *net.IPNet: 92 ip = v.IP 93 case *net.IPAddr: 94 ip = v.IP 95 } 96 if ip == nil || ip.IsLoopback() { 97 continue 98 } 99 ip = ip.To4() 100 if ip == nil { 101 continue 102 } 103 return ip.String(), nil 104 } 105 return "", errors.New("Interfaces does not have a valid IPv4") 106 } 107 return "", errors.New("Interface not found") 108 }