github.com/tsuna/docker@v1.7.0-rc3/api/server/server_linux.go (about)

     1  // +build linux
     2  
     3  package server
     4  
     5  import (
     6  	"fmt"
     7  	"net"
     8  	"net/http"
     9  	"strconv"
    10  
    11  	"github.com/docker/docker/daemon"
    12  	"github.com/docker/docker/pkg/sockets"
    13  	"github.com/docker/docker/pkg/systemd"
    14  	"github.com/docker/libnetwork/portallocator"
    15  )
    16  
    17  // newServer sets up the required serverClosers and does protocol specific checking.
    18  func (s *Server) newServer(proto, addr string) ([]serverCloser, error) {
    19  	var (
    20  		err error
    21  		ls  []net.Listener
    22  	)
    23  	switch proto {
    24  	case "fd":
    25  		ls, err = systemd.ListenFD(addr)
    26  		if err != nil {
    27  			return nil, err
    28  		}
    29  		// We don't want to start serving on these sockets until the
    30  		// daemon is initialized and installed. Otherwise required handlers
    31  		// won't be ready.
    32  		<-s.start
    33  	case "tcp":
    34  		l, err := s.initTcpSocket(addr)
    35  		if err != nil {
    36  			return nil, err
    37  		}
    38  		ls = append(ls, l)
    39  	case "unix":
    40  		l, err := sockets.NewUnixSocket(addr, s.cfg.SocketGroup, s.start)
    41  		if err != nil {
    42  			return nil, err
    43  		}
    44  		ls = append(ls, l)
    45  	default:
    46  		return nil, fmt.Errorf("Invalid protocol format: %q", proto)
    47  	}
    48  	var res []serverCloser
    49  	for _, l := range ls {
    50  		res = append(res, &HttpServer{
    51  			&http.Server{
    52  				Addr:    addr,
    53  				Handler: s.router,
    54  			},
    55  			l,
    56  		})
    57  	}
    58  	return res, nil
    59  }
    60  
    61  func (s *Server) AcceptConnections(d *daemon.Daemon) {
    62  	// Tell the init daemon we are accepting requests
    63  	s.daemon = d
    64  	go systemd.SdNotify("READY=1")
    65  	// close the lock so the listeners start accepting connections
    66  	select {
    67  	case <-s.start:
    68  	default:
    69  		close(s.start)
    70  	}
    71  }
    72  
    73  func allocateDaemonPort(addr string) error {
    74  	host, port, err := net.SplitHostPort(addr)
    75  	if err != nil {
    76  		return err
    77  	}
    78  
    79  	intPort, err := strconv.Atoi(port)
    80  	if err != nil {
    81  		return err
    82  	}
    83  
    84  	var hostIPs []net.IP
    85  	if parsedIP := net.ParseIP(host); parsedIP != nil {
    86  		hostIPs = append(hostIPs, parsedIP)
    87  	} else if hostIPs, err = net.LookupIP(host); err != nil {
    88  		return fmt.Errorf("failed to lookup %s address in host specification", host)
    89  	}
    90  
    91  	pa := portallocator.Get()
    92  	for _, hostIP := range hostIPs {
    93  		if _, err := pa.RequestPort(hostIP, "tcp", intPort); err != nil {
    94  			return fmt.Errorf("failed to allocate daemon listening port %d (err: %v)", intPort, err)
    95  		}
    96  	}
    97  	return nil
    98  }