| #!/bin/sh |
| # |
| # This script is used by busybox and procps-ng. |
| # |
| # With procps-ng, the "--system" option of sysctl also enables "--ignore", so |
| # errors are not reported via syslog. Use the run_logger function to mimic the |
| # --system behavior, still reporting errors via syslog. Users not interested |
| # on error reports can add "-e" to SYSCTL_ARGS. |
| # |
| # busybox does not have a "--system" option neither reports errors via syslog, |
| # so the scripting provides a consistent behavior between the implementations. |
| # Testing the busybox sysctl exit code is fruitless, as at the moment, since |
| # its exit status is zero even if errors happen. Hopefully this will be fixed |
| # in a future busybox version. |
| |
| PROGRAM="sysctl" |
| |
| SYSCTL_ARGS="" |
| |
| # shellcheck source=/dev/null |
| [ -r "/etc/default/$PROGRAM" ] && . "/etc/default/$PROGRAM" |
| |
| # Files are read from directories in the SYSCTL_SOURCES list, in the given |
| # order. A file may be used more than once, since there can be multiple |
| # symlinks to it. No attempt is made to prevent this. |
| SYSCTL_SOURCES="/etc/sysctl.d/ /usr/local/lib/sysctl.d/ /usr/lib/sysctl.d/ /lib/sysctl.d/ /etc/sysctl.conf" |
| |
| # If the logger utility is available all messages are sent to syslog, except |
| # for the final status. The file redirections do the following: |
| # |
| # - stdout is redirected to syslog with facility.level "kern.info" |
| # - stderr is redirected to syslog with facility.level "kern.err" |
| # - file dscriptor 4 is used to pass the result to the "start" function. |
| # |
| run_logger() { |
| # shellcheck disable=SC2086 # we need the word splitting |
| find $SYSCTL_SOURCES -maxdepth 1 -name '*.conf' -print0 2> /dev/null | \ |
| xargs -0 -r -n 1 readlink -f | { |
| prog_status="OK" |
| while :; do |
| read -r file || { |
| echo "$prog_status" >&4 |
| break |
| } |
| echo "* Applying $file ..." |
| /sbin/sysctl $SYSCTL_ARGS -p "$file" || prog_status="FAIL" |
| done 2>&1 >&3 | /usr/bin/logger -t sysctl -p kern.err |
| } 3>&1 | /usr/bin/logger -t sysctl -p kern.info |
| } |
| |
| # If logger is not available all messages are sent to stdout/stderr. |
| run_std() { |
| # shellcheck disable=SC2086 # we need the word splitting |
| find $SYSCTL_SOURCES -maxdepth 1 -name '*.conf' -print0 2> /dev/null | \ |
| xargs -0 -r -n 1 readlink -f | { |
| prog_status="OK" |
| while :; do |
| read -r file || { |
| echo "$prog_status" >&4 |
| break |
| } |
| echo "* Applying $file ..." |
| /sbin/sysctl $SYSCTL_ARGS -p "$file" || prog_status="FAIL" |
| done |
| } |
| } |
| |
| if [ -x /usr/bin/logger ]; then |
| run_program="run_logger" |
| else |
| run_program="run_std" |
| fi |
| |
| start() { |
| printf '%s %s: ' "$1" "$PROGRAM" |
| status=$("$run_program" 4>&1) |
| echo "$status" |
| if [ "$status" = "OK" ]; then |
| return 0 |
| fi |
| return 1 |
| } |
| |
| case "$1" in |
| start) |
| start "Running";; |
| restart|reload) |
| start "Rerunning";; |
| stop) |
| :;; |
| *) |
| echo "Usage: $0 {start|stop|restart|reload}" |
| exit 1 |
| esac |