Skip to content

Commit

Permalink
packaging: add statusd daemon
Browse files Browse the repository at this point in the history
  • Loading branch information
Radoslav Bodó committed Jun 12, 2024
1 parent f233661 commit ad67879
Show file tree
Hide file tree
Showing 6 changed files with 210 additions and 12 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ dist
debian/.debhelper/
debian/debhelper-build-stamp
debian/files
debian/perccli-status.debhelper.log
debian/perccli-status.substvars
debian/perccli-status/
venv/
3 changes: 1 addition & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,7 @@ coverage:


install:
mkdir -p $(DESTDIR)/usr/bin
install -m0755 perccli_status.py $(DESTDIR)/usr/bin/perccli-status
install -m0755 perccli_status.py $(DESTDIR)/usr/sbin/perccli-status

install-build:
apt-get update && apt-get install -y build-essential devscripts
Expand Down
6 changes: 2 additions & 4 deletions debian/control
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,13 @@ Priority: optional
Maintainer: Radoslav Bodó <[email protected]>
Rules-Requires-Root: no
Build-Depends:
debhelper-compat (= 13),
debhelper-compat (= 13)
Standards-Version: 4.6.2
Homepage: https://github.com/bodik/perccli-status
#Vcs-Browser: https://salsa.debian.org/debian/perccli-status
#Vcs-Git: https://salsa.debian.org/debian/perccli-status.git

Package: perccli-status
Architecture: any
Depends: perccli2
Depends: perccli2, daemon
Description: The perccli-status software is a query tool to access the running
configuration and status of PERC SAS HBAs.
.
Expand Down
1 change: 1 addition & 0 deletions debian/dirs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/usr/sbin
202 changes: 202 additions & 0 deletions debian/perccli-statusd.init
Original file line number Diff line number Diff line change
@@ -0,0 +1,202 @@
#! /bin/sh

# Author: Petter Reinholdtsen <[email protected]>
# Author: Radoslav Bodó <[email protected]>
# License: GNU General Public License v2 or later
#
### BEGIN INIT INFO
# Provides: perccli-statusd
# Description: Check perccli-status values in the background.
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Check perccli-status values in the background.
### END INIT INFO

PATH=/sbin:/bin:/usr/sbin:/usr/bin
DESC="perccli-status monitor"
NAME=perccli-statusd
PIDFILE=/var/run/$NAME.pid
STATUSFILE=/var/run/$NAME.status
SCRIPTNAME=/etc/init.d/$NAME


# Do not touch you can configure this in /etc/default/perccli-statusd
MAILTO=root # Where to report problems
PERIOD=600 # Seconds between each check (default 10 minutes)
REMIND=7200 # Seconds between each reminder (default 2 hours)
RUN_DAEMON=yes

[ -e /etc/default/perccli-statusd ] && . /etc/default/perccli-statusd

# Gracefully exit if the package has been removed.
test -x /usr/sbin/perccli-status || exit 0

. /lib/lsb/init-functions
[ -e /etc/default/rcS ] && . /etc/default/rcS

if [ $RUN_DAEMON = "no" ] ; then
log_begin_msg "perccli-statusd is disabled in /etc/default/perccli-statusd, not starting."
log_end_msg 0
exit 0
fi

check_perccli() {
echo $$ > $PIDFILE.new && mv $PIDFILE.new $PIDFILE
while true ; do
# Check ever $PERIOD seconds, send email on every status
# change and repeat ever $REMIND seconds if the raid is still
# bad.
if (perccli-status); then
BADRAID=false
else
BADRAID=true
logger -t perccli-statusd "detected non-optimal RAID status"
fi
STATUSCHANGE=false
if [ true = "$BADRAID" ] ; then
# RAID not OK
(perccli-status) > $STATUSFILE.new
if [ ! -f $STATUSFILE ] ; then # RAID just became broken
STATUSCHANGE=true
mv $STATUSFILE.new $STATUSFILE
elif cmp -s $STATUSFILE $STATUSFILE.new ; then
# No change. Should we send reminder?
LASTTIME="`stat -c '%Z' $STATUSFILE`"
NOW="`date +%s`"
SINCELAST="`expr $NOW - $LASTTIME`"
if [ $REMIND -le "$SINCELAST" ]; then
# Time to send reminder
STATUSCHANGE=true
mv $STATUSFILE.new $STATUSFILE
else
rm $STATUSFILE.new
fi
else
STATUSCHANGE=true
mv $STATUSFILE.new $STATUSFILE
fi
else
# RAID OK
if [ -f $STATUSFILE ] ; then
rm $STATUSFILE
STATUSCHANGE=true
fi
fi

if [ true = "$STATUSCHANGE" ]; then
hostname="`uname -n`"
(
cat <<EOF
This is a RAID status update from perccli-statusd. The perccli-status
program reports that one of the RAIDs changed state:
EOF
if [ -f $STATUSFILE ] ; then
cat $STATUSFILE
else
(perccli-status)
fi
echo
echo "Report from $0 on $hostname"
) | mail -s "info: MegaRAID raid status change on $hostname" $MAILTO
fi
sleep $PERIOD &
# Kill sleep if we're signaled to exit, otherwise we will stay defunct
# until sleep terminates.
trap "kill $!; exit" TERM
wait $!
trap - TERM
done
}

check_daemon() {
# Let's check if there is a daemon which is really running and not timing out
DAEMON_RUN=`ps aux | grep "/etc/init.d/perccli-statusd check_perccli" | grep -v grep | grep -v daemon`
if [ -n "$DAEMON_RUN" ] ; then
return 1;
else
return 0;
fi
}

#
# Function that starts the daemon/service.
#
d_start() {
[ -f $PIDFILE ] && PID="`cat $PIDFILE`"
if [ "$PID" ] ; then
log_progress_msg "Daemon already running. Refusing to start another"
return 0
elif check_daemon ; then
# Use the daemon package to turn this script into a daemon
start-stop-daemon --start --quiet --pidfile $PIDFILE \
--oknodo --exec /usr/bin/daemon /usr/bin/daemon $SCRIPTNAME check_perccli
return 0
else
log_progress_msg "Daemon is already running. Refusing to start another"
return 0
fi
}

#
# Function that stops the daemon/service.
#
d_stop() {
if [ -f $PIDFILE ] ; then
start-stop-daemon --stop --oknodo --quiet --pidfile $PIDFILE > /dev/null 2>&1
rm -f $PIDFILE
else
log_progress_msg "Daemon is already stopped."
return 0
fi
}

# This is a workaround function which does not directly exit and
# therefore can be used by a restart
d_stop_by_restart() {
if [ -f $PIDFILE ] ; then
start-stop-daemon --oknodo --stop --quiet --pidfile $PIDFILE
rm -f $PIDFILE
log_end_msg 0
else
log_progress_msg "Daemon is already stopped."
log_end_msg 0
fi
}

case "$1" in
start)
echo -n ""
log_begin_msg "Starting $DESC: $NAME"
d_start ; CODE=$?
log_end_msg $CODE
;;
stop)
log_begin_msg "Stopping $DESC: $NAME"
d_stop ; CODE=$?
log_end_msg $CODE
;;
check_perccli)
check_perccli
;;
status)
status_of_proc /usr/bin/daemon $NAME
exit $?
;;
restart|force-reload)
log_begin_msg "Restarting $DESC: $NAME"
d_stop_by_restart
sleep 1
d_start || CODE=$?
log_end_msg $CODE
;;
*)
# echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
exit 1
;;
esac

exit 0
9 changes: 3 additions & 6 deletions debian/rules
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
#!/usr/bin/make -f

# See debhelper(7) (uncomment to enable).
# Output every command that modifies files on the build system.
export DH_VERBOSE = 1


# See FEATURE AREAS in dpkg-buildflags(1).
export DEB_BUILD_MAINT_OPTIONS = hardening=+all


%:
dh $@

override_dh_installinit:
dh_installinit --name=perccli-statusd

0 comments on commit ad67879

Please sign in to comment.