From: Peter A. Bigot Date: Mon, 19 May 2014 20:29:52 +0000 (-0500) Subject: etc: add example LSB-based init scripts X-Git-Tag: v1.5.0-rc1~85^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F490%2Fhead;p=thirdparty%2Frrdtool-1.x.git etc: add example LSB-based init scripts These scripts support automated startup on Debian (Ubuntu) and other distributions that follow the Linux Standards Base. http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/tocsysinit.html Signed-off-by: Peter A. Bigot --- diff --git a/.gitignore b/.gitignore index beb9359b..c7b29801 100644 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,7 @@ Makefile /config.status /etc/rrdcached.service /etc/rrdcached.socket +/etc/rrdcached-default-lsb /libtool /src/librrd.pc /src/librrd.sym.in diff --git a/configure.ac b/configure.ac index a414ead5..1a3af821 100644 --- a/configure.ac +++ b/configure.ac @@ -931,6 +931,7 @@ AC_CONFIG_FILES([examples/4charts.pl]) AC_CONFIG_FILES([examples/perftest.pl]) AC_CONFIG_FILES([examples/Makefile]) AC_CONFIG_FILES([examples/rrdcached/Makefile]) +AC_CONFIG_FILES([etc/rrdcached-default-lsb]) AC_CONFIG_FILES([tests/Makefile]) AC_CONFIG_FILES([doc/Makefile]) AC_CONFIG_FILES([po/Makefile.in]) diff --git a/etc/rrdcached-default-lsb.in b/etc/rrdcached-default-lsb.in new file mode 100644 index 00000000..f57289c6 --- /dev/null +++ b/etc/rrdcached-default-lsb.in @@ -0,0 +1,44 @@ +# /etc/default file for RRD cache daemon + +# Full path to daemon +DAEMON=@prefix@/bin/rrdcached + +# Optional override flush interval, in seconds. +#WRITE_TIMEOUT=300 + +# Optional override maximum write delay, in seconds. +#WRITE_JITTER=0 + +# Optional override number of write_threads +#WRITE_THREADS=4 + +# Where database files are placed. If left unset, the default /tmp will +# be used. NB: The daemon will reject a directory that has symlinks as +# components. NB: You may want to have -B in BASE_OPTS. +BASE_PATH=/var/lib/rrdcached/db/ + +# Where journal files are placed. If left unset, journaling will +# be disabled. +JOURNAL_PATH=/var/lib/rrdcached/journal/ + +# FHS standard placement for process ID file. +PIDFILE=/var/run/rrdcached.pid + +# FHS standard placement for local control socket. +SOCKFILE=/var/run/rrdcached.sock + +# Optional override group that should own/access the local control +# socket +#SOCKGROUP=root + +# Optional override access mode of local control socket. +#SOCKMODE=0660 + +# Network socket address requests. Use in conjunction with SOCKFILE to +# also listen on INET domain sockets. (The option is a lower-case ell +# ASCII 108 = 0x6c, and should be repeated for each address.). +NETWORK_OPTIONS="-l :42217" + +# Any other options not specifically supported by the script (-P, -f, +# -F, -B). +BASE_OPTIONS=-B diff --git a/etc/rrdcached-init-lsb b/etc/rrdcached-init-lsb new file mode 100755 index 00000000..550634bb --- /dev/null +++ b/etc/rrdcached-init-lsb @@ -0,0 +1,189 @@ +#!/bin/sh +### BEGIN INIT INFO +# Provides: rrdcached +# Required-Start: $local_fs $remote_fs $named $time $network +# Required-Stop: $local_fs $remote_fs $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: start or stop rrdcached +# Description: Daemon that accumulates updates to RRD files and flushes +# them periodically or on command. +### END INIT INFO +# + +PATH=/sbin:/usr/sbin:/bin:/usr/bin + +NAME=rrdcached +DESC="RRD cache daemon" +DAEMON=/usr/bin/rrdcached + +DEFAULT=/etc/default/rrdcached +test -f ${DEFAULT} && . ${DEFAULT} + +PIDFILE=${PIDFILE:-/var/run/${NAME}.pid} + +RRDCACHED_OPTIONS="\ + ${BASE_OPTIONS} \ + ${NETWORK_OPTIONS} \ + ${WRITE_TIMEOUT:+-w ${WRITE_TIMEOUT}} \ + ${WRITE_JITTER:+-z ${WRITE_JITTER}} \ + ${WRITE_THREADS:+-t ${WRITE_THREADS}} \ + ${BASE_PATH:+-b ${BASE_PATH}} \ + ${JOURNAL_PATH:+-j ${JOURNAL_PATH}} \ + -p ${PIDFILE} \ + ${SOCKFILE:+-l unix:${SOCKFILE} ${SOCKGROUP:+-s ${SOCKGROUP}} ${SOCKMODE:+-m ${SOCKMODE}}} \ + " + +. /lib/lsb/init-functions + +RETVAL=1 + +# Do any pre-start checks. If this returns nonzero, the failure +# diagnostic has already been generated. +validate_prestart () { + if [ -n "${JOURNAL_PATH}" -a ! -d "${JOURNAL_PATH}" ] ; then + mkdir -p "${JOURNAL_PATH}" + if [ 0 != $? ] ; then + log_failure_msg "${NAME}: Unable to find/create journal directory ${JOURNAL_PATH}" + return 1 + fi + fi + if [ -n "${BASE_PATH}" -a ! -d "${BASE_PATH}" ] ; then + mkdir -p "${BASE_PATH}" + if [ 0 != $? ] ; then + log_failure_msg "${NAME}: Unable to find/create base directory ${BASE_PATH}" + return 1 + fi + fi + return 0 +} + +# Whatever's necessary to start a daemon. Any currently-running +# daemon is left unmolested and no new daemon is started. Return as +# with start_daemon. +do_start () { + start_daemon -p ${PIDFILE} ${DAEMON} ${RRDCACHED_OPTIONS} + return $? +} + +# Perform a restart from a state with no daemon running. This +# function emits the success/failure diagnostics. Return as with +# restart. +do_restart_diag () { + validate_prestart + if [ 0 != $? ] ; then + rv=$? + else + do_start + rv=$? + if [ 0 = $? ] ; then + log_success_msg "${NAME} restarted" + else + log_failure_msg "${NAME} restart failed" + fi + fi + return ${rv} +} + +# Whatever's necessary to check daemon status. Sets PID if the daemon +# is running. Return as pidofproc. +do_status () { + PID=$( pidofproc -p ${PIDFILE} ${DAEMON} ) + return $? +} + +# Whatever's necessary to stop the daemon. Returns as stop action. +do_stop () { + killproc -p ${PIDFILE} ${DAEMON} + rv=$? + # rrdcached traps the TERM signal and does some flushing. + # Give it a chance to shut down before returning, lest + # we restart it too soon. + max_iters=${STOP_WAIT_DELAY:-5} + while [ 0 -lt ${max_iters} ] ; do + if pidofproc -p ${PIDFILE} ${DAEMON} >/dev/null ; then + log_warning_msg "${NAME} is still running" + sleep 1 + max_iters=$(( ${max_iters} - 1 )) + rv=1 + else + rv=0 + break + fi + done + return $? +} + +case "$1" in + start) + # Succeed if service already started or start attempt succeeds + if do_status > /dev/null ; then + log_success_msg "${NAME} is already started as ${PID}" + RETVAL=0 + else + validate_prestart + RETVAL=$? + if [ 0 = ${RETVAL} ] ; then + do_start + RETVAL=$? + if [ 0 = ${RETVAL} ] ; then + log_success_msg "${NAME} started" + else + log_failure_msg "${NAME} FAILED" + fi + fi + fi + ;; + stop) + if pidofproc -p ${PIDFILE} ${DAEMON} > /dev/null ; then + do_stop + RETVAL=$? + if [ 0 = ${RETVAL} ] ; then + log_success_msg "${NAME} has been stopped" + else + log_failure_msg "${NAME} was not stopped" + fi + else + log_success_msg "${NAME} was already stopped" + RETVAL=0 + fi + ;; + restart) + do_stop + do_restart_diag + RETVAL=$? + ;; + try-restart) + if pidofproc -p ${PIDFILE} ${DAEMON} > /dev/null ; then + do_stop + do_restart_diag + RETVAL=$? + else + # Yes, try-restart when the system is not running is + # success. + log_success_msg "${NAME} not running" + RETVAL=0 + fi + ;; + reload|force-reload) + RETVAL=3 + log_failure_msg "${NAME} does not support $1" + ;; + status) + do_status + RETVAL=$? + if [ 0 = "${RETVAL}" ] ; then + log_success_msg "${NAME} status ${RETVAL} is running as ${PID}" + else + log_failure_msg "${NAME} is not running" + fi + ;; + '') + log_warning_msg "No command (try: status)" + ;; + *) + log_warning_msg "Unrecognized command: $1" + ;; +esac + +exit $RETVAL