| package sysctl |
| |
| import ( |
| "fmt" |
| "os" |
| "path" |
| "strings" |
| ) |
| |
| // Options contains sysctl options to apply |
| type Options map[string]string |
| |
| // Apply attempts to apply all options in Options. It aborts on the first |
| // one which returns an error when applying. |
| func (o Options) Apply() error { |
| for name, value := range o { |
| filePath := path.Join("/proc/sys/", strings.ReplaceAll(name, ".", "/")) |
| optionFile, err := os.OpenFile(filePath, os.O_WRONLY, 0) |
| if err != nil { |
| return fmt.Errorf("failed to set option %v: %w", name, err) |
| } |
| if _, err := optionFile.WriteString(value + "\n"); err != nil { |
| optionFile.Close() |
| return fmt.Errorf("failed to set option %v: %w", name, err) |
| } |
| optionFile.Close() // In a loop, defer'ing could open a lot of FDs |
| } |
| return nil |
| } |