#!/sbin/runscript
# Distributed under the terms of the GNU General Public License, v2 or later

VARDIR="/var/lib/litecoin"
CONFFILE="${VARDIR}/.litecoin/litecoin.conf"

depend() {
	need net
}

checkconfig() {
	if [[ "${LITECOIN_USER}" == "" ]] ; then
		eerror "Please edit /etc/conf.d/litecoind"
		eerror "A user must be specified to run litecoind as that user."
		eerror "Modify USER to your needs (you may also add a group after a colon)"
		return 1
	fi
	if ! `getent passwd | cut -d ':' -f 1 | grep $( echo "${LITECOIN_USER}" | cut -d ':' -f 1 ) -sq` ; then
		eerror "Please edit /etc/conf.d/litecoind"
		eerror "Specified user must exist!"
		return 1
	fi
	if `echo "${LITECOIN_USER}" | grep ':' -sq` ; then
		if ! `cut -d ':' -f 1 /etc/group | grep $( echo "${LITECOIN_USER}" | cut -d ':' -f 2 ) -sq` ; then
			eerror "Please edit /etc/conf.d/litecoind"
			eerror "Specified group must exist!"
			return 1
		fi
	fi
	if ! grep -q '^rpcpassword=' "${CONFFILE}"; then
		eerror "Please edit `readlink -f ${CONFFILE}`"
		eerror "There must be at least a line assigning rpcpassword=something-secure"
		return 1
	fi
	if ! stat -Lc '%a' "${CONFFILE}" | grep -q '^[4567]00$'; then
		eerror "`readlink -f ${CONFFILE}` should not be readable by other users"
		return 1
	fi
	return 0
}

start() {
	checkconfig || return 1
	ebegin "Starting Litecoind daemon"

	pkg-config openrc
	if [ $? = 0 ]; then
	   start_openrc
	else
	   start_baselayout
	fi
}

stop() {
       ebegin "Stopping Litecoin daemon"

       pkg-config openrc
       if [ $? = 0 ]; then
	   stop_openrc
       else
	   stop_baselayout
       fi
}

start_openrc() {
	start-stop-daemon \
	--start --user "${LITECOIN_USER}" --name litecoind \
	--pidfile /var/run/litecoind.pid --make-pidfile \
	--env HOME="${VARDIR}" --exec /usr/bin/litecoind \
	--nicelevel "${NICELEVEL}" \
	--background \
	--wait 2000 \
	-- ${LITECOIN_OPTS}
	eend $?
}

stop_openrc() {
	start-stop-daemon --stop --user "${LITECOIN_USER}" \
	--name litecoind --pidfile /var/run/litecoind.pid \
	--wait 30000 \
	--progress
	eend $?
}

start_baselayout() {
	start-stop-daemon \
	--start --user "${LITECOIN_USER}" --name litecoind \
	--pidfile /var/run/litecoind.pid --make-pidfile \
	--env HOME="${VARDIR}" --exec /usr/bin/litecoind \
	--chuid "${LITECOIN_USER}" \
	--nicelevel "${NICELEVEL}" \
	--background \
	-- ${LITECOIN_OPTS}
	eend $?
}

stop_baselayout() {
	start-stop-daemon \
	--stop \
	--user "${LITECOIN_USER}" \
	--name litecoind \
	--pidfile /var/run/litecoind.pid
	eend $?
}
