Docker template generator
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

template_generator.go 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package main
  2. import (
  3. "github.com/csmith/dotege/model"
  4. "go.uber.org/zap"
  5. "io/ioutil"
  6. "path"
  7. "sort"
  8. "strings"
  9. "text/template"
  10. )
  11. type Context struct {
  12. Containers map[string]model.Container
  13. Hostnames map[string]*model.Hostname
  14. }
  15. type Template struct {
  16. config model.TemplateConfig
  17. content string
  18. template *template.Template
  19. }
  20. type TemplateGenerator struct {
  21. logger *zap.SugaredLogger
  22. templates []*Template
  23. }
  24. var funcMap = template.FuncMap{
  25. "replace": func(from, to, input string) string { return strings.Replace(input, from, to, -1) },
  26. "split": func(sep, input string) []string { return strings.Split(input, sep) },
  27. "join": func(sep string, input []string) string { return strings.Join(input, sep) },
  28. "sortlines": func(input string) string {
  29. lines := strings.Split(input, "\n")
  30. sort.Strings(lines)
  31. return strings.Join(lines, "\n")
  32. },
  33. }
  34. func NewTemplateGenerator(logger *zap.SugaredLogger) *TemplateGenerator {
  35. return &TemplateGenerator{
  36. logger: logger,
  37. }
  38. }
  39. func (t *TemplateGenerator) AddTemplate(config model.TemplateConfig) {
  40. t.logger.Infof("Adding template from %s, writing to %s", config.Source, config.Destination)
  41. tmpl, err := template.New(path.Base(config.Source)).Funcs(funcMap).ParseFiles(config.Source)
  42. if err != nil {
  43. t.logger.Fatal("Unable to parse template", err)
  44. }
  45. buf, _ := ioutil.ReadFile(config.Destination)
  46. t.templates = append(t.templates, &Template{
  47. config: config,
  48. content: string(buf),
  49. template: tmpl,
  50. })
  51. }
  52. func (t *TemplateGenerator) Generate(context Context) {
  53. for _, tmpl := range t.templates {
  54. t.logger.Debugf("Checking for updates to %s", tmpl.config.Source)
  55. builder := &strings.Builder{}
  56. err := tmpl.template.Execute(builder, context)
  57. if err != nil {
  58. panic(err)
  59. }
  60. if tmpl.content != builder.String() {
  61. t.logger.Infof("Writing updated template to %s", tmpl.config.Destination)
  62. tmpl.content = builder.String()
  63. err = ioutil.WriteFile(tmpl.config.Destination, []byte(builder.String()), 0666)
  64. if err != nil {
  65. t.logger.Fatal("Unable to write template", err)
  66. }
  67. }
  68. }
  69. }