#!/bin/sh
### BEGIN INIT INFO
# Provides:		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:    Hardware random number generator entropy gatherer daemon
# Description:          The rngd daemon acts as a bridge between a Hardware TRNG
#                       (true random number generator) such as the ones in some
#                       Intel/AMD/VIA chipsets, and the kernel's PRNG
#                       (pseudo-random number generator), feeding the random
#                       data to the kernel entropy pool after verifying its
#                       randomness, increasing the bandwidth and randomness of
#                       /dev/random.
### END INIT INFO

# Author: (C)2003 by Henrique de Moraes Holschuh <hmh@debian.org>
# Author: (C)2002 by Viral Shah <viral@debian.org>

PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/rngd
NAME=rngd
DESC="Hardware random number generator entropy gatherer daemon"
PIDFILE=/var/run/rngd.pid

DEVICELIST="hwrng hw_random hwrandom intel_rng i810_rng"

HRNGDEVICE=/dev/hwrng
RNGDOPTIONS=
[ -r /etc/default/rng-tools ] && . /etc/default/rng-tools

test -f ${DAEMON} || exit 0

. /lib/lsb/init-functions

set -e

finddevice () {
	[ -c "${HRNGDEVICE}" ] && return 0
	for i in ${DEVICELIST} ; do
		if [ -c "/dev/$i" ] ; then
			HRNGDEVICE="/dev/$i"
			return 0
		fi
		if [ -c "/dev/misc/$i" ] ; then
			HRNGDEVICE="/dev/misc/$i"
			return 0
		fi
	done
	if grep -q rdrand /proc/cpuinfo ; then
		return 0
	fi

	return 1
}

START="--start --quiet --pidfile ${PIDFILE} --startas ${DAEMON} --name ${NAME}"
case "$1" in
  start)
	log_daemon_msg "Starting $DESC" "$NAME"
        if ! finddevice; then
                log_end_msg 1 "no hardware RNG device found"
                exit 1
        fi

	START="${START} -- -r ${HRNGDEVICE} ${RNGDOPTIONS}"
	if start-stop-daemon ${START} >/dev/null 2>&1 ; then
		echo "${NAME}."
                log_end_msg 0
        elif start-stop-daemon --test ${START} >/dev/null 2>&1; then
                log_end_msg 1
                exit 1
	else
                log_end_msg "already running."
	fi
	;;
  stop)
        log_daemon_msg "Stopping $DESC" "$NAME"
	if start-stop-daemon --stop --quiet --pidfile ${PIDFILE} \
		--startas ${DAEMON} --retry 10 --name ${NAME} \
		>/dev/null 2>&1 ; then
                log_end_msg 0
        elif start-stop-daemon --test ${START} >/dev/null 2>&1; then
                log_end_msg 0 "not running"
	else
                log_end_msg 1
                exit 1
	fi
	;;
  status)
	status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
	;;
  restart|force-reload)
	$0 stop
	exec $0 start	    
	;;
  *)
	echo "Usage: $0 {start|stop|status|restart|force-reload}" 1>&2
	exit 2
	;;
esac

exit 0
