You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

176 lines
4.9 KiB
Bash

#!/bin/sh
### BEGIN INIT INFO
# Provides: rng-tools-debian rng-tools
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: rng-tools (Debian variant)
# Description: The rng-tools daemon bridges between a hardware
# TRNG and the kernel PRNG, verifying input data.
### END INIT INFO
# absolute basics
LC_ALL=C PATH=/sbin:/usr/sbin:/bin:/usr/bin
export LC_ALL PATH
unset LANGUAGE
# exit cleanly if disabled or not installed
test -x /usr/sbin/rngd || exit 0
# Debian/LSB init script foobar
DESC='Hardware RNG entropy gatherer daemon'
NAME=rngd
. /lib/init/vars.sh
test -t 0 && VERBOSE=yes
. /lib/lsb/init-functions
# read options
HRNGDEVICE=
HRNGSELECT=
RNGDOPTIONS=
test -r /etc/default/rng-tools-debian && . /etc/default/rng-tools-debian
finddevice() {
if test -n "$HRNGDEVICE" && test -c "$HRNGDEVICE"; then
# use it unseen
return 0
fi
# list of devices to try/auto-detect
for x in hwrng hw_random hwrandom intel_rng i810_rng; do
for y in /dev /dev/misc; do
test -c "$y/$x" || continue
if timeout -k 1s 5s \
dd if="$y/$x" bs=1 count=1 >/dev/null 2>&1; then
HRNGDEVICE=$y/$x
return 0
fi
logger -t rng-tools-debian \
"found $y/$x but could not use it"
done
done
return 1
}
# prepare for actions
case $1 in
(start|restart|try-restart|force-reload)
test -z "$HRNGSELECT" || printf '%s' "$HRNGSELECT" \
>/sys/devices/virtual/misc/hw_random/rng_current
if ! finddevice; then
logger -t rng-tools-debian \
"not starting: no hardware RNG device found"
log_daemon_msg "Configuring $DESC"
log_progress_msg "no hardware RNG device found!"
log_end_msg 1
test -e /run/rngd.installing || exit 0
# during postinst run, inform user more
cat <<-\EOF
!!! no hardware RNG device found !!!
rng-tools-debian will SILENTLY not start the daemon!
To fix this, edit /etc/default/rng-tools-debian to
set options suitable for your hardware random device;
possibly load some kernel module first, ideally from
initramfs (add to /etc/initramfs-tools/modules), so
it is available early enough during boot.
EOF
exit 0
fi
;;
(stop|status)
;;
(reload|*)
# not supported
echo >&2 "Usage: $0 {start|stop|restart|try-restart|force-reload|status}"
exit 3
;;
esac
# take action
rv=0
case $1 in
(status)
status_of_proc -p /var/run/rngd.pid /usr/sbin/rngd rngd
exit $?
;;
(start)
test x"$VERBOSE" = x"no" || log_daemon_msg "Starting $DESC"
if start-stop-daemon --start --quiet \
--pidfile /var/run/rngd.pid \
--startas /usr/sbin/rngd --name rngd \
--exec /usr/sbin/rngd --test; then
test x"$VERBOSE" = x"no" || log_progress_msg "rngd"
start-stop-daemon --start --quiet \
--pidfile /var/run/rngd.pid \
--startas /usr/sbin/rngd --name rngd \
--exec /usr/sbin/rngd -- -r $HRNGDEVICE $RNGDOPTIONS
rv=$?
else
test x"$VERBOSE" = x"no" || \
log_progress_msg "rngd already running"
fi
;;
(stop)
test x"$VERBOSE" = x"no" || log_daemon_msg "Stopping $DESC"
test x"$VERBOSE" = x"no" || log_progress_msg "rngd"
start-stop-daemon --stop --quiet --retry=10 \
--pidfile /var/run/rngd.pid \
--name rngd --exec /usr/sbin/rngd
rc=$?
if test $rc -gt 1; then
rv=$rc
else
start-stop-daemon --stop --quiet --oknodo \
--retry=0/30/KILL/5 --exec /usr/sbin/rngd
rc=$?
test $rc -gt 1 && test $rv -lt $rc && rv=$rc
fi
rm -f /var/run/rngd.pid
;;
(restart|force-reload)
test x"$VERBOSE" = x"no" || log_daemon_msg "Restarting $DESC"
test x"$VERBOSE" = x"no" || log_progress_msg "rngd"
start-stop-daemon --stop --quiet --retry=10 \
--pidfile /var/run/rngd.pid \
--name rngd --exec /usr/sbin/rngd
if test $? -lt 2; then
start-stop-daemon --stop --quiet --oknodo \
--retry=0/30/KILL/5 --exec /usr/sbin/rngd
fi
rm -f /var/run/rngd.pid
start-stop-daemon --start --quiet \
--pidfile /var/run/rngd.pid \
--startas /usr/sbin/rngd --name rngd \
--exec /usr/sbin/rngd -- -r $HRNGDEVICE $RNGDOPTIONS
rv=$?
;;
(try-restart)
test x"$VERBOSE" = x"no" || log_daemon_msg "Trying to restart $DESC"
if ! status_of_proc -p /var/run/rngd.pid \
/usr/sbin/rngd rngd >/dev/null 2>&1; then
test x"$VERBOSE" = x"no" || log_progress_msg "is not running."
test x"$VERBOSE" = x"no" || log_end_msg 1
exit 0
fi
test x"$VERBOSE" = x"no" || log_progress_msg "rngd"
start-stop-daemon --stop --quiet --retry=10 \
--pidfile /var/run/rngd.pid \
--name rngd --exec /usr/sbin/rngd
if test $? -lt 2; then
start-stop-daemon --stop --quiet --oknodo \
--retry=0/30/KILL/5 --exec /usr/sbin/rngd
fi
rm -f /var/run/rngd.pid
start-stop-daemon --start --quiet \
--pidfile /var/run/rngd.pid \
--startas /usr/sbin/rngd --name rngd \
--exec /usr/sbin/rngd -- -r $HRNGDEVICE $RNGDOPTIONS
rv=$?
;;
esac
test x"$VERBOSE" = x"no" || log_end_msg $rv
exit $rv