62 lines
1.3 KiB
Go
62 lines
1.3 KiB
Go
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()
|
||
}
|