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 }