package template import ( "bytes" "fmt" "os" "os/exec" "path/filepath" "text/template" "sunhpc/internal/config" "sunhpc/internal/log" ) // RenderAndExecute 从模板目录加载模板,渲染后生成临时脚本并执行 // tmplName: 模板文件名(位于 /etc/sunhpc/tmpl.d/) // data: 模板变量 func RenderAndExecute(tmplName string, data interface{}) error { tmplPath := filepath.Join(config.TmplDir, tmplName) if _, err := os.Stat(tmplPath); err != nil { return fmt.Errorf("模板文件不存在: %s", tmplPath) } content, err := os.ReadFile(tmplPath) if err != nil { return err } t, err := template.New(tmplName).Parse(string(content)) if err != nil { return err } var buf bytes.Buffer if err := t.Execute(&buf, data); err != nil { return err } // 生成临时脚本 tmpFile, err := os.CreateTemp("/tmp", "sunhpc-*.sh") if err != nil { return err } defer os.Remove(tmpFile.Name()) if _, err := tmpFile.Write(buf.Bytes()); err != nil { tmpFile.Close() return err } tmpFile.Close() if err := os.Chmod(tmpFile.Name(), 0755); err != nil { return err } log.Infof("执行模板脚本: %s", tmpFile.Name()) cmd := exec.Command("/bin/bash", tmpFile.Name()) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr return cmd.Run() }