Skip to content

Commit

Permalink
Code to fix the systemd instatiated services when enabled/disabled vi…
Browse files Browse the repository at this point in the history
…a ignition
  • Loading branch information
sohankunkerkar committed Mar 12, 2020
1 parent c48bcf9 commit d5c274b
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 21 deletions.
102 changes: 85 additions & 17 deletions internal/exec/stages/files/units.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,30 +24,31 @@ import (
"github.com/coreos/ignition/v2/internal/exec/util"
)

var (
enabledUnits []types.Unit
disabledUnits []types.Unit
enabledSystemdUnits strings.Builder
isEnableUnit bool = false
isDisableUnit bool = false
enableInstanceAppend strings.Builder
enabledServices = make(map[string]string)
)

// createUnits creates the units listed under systemd.units.
func (s *stage) createUnits(config types.Config) error {
enabledOneUnit := false
for _, unit := range config.Systemd.Units {
if err := s.writeSystemdUnit(unit, false); err != nil {
return err
}
if unit.Enabled != nil {
if *unit.Enabled {
if err := s.Logger.LogOp(
func() error { return s.EnableUnit(unit) },
"enabling unit %q", unit.Name,
); err != nil {
return err
}
enabledUnits = append(enabledUnits, unit)
isEnableUnit = true

} else {
if err := s.Logger.LogOp(
func() error { return s.DisableUnit(unit) },
"disabling unit %q", unit.Name,
); err != nil {
return err
}
disabledUnits = append(disabledUnits, unit)
isDisableUnit = true
}
enabledOneUnit = true
}
if unit.Mask != nil && *unit.Mask {
relabelpath := ""
Expand All @@ -64,10 +65,77 @@ func (s *stage) createUnits(config types.Config) error {
s.relabel(relabelpath)
}
}
// and relabel the preset file itself if we enabled/disabled something
if enabledOneUnit {
s.relabel(util.PresetPath)
if err := s.createSystemdUnits(config); err != nil {
return err
}
return nil
}

// createSystemdUnits creates the enabled and disabled units listed under
// systemd units. This function is primarily written to support instantiated
// units to be enabled via presets.For more information: https://github.com/systemd/systemd/pull/9901/files
func (s *stage) createSystemdUnits(config types.Config) error {
var instantiatedEnableServices strings.Builder
if isEnableUnit {
for _, enableUnit := range enabledUnits {
if strings.Contains(enableUnit.Name, "@") {
at := strings.Index(enableUnit.Name, "@")
dot := strings.Index(enableUnit.Name, ".")
instance := enableUnit.Name[at+1 : dot]
serviceInstance := enableUnit.Name[0:at+1] + enableUnit.Name[dot:len(enableUnit.Name)]
if _, ok := enabledServices[serviceInstance]; ok {
enableInstanceAppend.WriteString(instance + " ")
enabledServices[serviceInstance] = enableInstanceAppend.String()
} else {
enableInstanceAppend.WriteString(instance + " ")
enabledServices[serviceInstance] = enableInstanceAppend.String()
}
} else {
enabledSystemdUnits.WriteString(enableUnit.Name + " ")
}
}
if len(enabledSystemdUnits.String()) > 0 {
if err := s.Logger.LogOp(
func() error { return s.EnableUnit(strings.TrimRight(enabledSystemdUnits.String(), " ")) },
"enabling units %q", strings.TrimRight(enabledSystemdUnits.String(), " ")); err != nil {
return err
}
}
if len(enabledServices) > 0 {
for key, value := range enabledServices {
instantiatedEnableServices.WriteString(key + " " + value)
}
if err := s.Logger.LogOp(
func() error { return s.EnableUnit(strings.TrimRight(instantiatedEnableServices.String(), " ")) },
"instantiated enable units %q", strings.TrimRight(instantiatedEnableServices.String(), " "),
); err != nil {
return err
}
}
}

if isDisableUnit {
for _, disableUnit := range disabledUnits {
var disableSystemdUnit string
if strings.Contains(disableUnit.Name, "@") {
at := strings.Index(disableUnit.Name, "@")
dot := strings.Index(disableUnit.Name, ".")
instance := disableUnit.Name[at+1 : dot]
serviceInstance := disableUnit.Name[0:at+1] + disableUnit.Name[dot:len(disableUnit.Name)]
disableSystemdUnit = serviceInstance + " " + instance
} else {
disableSystemdUnit = disableUnit.Name
}
if err := s.Logger.LogOp(
func() error { return s.DisableUnit(disableSystemdUnit) },
"disabling unit %q", disableSystemdUnit,
); err != nil {
return err
}

}
}
s.relabel(util.PresetPath)
return nil
}

Expand Down
8 changes: 4 additions & 4 deletions internal/exec/util/unit.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,8 @@ func (ut Util) MaskUnit(unit types.Unit) (string, error) {
return filepath.Join("/", SystemdUnitsPath(), unit.Name), nil
}

func (ut Util) EnableUnit(unit types.Unit) error {
return ut.appendLineToPreset(fmt.Sprintf("enable %s", unit.Name))
func (ut Util) EnableUnit(enabledUnits string) error {
return ut.appendLineToPreset(fmt.Sprintf("enable %s", enabledUnits))
}

// presets link in /etc, which doesn't make sense for runtime units
Expand Down Expand Up @@ -145,8 +145,8 @@ func (ut Util) EnableRuntimeUnit(unit types.Unit, target string) error {
return ut.WriteLink(link)
}

func (ut Util) DisableUnit(unit types.Unit) error {
return ut.appendLineToPreset(fmt.Sprintf("disable %s", unit.Name))
func (ut Util) DisableUnit(disabledUnit string) error {
return ut.appendLineToPreset(fmt.Sprintf("disable %s", disabledUnit))
}

func (ut Util) appendLineToPreset(data string) error {
Expand Down

0 comments on commit d5c274b

Please sign in to comment.