91 lines
2.4 KiB
Bash
91 lines
2.4 KiB
Bash
#!/bin/sh
|
|
# Copyright (c) 2017 Markus Weippert
|
|
# GNU General Public License v3.0 (see https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
|
|
PARAMS="
|
|
ignore_errors=ignoreerrors/bool
|
|
name=key/str/r
|
|
reload/bool//true
|
|
state/str//present
|
|
sysctl_file/str
|
|
sysctl_set/bool//false
|
|
value=val/str
|
|
"
|
|
RESPONSE_VARS="name value"
|
|
|
|
init() {
|
|
sysctl="/sbin/sysctl"
|
|
default_sysctl_file="/etc/sysctl.conf"
|
|
tmp_file=""
|
|
}
|
|
|
|
sysctl_set() {
|
|
local result
|
|
[ "$(echo $($sysctl -n "$name"))" = "$value" ] || {
|
|
changed
|
|
[ -n "$_ansible_check_mode" ] ||
|
|
result="$($sysctl -w "$name=$value" 2>/dev/null)" ||
|
|
fail "failed to set $name to $value: $result"
|
|
}
|
|
}
|
|
|
|
sysctl_write() {
|
|
local found line v k
|
|
tmp_file="$(mktemp)"
|
|
while read line; do
|
|
set -- $line
|
|
[ -z "$1" -o "${1:0:1}" = "#" -o "${1/=/}" = "$1" ] || {
|
|
k="${1%%=*}"
|
|
[ "$k" != "$name" ] || {
|
|
found="1"
|
|
[ "$state" = "present" ] || { changed; continue; }
|
|
v="${1#*=}"
|
|
shift; while [ $# -ge 1 ]; do
|
|
[ "${1:0:1}" != "#" ] || break; v="$v $1"; shift
|
|
done
|
|
[ "$v" = "$value" ] || {
|
|
line="$k=$value${1:+ $*}"
|
|
changed
|
|
}
|
|
}
|
|
}
|
|
echo "$line" >> "$tmp_file"
|
|
done < "$sysctl_file"
|
|
[ "$state" != "present" -o -n "$found" ] || {
|
|
echo "$name=$value" >> "$tmp_file"
|
|
changed
|
|
}
|
|
}
|
|
|
|
main() {
|
|
local result
|
|
[ -n "$sysctl_file" ] || sysctl_file="$default_sysctl_file"
|
|
case "$state" in
|
|
absent) :;;
|
|
present)
|
|
[ -n "$value" ] ||
|
|
fail "value must be given with state present";;
|
|
*) fail "state must be present or absent";;
|
|
esac
|
|
|
|
[ -w "$sysctl_file" ] || fail "sysctl file $sysctl_file not writeable"
|
|
[ "$state" = "present" ] || ignore_errors="y"
|
|
[ -n "$ignore_errors" -a -z "$sysctl_set" ] ||
|
|
[ $($sysctl "$name" 2>/dev/null | wc -l) -eq 1 ] ||
|
|
fail "unknown sysctl key $name"
|
|
|
|
[ -z "$sysctl_set" ] || sysctl_set
|
|
sysctl_write
|
|
|
|
[ -z "$CHANGED" -o -n "$_ansible_check_mode" ] || {
|
|
cat "$tmp_file" > "$sysctl_file"
|
|
[ -z "$reload" -o "$state" != "present" ] ||
|
|
result="$($sysctl -p "$sysctl_file" 2>&1)" ||
|
|
fail "failed to reload: $result"
|
|
}
|
|
}
|
|
|
|
cleanup() {
|
|
[ -z "$tmp_file" ] || rm -f "$tmp_file"
|
|
}
|