packaging/linux/deb/template_custom_dh_installsystemd_postinst.go (59 lines of code) (raw):
package deb
import (
"bytes"
_ "embed"
"io"
"text/template"
"github.com/Azure/dalec"
"github.com/pkg/errors"
)
var (
//go:embed templates/custom_enable_postinst.tmpl
customEnableTmplContent []byte
//go:embed templates/custom_noenable_postinst.tmpl
customNoEnableTmplContent []byte
//go:embed templates/custom_start_postinst.tmpl
customStartTmplContent []byte
customEnableTmpl = template.Must(template.New("enable").Parse(string(customEnableTmplContent)))
customNoEnableTmpl = template.Must(template.New("no-enable").Parse(string(customNoEnableTmplContent)))
customStartTmpl = template.Must(template.New("start").Parse(string(customStartTmplContent)))
)
// This is used to generate a postinst (or at least part of a postinst) for the
// case where we have a mix of enabled/disabled units with the same basename.
// For all units that need this, the `dh_installsystemd` command should be
// executed with the `--no-enable` option.
// This handles enabled or not enabled for this special case instead of using
// the postinst provided by `dh_installsystemd` without `--no-eable` set.
func customDHInstallSystemdPostinst(spec *dalec.Spec, target string) ([]byte, error) {
artifacts := spec.GetArtifacts(target)
units := artifacts.Systemd.GetUnits()
grouped := groupUnitsByBaseName(units)
buf := bytes.NewBuffer(nil)
sorted := dalec.SortMapKeys(grouped)
for _, v := range sorted {
ls := grouped[v]
if !requiresCustomEnable(ls) {
continue
}
sorted := dalec.SortMapKeys(ls)
for _, name := range sorted {
cfg := ls[name]
if err := writeCustomEnablePartial(buf, name, &cfg); err != nil {
return nil, errors.Wrapf(err, "error writing custom systemd enable template for unit: %s", name)
}
if err := customStartTmpl.Execute(buf, name); err != nil {
return nil, errors.Wrapf(err, "error writing custom systemd start template for unit: %s", name)
}
}
}
return buf.Bytes(), nil
}
func writeCustomEnablePartial(buf io.Writer, name string, cfg *dalec.SystemdUnitConfig) error {
if cfg.Enable {
return customEnableTmpl.Execute(buf, name)
}
return customNoEnableTmpl.Execute(buf, name)
}
// requiresCustomEnable returns true when there is a mix of enabled and not
// enabled units.
//
// This expects to have a list of units that share a common
// basename. It does not check base names in any way.
// You can group by base name using [groupUnitsByBaseName].
func requiresCustomEnable(ls map[string]dalec.SystemdUnitConfig) bool {
var enable int
for _, v := range ls {
if v.Enable {
enable++
}
}
if enable == 0 {
return false
}
return enable != len(ls)
}