func modifySysctl()

in lib/ec2macosinit/systemconfig.go [180:221]


func modifySysctl(value string) (changed bool, err error) {
	// Separate parameter
	inputSplit := strings.Split(value, "=")
	if len(inputSplit) != 2 {
		return false, fmt.Errorf("ec2macosinit: unable to split input sysctl value: %s", value)
	}
	param := inputSplit[0]

	// Check current value
	output, err := executeCommand([]string{"sysctl", "-e", param}, "", []string{})
	if err != nil {
		return false, fmt.Errorf("ec2macosinit: unable to get current value from sysctl: %s", err)
	}
	if strings.TrimSpace(output.stdout) == value {
		return false, nil // Exit early if value is already set
	}

	// Attempt to set the value five times, with 100ms in between each attempt
	err = retry(5, 100*time.Millisecond, func() (err error) {
		// Set value
		_, err = executeCommand([]string{"sysctl", value}, "", []string{})
		if err != nil {
			return fmt.Errorf("ec2macosinit: unable to set desired value using sysctl: %s", err)
		}

		// Validate new value
		output, err = executeCommand([]string{"sysctl", "-e", param}, "", []string{})
		if err != nil {
			return fmt.Errorf("ec2macosinit: unable to get current value from sysctl: %s", err)
		}
		if strings.TrimSpace(output.stdout) != value {
			return fmt.Errorf("ec2macosinit: error setting new value using sysctl: %s", output.stdout)
		}

		return nil
	})
	if err != nil {
		return false, err
	}

	return true, nil
}