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  }