diff --git a/pkg/buildah/create.go b/pkg/buildah/create.go index 85907eb0b17..d07c2a6d68b 100644 --- a/pkg/buildah/create.go +++ b/pkg/buildah/create.go @@ -20,6 +20,8 @@ import ( "os" "os/exec" + stringsutil "github.com/labring/sealos/pkg/utils/strings" + "github.com/containers/buildah/pkg/parse" "github.com/containers/storage/pkg/unshare" "github.com/labring/sreg/pkg/utils/file" @@ -76,11 +78,6 @@ func newCreateCmd() *cobra.Command { if err != nil { return err } - if !opts.short { - logger.Info("Mount point: %s", info.MountPoint) - } else { - fmt.Println(info.MountPoint) - } if len(opts.env) > 0 { if err := runRender([]string{info.MountPoint}, opts.env); err != nil { @@ -88,6 +85,12 @@ func newCreateCmd() *cobra.Command { } } + if !opts.short { + logger.Info("Mount point: %s", info.MountPoint) + } else { + fmt.Println(info.MountPoint) + } + if !unshare.IsRootless() { return nil } @@ -131,7 +134,7 @@ func runRender(mountPoints []string, env []string) error { logger.Debug("MountPoint %s does not exist, skipping", mp) return nil } - return RenderTemplatesWithEnv(mp, envs) + return stringsutil.RenderTemplatesWithEnv(mp, envs) }) } diff --git a/pkg/buildah/util.go b/pkg/buildah/util.go index b077ea65eea..2832e74376f 100644 --- a/pkg/buildah/util.go +++ b/pkg/buildah/util.go @@ -15,23 +15,11 @@ package buildah import ( - "errors" - "fmt" - "os" - "path/filepath" - "strings" - "github.com/containers/common/libimage" - "github.com/labring/sealos/pkg/constants" - "github.com/labring/sealos/pkg/template" - "github.com/labring/sealos/pkg/utils/logger" - "github.com/labring/sealos/pkg/utils/file" ) -const templateSuffix = ".tmpl" - func PreloadIfTarFile(images []string, transport string) ([]string, error) { r, err := getRuntime(nil) if err != nil { @@ -52,64 +40,3 @@ func PreloadIfTarFile(images []string, transport string) ([]string, error) { } return ret, nil } - -func RenderTemplatesWithEnv(filePaths string, envs map[string]string) error { - var ( - renderEtc = filepath.Join(filePaths, constants.EtcDirName) - renderScripts = filepath.Join(filePaths, constants.ScriptsDirName) - renderManifests = filepath.Join(filePaths, constants.ManifestsDirName) - ) - - for _, dir := range []string{renderEtc, renderScripts, renderManifests} { - logger.Debug("render env dir: %s", dir) - if !file.IsExist(dir) { - logger.Debug("Directory %s does not exist, skipping", dir) - continue - } - - if err := filepath.Walk(dir, func(path string, info os.FileInfo, errIn error) error { - if errIn != nil { - return errIn - } - if info.IsDir() || !strings.HasSuffix(info.Name(), templateSuffix) { - return nil - } - - fileName := strings.TrimSuffix(path, templateSuffix) - if file.IsExist(fileName) { - if err := os.Remove(fileName); err != nil { - logger.Warn("failed to remove existing file [%s]: %v", fileName, err) - } - } - - writer, err := os.OpenFile(fileName, os.O_CREATE|os.O_RDWR, os.ModePerm) - if err != nil { - return fmt.Errorf("failed to open file [%s] for rendering: %v", path, err) - } - defer writer.Close() - - body, err := file.ReadAll(path) - if err != nil { - return err - } - - t, isOk, err := template.TryParse(string(body)) - if isOk { - if err != nil { - return fmt.Errorf("failed to create template: %s %v", path, err) - } - if err := t.Execute(writer, envs); err != nil { - return fmt.Errorf("failed to render env template: %s %v", path, err) - } - } else { - return errors.New("parse template failed") - } - - return nil - }); err != nil { - return fmt.Errorf("failed to render templates in directory %s: %v", dir, err) - } - } - - return nil -} diff --git a/pkg/constants/consts.go b/pkg/constants/consts.go index e4d8446142d..756daa5dd33 100644 --- a/pkg/constants/consts.go +++ b/pkg/constants/consts.go @@ -18,6 +18,8 @@ const ( DefaultClusterFileName = "Clusterfile" ) +const TemplateSuffix = ".tmpl" + const ( LvsCareStaticPodName = "kube-sealos-lvscare" YamlFileSuffix = "yaml" diff --git a/pkg/env/env.go b/pkg/env/env.go index 21cb2e5dac6..02969056068 100644 --- a/pkg/env/env.go +++ b/pkg/env/env.go @@ -16,16 +16,10 @@ package env // nosemgrep: go.lang.security.audit.xss.import-text-template.import-text-template import ( - "errors" - "fmt" - "os" - "path/filepath" "strings" "sync" - "github.com/labring/sealos/pkg/template" "github.com/labring/sealos/pkg/types/v1beta1" - fileutil "github.com/labring/sealos/pkg/utils/file" "github.com/labring/sealos/pkg/utils/logger" "github.com/labring/sealos/pkg/utils/maps" stringsutil "github.com/labring/sealos/pkg/utils/strings" @@ -73,47 +67,11 @@ func (p *processor) WrapShell(host, shell string) string { } func (p *processor) RenderAll(host, dir string, envs map[string]string) error { - return filepath.Walk(dir, func(path string, info os.FileInfo, errIn error) error { - if errIn != nil { - return errIn - } - if info.IsDir() || !strings.HasSuffix(info.Name(), templateSuffix) { - return nil - } - fileName := strings.TrimSuffix(path, templateSuffix) - if fileutil.IsExist(fileName) { - if err := os.Remove(fileName); err != nil { - logger.Warn(err) - } - } - - writer, err := os.OpenFile(fileName, os.O_CREATE|os.O_RDWR, os.ModePerm) - if err != nil { - return fmt.Errorf("failed to open file [%s] when render env: %v", path, err) - } - - defer writer.Close() - body, err := fileutil.ReadAll(path) - if err != nil { - return err - } - - t, isOk, err := template.TryParse(string(body)) - if isOk { - if err != nil { - return fmt.Errorf("failed to create template: %s %v", path, err) - } - if host != "" { - data := maps.Merge(envs, p.getHostEnvInCache(host)) - if err := t.Execute(writer, data); err != nil { - return fmt.Errorf("failed to render env template: %s %v", path, err) - } - } - } else { - return errors.New("parse template failed") - } - return nil - }) + data := envs + if host != "" { + data = maps.Merge(envs, p.getHostEnvInCache(host)) + } + return stringsutil.RenderTemplatesWithEnv(dir, data) } func (p *processor) getHostEnvInCache(hostIP string) map[string]string { diff --git a/pkg/filesystem/rootfs/rootfs_default.go b/pkg/filesystem/rootfs/rootfs_default.go index 024d79eaa63..6e74039981c 100644 --- a/pkg/filesystem/rootfs/rootfs_default.go +++ b/pkg/filesystem/rootfs/rootfs_default.go @@ -193,23 +193,8 @@ func (f *defaultRootfs) unmountRootfs(cluster *v2.Cluster, ipList []string) erro } func renderTemplatesWithEnv(mountDir string, ipList []string, p env.Interface, envs map[string]string) error { - var ( - renderEtc = filepath.Join(mountDir, constants.EtcDirName) - renderScripts = filepath.Join(mountDir, constants.ScriptsDirName) - renderManifests = filepath.Join(mountDir, constants.ManifestsDirName) - ) - // currently only render once - for _, dir := range []string{renderEtc, renderScripts, renderManifests} { - logger.Debug("render env dir: %s", dir) - if file.IsExist(dir) { - err := p.RenderAll(ipList[0], dir, envs) - if err != nil { - return err - } - } - } - return nil + return p.RenderAll(ipList[0], mountDir, envs) } func newDefaultRootfs(mounts []v2.MountImage) (filesystem.Mounter, error) { diff --git a/pkg/utils/strings/strings.go b/pkg/utils/strings/strings.go index 3f62e4c7c43..6615619d272 100644 --- a/pkg/utils/strings/strings.go +++ b/pkg/utils/strings/strings.go @@ -17,11 +17,18 @@ limitations under the License. package strings import ( + "errors" "fmt" + "os" + "path/filepath" "regexp" "strings" "unicode" + "github.com/labring/sealos/pkg/constants" + "github.com/labring/sealos/pkg/template" + "github.com/labring/sealos/pkg/utils/file" + "golang.org/x/exp/slices" "github.com/labring/sealos/pkg/utils/logger" @@ -158,6 +165,67 @@ func RenderTextWithEnv(text string, envs map[string]string) string { return text } +func RenderTemplatesWithEnv(filePaths string, envs map[string]string) error { + var ( + renderEtc = filepath.Join(filePaths, constants.EtcDirName) + renderScripts = filepath.Join(filePaths, constants.ScriptsDirName) + renderManifests = filepath.Join(filePaths, constants.ManifestsDirName) + ) + + for _, dir := range []string{renderEtc, renderScripts, renderManifests} { + logger.Debug("render env dir: %s", dir) + if !file.IsExist(dir) { + logger.Debug("Directory %s does not exist, skipping", dir) + continue + } + + if err := filepath.Walk(dir, func(path string, info os.FileInfo, errIn error) error { + if errIn != nil { + return errIn + } + if info.IsDir() || !strings.HasSuffix(info.Name(), constants.TemplateSuffix) { + return nil + } + + fileName := strings.TrimSuffix(path, constants.TemplateSuffix) + if file.IsExist(fileName) { + if err := os.Remove(fileName); err != nil { + logger.Warn("failed to remove existing file [%s]: %v", fileName, err) + } + } + + writer, err := os.OpenFile(fileName, os.O_CREATE|os.O_RDWR, os.ModePerm) + if err != nil { + return fmt.Errorf("failed to open file [%s] for rendering: %v", path, err) + } + defer writer.Close() + + body, err := file.ReadAll(path) + if err != nil { + return err + } + + t, isOk, err := template.TryParse(string(body)) + if isOk { + if err != nil { + return fmt.Errorf("failed to create template: %s %v", path, err) + } + if err := t.Execute(writer, envs); err != nil { + return fmt.Errorf("failed to render env template: %s %v", path, err) + } + } else { + return errors.New("parse template failed") + } + + return nil + }); err != nil { + return fmt.Errorf("failed to render templates in directory %s: %v", dir, err) + } + } + + return nil +} + func TrimQuotes(s string) string { if len(s) >= 2 { if c := s[len(s)-1]; s[0] == c && (c == '"' || c == '\'') {