From ce44d3d7619ad92713a3389bc8ecef9b101c6d85 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= <fpeters@entrouvert.com>
Date: Fri, 11 Sep 2020 11:17:10 +0200
Subject: [PATCH] debian: update init.d script for uwsgi (#46568)

---
 debian/authentic2-multitenant.init | 219 +++++++++++++----------------
 debian/authentic2.init             | 216 +++++++++++++---------------
 2 files changed, 191 insertions(+), 244 deletions(-)

diff --git a/debian/authentic2-multitenant.init b/debian/authentic2-multitenant.init
index 3cae9ac5..3958fe9a 100644
--- a/debian/authentic2-multitenant.init
+++ b/debian/authentic2-multitenant.init
@@ -1,52 +1,44 @@
 #!/bin/sh
 ### BEGIN INIT INFO
 # Provides:          authentic2-multitenant
-# Required-Start:    $network $local_fs $syslog
-# Required-Stop:     $network $local_fs $syslog
-# Should-Start:      postgresql
-# Should-Stop:       postgresql
+# Required-Start:    $network $local_fs $remote_fs $syslog
+# Required-Stop:     $network $local_fs $remote_fs $syslog
+# Should-start:      postgresql
+# Should-stop:       postgresql
 # Default-Start:     2 3 4 5
 # Default-Stop:      0 1 6
-# Short-Description: Authentic2 is a versatile identity provider
-# Description:       Authentic2 is a versatile identity provider
+# Short-Description: Versatile identity provider
+# Description:       Versatile identity provider
 ### END INIT INFO
 
-# Author: Serghei MIHAI <smihai@entrouvert.com>
+# Author:  Entr'ouvert <info@entrouvert.com>
 
 PATH=/sbin:/usr/sbin:/bin:/usr/bin
 DESC=authentic2
 NAME=authentic2-multitenant
-DAEMON=/usr/bin/gunicorn3
-PID_DIR=/var/run/$NAME
-CACHE_DIR=/var/cache/$NAME
+DAEMON=/usr/bin/uwsgi
+RUN_DIR=/run/$NAME
+PIDFILE=$RUN_DIR/$NAME.pid
 LOG_DIR=/var/log/$NAME
-PIDFILE=$PID_DIR/$NAME.pid
 SCRIPTNAME=/etc/init.d/$NAME
-BIND=unix:$PID_DIR/$NAME.sock
-WORKERS=4
+BIND=unix:$RUN_DIR/$NAME.sock
 
-export AUTHENTIC2_SETTINGS_FILE=/usr/lib/$NAME/debian_config.py
+AUTHENTIC2_SETTINGS_FILE=/usr/lib/$NAME/debian_config.py
 MANAGE_SCRIPT="/usr/bin/$NAME-manage"
 
 USER=authentic-multitenant
 GROUP=authentic-multitenant
 
 # Exit if the package is not installed
-[ -x $DAEMON ] || exit 0
+[ -x $MANAGE_SCRIPT ] || exit 0
 
 # Read configuration variable file if it is present
 [ -r /etc/default/$NAME ] && . /etc/default/$NAME
 
-DAEMON_ARGS="--pid $PIDFILE \
---user $USER --group $GROUP \
---daemon \
---access-logfile $LOG_DIR/gunicorn-access.log \
---log-file $LOG_DIR/gunicorn-error.log \
---bind=$BIND \
---workers=$WORKERS \
---worker-class=sync \
---timeout=60 \
-authentic2.wsgi:application"
+DAEMON_ARGS=${DAEMON_ARGS:-"--pidfile=$PIDFILE
+--uid $USER --gid $GROUP
+--ini /etc/$NAME/$NAME-uwsgi.ini
+--daemonize /var/log/uwsgi.$NAME.log"}
 
 # Load the VERBOSE setting and other rcS variables
 . /lib/init/vars.sh
@@ -55,37 +47,26 @@ authentic2.wsgi:application"
 # Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
 . /lib/lsb/init-functions
 
-# Create pid directory
-if [ ! -d $PID_DIR ]; then
-    install -d -m 755 -o $USER -g $GROUP $PID_DIR
+# Create /run directory
+if [ ! -d $RUN_DIR ]; then
+    install -d -m 755 -o $USER -g $GROUP $RUN_DIR
 fi
 
-# Create cache directory
-if [ ! -d $CACHE_DIR ]; then
-    install -d -m 755 -o $USER -g $GROUP $CACHE_DIR
-fi
-
-# Function collecting static files
-do_collectstatic() {
-    log_action_msg "Collect static files.."
-    su $USER -s /bin/sh -p -c "$MANAGE_SCRIPT collectstatic -l --noinput"
-    log_action_msg ".. done"
-}
+# environment for wsgi
+export AUTHENTIC2_SETTINGS_FILE
 
 #
 # 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 --exec $DAEMON -- \
-		$DAEMON_ARGS \
-		|| return 2
+    # 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 --user $USER --exec $DAEMON -- \
+        $DAEMON_ARGS \
+        || return 2
 }
 
 #
@@ -93,101 +74,93 @@ do_start()
 #
 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
-	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"
+    # 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
+    $DAEMON --stop $PIDFILE
+    rm -f $PIDFILE
+    return 0 # hopefully
 }
 
 #
 # Function that sends a SIGHUP to the daemon/service
 #
 do_reload() {
-	#
-	# If the daemon can reload its configuration without
-	# restarting (for example, when it is sent a SIGHUP),
-	# then implement that here.
-	#
-	start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name `basename $DAEMON`
-	return 0
+    $DAEMON --reload $PIDFILE
+    return 0
 }
 
 do_migrate() {
-    log_action_msg "Applying new migrations .."
+    log_action_msg "Applying migrations (migrate_schemas).."
     su $USER -s /bin/sh -p -c "$MANAGE_SCRIPT migrate_schemas --noinput"
-    log_action_msg ".. done"
+    log_action_msg "done"
+}
+
+do_collectstatic() {
+    log_action_msg "Collect static files (collectstatic).."
+    su $USER -s /bin/sh -p -c "$MANAGE_SCRIPT collectstatic --noinput"
+    log_action_msg "done"
 }
 
 case "$1" in
   start)
     log_daemon_msg "Starting $DESC " "$NAME"
+    do_migrate
+    do_collectstatic
     do_start
     case "$?" in
-		0|1) log_end_msg 0 ;;
-		2) log_end_msg 1 ;;
-	esac
+        0|1) log_end_msg 0 ;;
+        2) log_end_msg 1 ;;
+    esac
   ;;
   stop)
-	log_daemon_msg "Stopping $DESC" "$NAME"
-	do_stop
-	case "$?" in
-		0|1) log_end_msg 0 ;;
-		2) log_end_msg 1 ;;
-	esac
-	;;
+    log_daemon_msg "Stopping $DESC" "$NAME"
+    do_stop
+    case "$?" in
+        0|1) log_end_msg 0 ;;
+        2) log_end_msg 1 ;;
+    esac
+    ;;
   status)
-       status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
-       ;;
-  reload)
-	log_daemon_msg "Reloading $DESC" "$NAME"
-	do_reload
-	log_end_msg $?
-	;;
-  update)
-	log_daemon_msg "Updating $DESC" "$NAME"
-	do_migrate && do_collectstatic
-	log_end_msg $?
-	;;
+    status_of_proc -p $PIDFILE "$DAEMON" "$NAME" && exit 0 || exit $?
+    ;;
+  reload|force-reload)
+    #
+    # If do_reload() is not implemented then leave this commented out
+    # and leave 'force-reload' as an alias for 'restart'.
+    #
+    log_daemon_msg "Reloading $DESC" "$NAME"
+    do_reload
+    log_end_msg $?
+    ;;
   restart|force-reload)
-	#
-	# If the "reload" option is implemented then remove the
-	# 'force-reload' alias
-	#
-	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
-	;;
+    #
+    # If the "reload" option is implemented then remove the
+    # 'force-reload' alias
+    #
+    log_daemon_msg "Restarting $DESC" "$NAME"
+    do_stop
+    case "$?" in
+      0|1)
+        do_migrate
+        do_collectstatic
+        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
+    ;;
   *)
-	echo "Usage: $SCRIPTNAME {start|stop|status|restart|reload|update}" >&2
-	exit 3
-	;;
+    echo "Usage: $SCRIPTNAME {start|stop|status|restart|reload|force-reload}" >&2
+    exit 3
+    ;;
 esac
-
diff --git a/debian/authentic2.init b/debian/authentic2.init
index 00c5aa2b..b904bca0 100644
--- a/debian/authentic2.init
+++ b/debian/authentic2.init
@@ -1,52 +1,44 @@
 #!/bin/sh
 ### BEGIN INIT INFO
 # Provides:          authentic2
-# Required-Start:    $network $local_fs $syslog
-# Required-Stop:     $network $local_fs $syslog
-# Should-Start:      postgresql
-# Should-Stop:       postgresql
+# Required-Start:    $network $local_fs $remote_fs $syslog
+# Required-Stop:     $network $local_fs $remote_fs $syslog
+# Should-start:      postgresql
+# Should-stop:       postgresql
 # Default-Start:     2 3 4 5
 # Default-Stop:      0 1 6
-# Short-Description: Authentic2 is a versatile identity provider
-# Description:       Authentic2 is a versatile identity provider
+# Short-Description: Versatile identity provider
+# Description:       Versatile identity provider
 ### END INIT INFO
 
-# Author: Jérôme Schneider <jschneider@entrouvert.com>
+# Author:  Entr'ouvert <info@entrouvert.com>
 
 PATH=/sbin:/usr/sbin:/bin:/usr/bin
 DESC=authentic2
 NAME=authentic2
-DAEMON=/usr/bin/gunicorn3
-PID_DIR=/var/run/$NAME
-CACHE_DIR=/var/cache/$NAME
+DAEMON=/usr/bin/uwsgi
+RUN_DIR=/run/$NAME
+PIDFILE=$RUN_DIR/$NAME.pid
 LOG_DIR=/var/log/$NAME
-PIDFILE=$PID_DIR/$NAME.pid
 SCRIPTNAME=/etc/init.d/$NAME
-BIND=unix:$PID_DIR/$NAME.sock
-WORKERS=4
+BIND=unix:$RUN_DIR/$NAME.sock
 
-export AUTHENTIC2_SETTINGS_FILE=/usr/share/$NAME/debian_config.py
+AUTHENTIC2_SETTINGS_FILE=/usr/lib/$NAME/debian_config.py
 MANAGE_SCRIPT=/usr/bin/$NAME-manage
 
 USER=authentic2
 GROUP=authentic2
 
 # Exit if the package is not installed
-[ -x $DAEMON ] || exit 0
+[ -x $MANAGE_SCRIPT ] || exit 0
 
 # Read configuration variable file if it is present
 [ -r /etc/default/$NAME ] && . /etc/default/$NAME
 
-DAEMON_ARGS="--pid $PIDFILE \
---user $USER --group $GROUP \
---daemon \
---access-logfile $LOG_DIR/gunicorn-access.log \
---log-file $LOG_DIR/gunicorn-error.log \
---bind=$BIND \
---workers=$WORKERS \
---worker-class=sync \
---timeout=60 \
-authentic2.wsgi:application"
+DAEMON_ARGS=${DAEMON_ARGS:-"--pidfile=$PIDFILE
+--uid $USER --gid $GROUP
+--ini /etc/$NAME/$NAME-uwsgi.ini
+--daemonize /var/log/uwsgi.$NAME.log"}
 
 # Load the VERBOSE setting and other rcS variables
 . /lib/init/vars.sh
@@ -55,15 +47,13 @@ authentic2.wsgi:application"
 # Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
 . /lib/lsb/init-functions
 
-# Create pid directory
-if [ ! -d $PID_DIR ]; then
-    install -d -m 755 -o $USER -g $GROUP $PID_DIR
+# Create /run directory
+if [ ! -d $RUN_DIR ]; then
+    install -d -m 755 -o $USER -g $GROUP $RUN_DIR
 fi
 
-# Create cache directory
-if [ ! -d $CACHE_DIR ]; then
-    install -d -m 755 -o $USER -g $GROUP $CACHE_DIR
-fi
+# environment for wsgi
+export AUTHENTIC2_SETTINGS_FILE
 
 # Load old authentic configuration
 if [ -f /etc/authentic2/db.conf ]; then
@@ -73,28 +63,18 @@ if [ -f /etc/authentic2/authentic.conf ]; then
 	. /etc/authentic2/authentic.conf
 fi
 
-# Function collecting static files
-do_collectstatic() {
-    log_action_msg "Collect static files.."
-    su $USER -s /bin/sh -p -c "$MANAGE_SCRIPT collectstatic -l --noinput"
-    log_action_msg ".. done"
-}
-
 #
 # 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
-	export AUTHENTIC2_SETTINGS_FILE
-	start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
-		|| return 1
-	start-stop-daemon --start --quiet --exec $DAEMON -- \
-		$DAEMON_ARGS \
-		|| return 2
+    # 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 --user $USER --exec $DAEMON -- \
+        $DAEMON_ARGS \
+        || return 2
 }
 
 #
@@ -102,44 +82,34 @@ do_start()
 #
 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
-	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"
+    # 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
+    $DAEMON --stop $PIDFILE
+    rm -f $PIDFILE
+    return 0 # hopefully
 }
 
 #
 # Function that sends a SIGHUP to the daemon/service
 #
 do_reload() {
-	#
-	# If the daemon can reload its configuration without
-	# restarting (for example, when it is sent a SIGHUP),
-	# then implement that here.
-	#
-	start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name `basename $DAEMON`
-	return 0
+    $DAEMON --reload $PIDFILE
+    return 0
 }
 
 do_migrate() {
-    log_action_msg "Applying new migrations .."
-    su $USER -p -c "$MANAGE_SCRIPT migrate --noinput"
-    log_action_msg ".. done"
+    log_action_msg "Applying migrations.."
+    su $USER -s /bin/sh -p -c "$MANAGE_SCRIPT migrate --noinput"
+    log_action_msg "done"
+}
+
+do_collectstatic() {
+    log_action_msg "Collect static files (collectstatic).."
+    su $USER -s /bin/sh -p -c "$MANAGE_SCRIPT collectstatic --noinput"
+    log_action_msg "done"
 }
 
 case "$1" in
@@ -149,52 +119,56 @@ case "$1" in
     do_collectstatic
     do_start
     case "$?" in
-		0|1) log_end_msg 0 ;;
-		2) log_end_msg 1 ;;
-	esac
+        0|1) log_end_msg 0 ;;
+        2) log_end_msg 1 ;;
+    esac
   ;;
   stop)
-	log_daemon_msg "Stopping $DESC" "$NAME"
-	do_stop
-	case "$?" in
-		0|1) log_end_msg 0 ;;
-		2) log_end_msg 1 ;;
-	esac
-	;;
+    log_daemon_msg "Stopping $DESC" "$NAME"
+    do_stop
+    case "$?" in
+        0|1) log_end_msg 0 ;;
+        2) log_end_msg 1 ;;
+    esac
+    ;;
   status)
-       status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
-       ;;
-  reload)
-	log_daemon_msg "Reloading $DESC" "$NAME"
-	do_reload
-	log_end_msg $?
-	;;
-  update)
-	log_daemon_msg "Updating $DESC" "$NAME"
-	do_migrate && do_collectstatic
-	log_end_msg $?
-	;;
+    status_of_proc -p $PIDFILE "$DAEMON" "$NAME" && exit 0 || exit $?
+    ;;
+  reload|force-reload)
+    #
+    # If do_reload() is not implemented then leave this commented out
+    # and leave 'force-reload' as an alias for 'restart'.
+    #
+    log_daemon_msg "Reloading $DESC" "$NAME"
+    do_reload
+    log_end_msg $?
+    ;;
   restart|force-reload)
-	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
-	;;
+    #
+    # If the "reload" option is implemented then remove the
+    # 'force-reload' alias
+    #
+    log_daemon_msg "Restarting $DESC" "$NAME"
+    do_stop
+    case "$?" in
+      0|1)
+        do_migrate
+        do_collectstatic
+        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
+    ;;
   *)
-	echo "Usage: $SCRIPTNAME {start|stop|status|restart|update|reload}" >&2
-	exit 3
-	;;
+    echo "Usage: $SCRIPTNAME {start|stop|status|restart|reload|force-reload}" >&2
+    exit 3
+    ;;
 esac
-
-- 
2.28.0

