ok-1
This commit is contained in:
61
internal/template/engine.go
Normal file
61
internal/template/engine.go
Normal file
@@ -0,0 +1,61 @@
|
||||
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()
|
||||
}
|
||||
Reference in New Issue
Block a user