server_linux.go 1.9 KB

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