Initial commit
This commit is contained in:
90
roles/gekmihesg.openwrt/library/openwrt_sysctl.sh
Normal file
90
roles/gekmihesg.openwrt/library/openwrt_sysctl.sh
Normal file
@@ -0,0 +1,90 @@
|
||||
#!/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"
|
||||
}
|
||||
Reference in New Issue
Block a user