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
}