fixing service and cleanup code

This commit is contained in:
Simon Stürz 2015-01-10 11:34:13 +01:00 committed by Michael Zanetti
parent 90120203f4
commit 1529706561
6 changed files with 163 additions and 116 deletions

View File

@ -1,8 +1,4 @@
#!/bin/sh
# kFreeBSD do not accept scripts as interpreters, using #!/bin/sh and sourcing.
if [ true != "$INIT_D_SCRIPT_SOURCED" ] ; then
set "$0" "$@"; INIT_D_SCRIPT_SOURCED=true . /lib/init/init-d-script
fi
#! /bin/sh
### BEGIN INIT INFO
# Provides: skeleton
# Required-Start: $remote_fs $syslog
@ -11,53 +7,123 @@ fi
# Default-Stop: 0 1 6
# Short-Description: Example initscript
# Description: This file should be used to construct scripts to be
# placed in /etc/init.d. This example start a
# single forking daemon capable of writing a pid
# file. To get other behavoirs, implemend
# do_start(), do_stop() or other functions to
# override the defaults in /lib/init/init-d-script.
# placed in /etc/init.d.
### END INIT INFO
# Author: Michael Zanetti <micha@guh.guru>
# Author: Simon Stuerz <simon.stuerz@guh.guru>
# Do NOT "set -e"
# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="guh daemon"
NAME=guhd
DAEMON=/usr/bin/$NAME
DAEMON_ARGS=""
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0
# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions
#
# Function that starts the daemon/service
#
do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
|| return 1
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
$DAEMON_ARGS \
|| return 2
# Add code here, if necessary, that waits for the process to be ready
# to handle requests from services started subsequently which depend
# on this one. As a last resort, sleep for some time.
}
#
# Function that stops the daemon/service
#
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
# Wait for children to finish too if this is a daemon that forks
# and if the daemon is only ever run from this initscript.
# If the above conditions are not satisfied then add some other code
# that waits for the process to drop all resources that could be
# needed by services started subsequently. A last resort is to
# sleep for some time.
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
[ "$?" = 2 ] && return 2
# Many daemons don't delete their pidfiles when they exit.
rm -f $PIDFILE
return "$RETVAL"
}
case "$1" in
start)
log_daemon_msg "Starting guh daemon" "guh" || true
if start-stop-daemon --start --background --quiet --oknodo -m --pidfile /var/run/guh.pid --exec /usr/bin/guhd -- $GUH_OPTS; then
log_end_msg 0 || true
else
log_end_msg 1 || true
fi
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
log_daemon_msg "Stopping guh daemon" "guh" || true
if start-stop-daemon --stop --quiet --oknodo --pidfile /var/run/guhd.pid; then
log_end_msg 0 || true
else
log_end_msg 1 || true
fi
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
status)
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
;;
restart)
check_for_upstart 1
check_privsep_dir
check_config
log_daemon_msg "Restarting guh daemon" "guh" || true
start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile /var/run/guhd.pid
check_for_no_start log_end_msg
check_dev_null log_end_msg
if start-stop-daemon --start --background --quiet --oknodo -m --pidfile /var/run/guhd.pid --exec /usr/bin/guhd -- $GUH_OPTS; then
log_end_msg 0 || true
else
log_end_msg 1 || true
fi
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
log_action_msg "Usage: /etc/init.d/guhd {start|stop|restart}" || true
exit 1
echo "Usage: $SCRIPTNAME {start|stop|restart|status}" >&2
exit 3
;;
esac
exit 0
:

17
server/guhservice.cpp Normal file
View File

@ -0,0 +1,17 @@
#include "guhservice.h"
GuhService::GuhService(int argc, char **argv):
QtService<QCoreApplication>(argc, argv, "guh daemon")
{
setServiceDescription("guh daemon");
setServiceFlags(QtServiceBase::CanBeSuspended);
}
GuhService::~GuhService()
{
}
void GuhService::start()
{
GuhCore::instance();
}

20
server/guhservice.h Normal file
View File

@ -0,0 +1,20 @@
#ifndef GUHSERVICE_H
#define GUHSERVICE_H
#include <QCoreApplication>
#include "qtservice/qtservice.h"
#include "guhcore.h"
class GuhService : public QtService<QCoreApplication>
{
public:
explicit GuhService(int argc, char **argv);
~GuhService();
protected:
void start();
};
#endif // GUHSERVICE_H

View File

@ -17,81 +17,18 @@
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <QCoreApplication>
#include <guhcore.h>
#include <QtPlugin>
#include <qtservice/qtservice.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <syslog.h>
#include <string.h>
class GuhService : public QtService<QCoreApplication>
{
public:
GuhService(int argc, char **argv):
QtService<QCoreApplication>(argc, argv, "guh daemon")
{
setServiceDescription("guh daemon");
setServiceFlags(QtServiceBase::CanBeSuspended);
}
protected:
void start()
{
GuhCore::instance();
}
};
//void daemonizeGuh() {
// // Our process ID and Session ID
// pid_t pid, sid;
// // Fork off the parent process
// pid = fork();
// if (pid < 0) {
// exit(EXIT_FAILURE);
// }
// // If we got a good PID, then we can exit the parent process.
// if (pid > 0) {
// exit(EXIT_SUCCESS);
// }
// // Change the file mode mask
// umask(0);
// // Create a new SID for the child process
// sid = setsid();
// if (sid < 0) {
// // Log the failure
// exit(EXIT_FAILURE);
// }
// // Change the current working directory
// if ((chdir("/")) < 0) {
// /* Log the failure */
// exit(EXIT_FAILURE);
// }
// // Close out the standard file descriptors
// close(STDIN_FILENO);
// close(STDOUT_FILENO);
// close(STDERR_FILENO);
//}
#include "guhcore.h"
#include "guhservice.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QStringList arguments = a.arguments();
QStringList arguments;
for (int i = 0; i < argc; ++i) {
arguments.append(QString(argv[i]));
}
if (arguments.contains("-h") || arguments.contains("--help")) {
qDebug() << "guhd" << GUH_VERSION_STRING << "(C) 2014-2015 guh" ;
@ -110,18 +47,21 @@ int main(int argc, char *argv[])
}
if (arguments.contains("-v") || arguments.contains("--version")) {
qDebug() << GUH_VERSION_STRING;
qDebug() << "guhd" << GUH_VERSION_STRING;
exit(0);
}
if (!arguments.contains("-e") && !arguments.contains("--executable")) {
qDebug() << "guhd is starting as daemon.";
qDebug() << "guhd started as daemon.";
GuhService service(argc, argv);
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
return service.exec();
//daemonizeGuh();
} else {
qDebug() << "guhd is starting as executable.";
}
QCoreApplication a(argc, argv);
qDebug() << "guhd started as executable.";
a.setOrganizationName("guh");
a.setApplicationName("guhd");
GuhCore::instance();

View File

@ -1,4 +1,4 @@
include(../common.pri)
#include(../common.pri)
INCLUDEPATH += $$PWD
DEPENDPATH += $$PWD
!win32:QT += network

View File

@ -17,7 +17,8 @@ LIBS += -L$$top_builddir/libguh/ -lguh
include(server.pri)
include(qtservice/qtservice.pri)
SOURCES += main.cpp
SOURCES += main.cpp \
guhservice.cpp
boblight {
xcompile {
@ -27,3 +28,6 @@ boblight {
}
DEFINES += USE_BOBLIGHT
}
HEADERS += \
guhservice.h