github.com/codemac/docker@v1.2.1-0.20150518222241-6a18412d5b9c/api/server/server_linux.go (about)

     1  // +build linux
     2  
     3  package server
     4  
     5  import (
     6  	"fmt"
     7  	"net"
     8  	"net/http"
     9  
    10  	"github.com/Sirupsen/logrus"
    11  	"github.com/docker/docker/daemon"
    12  	"github.com/docker/docker/pkg/systemd"
    13  )
    14  
    15  // newServer sets up the required serverCloser and does protocol specific checking.
    16  func (s *Server) newServer(proto, addr string) (serverCloser, error) {
    17  	var (
    18  		err error
    19  		l   net.Listener
    20  	)
    21  	switch proto {
    22  	case "fd":
    23  		ls, err := systemd.ListenFD(addr)
    24  		if err != nil {
    25  			return nil, err
    26  		}
    27  		chErrors := make(chan error, len(ls))
    28  		// We don't want to start serving on these sockets until the
    29  		// daemon is initialized and installed. Otherwise required handlers
    30  		// won't be ready.
    31  		<-s.start
    32  		// Since ListenFD will return one or more sockets we have
    33  		// to create a go func to spawn off multiple serves
    34  		for i := range ls {
    35  			listener := ls[i]
    36  			go func() {
    37  				httpSrv := http.Server{Handler: s.router}
    38  				chErrors <- httpSrv.Serve(listener)
    39  			}()
    40  		}
    41  		for i := 0; i < len(ls); i++ {
    42  			if err := <-chErrors; err != nil {
    43  				return nil, err
    44  			}
    45  		}
    46  		return nil, nil
    47  	case "tcp":
    48  		if !s.cfg.TlsVerify {
    49  			logrus.Warn("/!\\ DON'T BIND ON ANY IP ADDRESS WITHOUT setting -tlsverify IF YOU DON'T KNOW WHAT YOU'RE DOING /!\\")
    50  		}
    51  		if l, err = NewTcpSocket(addr, tlsConfigFromServerConfig(s.cfg), s.start); err != nil {
    52  			return nil, err
    53  		}
    54  		if err := allocateDaemonPort(addr); err != nil {
    55  			return nil, err
    56  		}
    57  	case "unix":
    58  		if l, err = NewUnixSocket(addr, s.cfg.SocketGroup, s.start); err != nil {
    59  			return nil, err
    60  		}
    61  	default:
    62  		return nil, fmt.Errorf("Invalid protocol format: %q", proto)
    63  	}
    64  	return &HttpServer{
    65  		&http.Server{
    66  			Addr:    addr,
    67  			Handler: s.router,
    68  		},
    69  		l,
    70  	}, nil
    71  }
    72  
    73  func (s *Server) AcceptConnections(d *daemon.Daemon) {
    74  	// Tell the init daemon we are accepting requests
    75  	s.daemon = d
    76  	go systemd.SdNotify("READY=1")
    77  	// close the lock so the listeners start accepting connections
    78  	select {
    79  	case <-s.start:
    80  	default:
    81  		close(s.start)
    82  	}
    83  }