func()

in lib/ec2macosinit/systemconfig.go [67:156]


func (c *SystemConfigModule) Do(ctx *ModuleContext) (message string, err error) {
	wg := sync.WaitGroup{}

	// Secure SSHD configuration
	var sshdConfigChanges, sshdUnchanged, sshdErrors int32
	if c.SecureSSHDConfig != nil && *c.SecureSSHDConfig {
		wg.Add(1)
		go func() {
			err := writeEC2SSHConfigs()
			if err != nil {
				ctx.Logger.Errorf("Error writing ec2 custom ssh configs: %s", err)
			}
			wg.Done()
		}()
		wg.Add(1)
		go func() {
			changes, err := c.configureSSHD(ctx)
			if err != nil {
				atomic.AddInt32(&sshdErrors, 1)
				ctx.Logger.Errorf("Error while attempting to correct SSHD configuration: %s", err)
			}
			if changes {
				// Add change for messaging
				atomic.AddInt32(&sshdConfigChanges, 1)
			} else {
				// No changes made
				atomic.AddInt32(&sshdUnchanged, 1)
			}
			wg.Done()
		}()
	}

	// Modifications using sysctl
	var sysctlChanged, sysctlUnchanged, sysctlErrors int32
	for _, m := range c.ModifySysctl {
		wg.Add(1)
		go func(val string) {
			changed, err := modifySysctl(val)
			if err != nil {
				atomic.AddInt32(&sysctlErrors, 1)
				ctx.Logger.Errorf("Error while attempting to modify sysctl property [%s]: %s", val, err)
			}
			if changed { // changed a property
				atomic.AddInt32(&sysctlChanged, 1)
				ctx.Logger.Infof("Modified sysctl property [%s]", val)
			} else { // did not change a property
				atomic.AddInt32(&sysctlUnchanged, 1)
				ctx.Logger.Infof("Did not modify sysctl property [%s]", val)
			}
			wg.Done()
		}(m.Value)
	}

	// Modifications using defaults
	var defaultsChanged, defaultsUnchanged, defaultsErrors int32
	for _, m := range c.ModifyDefaults {
		wg.Add(1)
		go func(modifyDefault ModifyDefaults) {
			changed, err := modifyDefaults(modifyDefault)
			if err != nil {
				atomic.AddInt32(&defaultsErrors, 1)
				ctx.Logger.Errorf("Error while attempting to modify default [%s]: %s", modifyDefault.Parameter, err)
			}
			if changed { // changed a property
				atomic.AddInt32(&defaultsChanged, 1)
				ctx.Logger.Infof("Modified default [%s]", modifyDefault.Parameter)
			} else { // did not change a property
				atomic.AddInt32(&defaultsUnchanged, 1)
				ctx.Logger.Infof("Did not modify default [%s]", modifyDefault.Parameter)
			}
			wg.Done()
		}(m)
	}

	// Wait for everything to finish
	wg.Wait()

	// Craft output message
	totalChanged := sysctlChanged + defaultsChanged + sshdConfigChanges
	totalUnchanged := sysctlUnchanged + defaultsUnchanged + sshdUnchanged
	totalErrors := sysctlErrors + defaultsErrors + sshdErrors
	baseMessage := fmt.Sprintf("[%d changed / %d unchanged / %d error(s)] out of %d requested changes",
		totalChanged, totalUnchanged, totalErrors, totalChanged+totalUnchanged)

	if totalErrors > 0 {
		return "", fmt.Errorf("one or more system configuration changes were unsuccessful: %s", baseMessage)
	}

	return "system configuration completed with " + baseMessage, nil
}