func()

in pkg/mesh/envoy.go [67:121]


func (kr *KRun) StartEnvoy() error {
	if os.Getuid() != 0 {
		return errors.New("td only supports running as root")
	}

	// Prepare envoy bootstrap
	if err := kr.PrepareTrafficDirectorBootstrap(
		fmt.Sprintf("%s/bootstrap_template.yaml", kr.TdSidecarEnv.PackageDirectory),
		fmt.Sprintf("%s/bootstrap.yaml", kr.TdSidecarEnv.PackageDirectory)); err != nil {
		return err
	}
	log.Println("TD bootstrap ready")
	os.MkdirAll(kr.TdSidecarEnv.LogDirectory, 0666)
	os.Chown(kr.TdSidecarEnv.LogDirectory, envoyUID, envoyGID)

	cmd := kr.envoyCommand()

	cmd.SysProcAttr = &syscall.SysProcAttr{}
	cmd.SysProcAttr.Credential = &syscall.Credential{
		Uid: envoyUID,
		Gid: envoyGID,
	}

	var stdout io.ReadCloser
	pty, tty, err := pty.Open()
	if err != nil {
		log.Println("Error opening pty: ", err)
		stdout, _ = cmd.StdoutPipe()
		os.Stdout.Chown(envoyUID, envoyGID)
	} else {
		cmd.Stdout = tty
		if err = tty.Chown(envoyUID, envoyGID); err != nil {
			log.Println("Error chown: ", err)
		}
		stdout = pty
	}
	cmd.Stderr = os.Stderr

	go func() {
		if err := cmd.Start(); err != nil {
			log.Println("Failed to start: ", cmd, err)
		}
		kr.agentCmd = cmd
		if stdout != nil {
			go func() {
				io.Copy(os.Stdout, stdout)
			}()
		}
		if err := cmd.Wait(); err != nil {
			log.Println("Wait err: ", err)
		}
		kr.Exit(0)
	}()
	return nil
}