// Start the daemon func Start(sockFile string, c *cli.Context) error { var err error if err = daemonEnvironmentSetup(c); err != nil { return err } defer environmentCleanup() root := c.String("root") s := &daemon{ ConvoyDrivers: make(map[string]convoydriver.ConvoyDriver), } config := &daemonConfig{ Root: root, } exists, err := util.ObjectExists(config) if err != nil { return err } if exists { log.Debug("Found existing config. Ignoring command line opts, loading config from ", root) if err := util.ObjectLoad(config); err != nil { return err } } else { fd := c.String("mnt-ns") if fd != "" { if _, err := os.Stat(fd); err != nil { return fmt.Errorf("Cannot find mount namespace fd %v", fd) } config.MountNamespaceFD = fd } driverList := c.StringSlice("drivers") if len(driverList) == 0 { return fmt.Errorf("Missing or invalid parameters") } log.Debug("Creating config at ", root) config.DriverList = driverList config.DefaultDriver = driverList[0] } s.daemonConfig = *config if err := util.InitMountNamespace(s.MountNamespaceFD); err != nil { return err } // driverOpts would be ignored by Convoy Drivers if config already exists driverOpts := util.SliceToMap(c.StringSlice("driver-opts")) if err := s.initDrivers(driverOpts); err != nil { return err } if err := s.finializeInitialization(); err != nil { return err } if err := util.ObjectSave(config); err != nil { return err } s.Router = createRouter(s) if err := util.MkdirIfNotExists(filepath.Dir(sockFile)); err != nil { return err } // This should be safe because lock file prevent starting daemon twice if _, err := os.Stat(sockFile); err == nil { log.Warnf("Remove previous sockfile at %v", sockFile) if err := os.Remove(sockFile); err != nil { return err } } l, err := net.Listen("unix", sockFile) if err != nil { fmt.Println("listen err", err) return err } defer l.Close() sigs := make(chan os.Signal, 1) done := make(chan bool, 1) signal.Notify(sigs, os.Interrupt, os.Kill, syscall.SIGTERM) go func() { sig := <-sigs fmt.Printf("Caught signal %s: shutting down.\n", sig) done <- true }() go func() { err = http.Serve(l, s.Router) if err != nil { log.Error("http server error", err.Error()) } done <- true }() <-done return nil }
// Start the daemon func Start(sockFile string, c *cli.Context) error { var err error if err = daemonEnvironmentSetup(c); err != nil { return err } defer environmentCleanup() root := c.String("root") s := &daemon{ ConvoyDrivers: make(map[string]convoydriver.ConvoyDriver), } config := &daemonConfig{ Root: root, } exists, err := util.ObjectExists(config) if err != nil { return err } driverOpts := util.SliceToMap(c.StringSlice("driver-opts")) if exists { log.Debug("Found existing config. Ignoring command line opts, loading config from ", root) if err := util.ObjectLoad(config); err != nil { return err } } else { driverList := c.StringSlice("drivers") if len(driverList) == 0 || driverOpts == nil { return fmt.Errorf("Missing or invalid parameters") } log.Debug("Creating config at ", root) config.DriverList = driverList config.DefaultDriver = driverList[0] } s.daemonConfig = *config if err := s.initDrivers(driverOpts); err != nil { return err } if err := s.finializeInitialization(); err != nil { return err } if err := util.ObjectSave(config); err != nil { return err } s.Router = createRouter(s) if err := util.MkdirIfNotExists(filepath.Dir(sockFile)); err != nil { return err } l, err := net.Listen("unix", sockFile) if err != nil { fmt.Println("listen err", err) return err } defer l.Close() sigs := make(chan os.Signal, 1) done := make(chan bool, 1) signal.Notify(sigs, os.Interrupt, os.Kill, syscall.SIGTERM) go func() { sig := <-sigs fmt.Printf("Caught signal %s: shutting down.\n", sig) done <- true }() go func() { err = http.Serve(l, s.Router) if err != nil { log.Error("http server error", err.Error()) } done <- true }() <-done return nil }