diff --git a/puppet/modules/supervisor/Modulefile b/puppet/modules/supervisor/Modulefile new file mode 100644 index 0000000..360e9c0 --- /dev/null +++ b/puppet/modules/supervisor/Modulefile @@ -0,0 +1,9 @@ +name 'seocam-supervisor' +version '0.0.1' +source 'https://github.com/TracyWebTech/puppet-supervisor' +author 'Tracy Web Technologies' +summary 'Install and configure Supervisord' +description "This puppet module is used to install and configure Supervisord. It also provides a custom define to manage services (apps) using it." +project_page 'https://github.com/TracyWebTech/puppet-supervisor' + +#dependency 'puppetlabs/stdlib', '>= 2.2.1' diff --git a/puppet/modules/supervisor/README.md b/puppet/modules/supervisor/README.md index 58f1dd7..64dbf28 100644 --- a/puppet/modules/supervisor/README.md +++ b/puppet/modules/supervisor/README.md @@ -16,9 +16,12 @@ Install your app using defined type supervisor::app ```puppet supervisor::app { 'your-app-title': - app_name => 'your-app-name' # Default to 'your-app-title' - command => 'The command that will be run this app', # required - directory => 'Path where your command will be run' # required - user => 'User to execute this app' # Default to ubuntu + app_name => 'your-app-name' # Default to 'your-app-title' + command => 'The command that will be run this app', # required + directory => 'Path where your command will be run' # required + user => 'User to execute this app' # Default to ubuntu + startsecs => 'The total number of seconds which the program needs to stay running after a startup to consider the start successful' # Default to undef + stopwaitsecs => 'The number of seconds to wait for the OS to return a SIGCHILD to supervisord after the program has been sent a stopsignal', # Default to undef + priority => 'The relative priority of the program in the start and shutdown ordering' # Default to undef } -``` \ No newline at end of file +``` diff --git a/puppet/modules/supervisor/files/debian-isnok b/puppet/modules/supervisor/files/debian-isnok deleted file mode 100755 index 01fd900..0000000 --- a/puppet/modules/supervisor/files/debian-isnok +++ /dev/null @@ -1,217 +0,0 @@ -#! /bin/sh -# -# supervisor built from skeleton /etc/init.d/ script. -# -# skeleton by Miquel van Smoorenburg . -# Modified for Debian by Ian Murdock . -# Further changes by Javier Fernandez-Sanguino . -# More changes by Konstantin Martini . -# -# Version: @(#)supervisor 0.8 25-Jun-2013 isnok@tuxcode.org -# -### BEGIN INIT INFO -# Provides: supervisor -# Required-Start: $remote_fs $network $named -# Required-Stop: $remote_fs $network $named -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: Start/stop supervisord -# Description: Start/stop supervisor daemon and its configured -# subprocesses. -### END INIT INFO - - -PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin -#DAEMON=/usr/bin/supervisord # Debian package version (presently 3.0a8-1) -DAEMON=/usr/local/bin/supervisord # Python package index (pypi) version (3.0b1) -NAME=supervisord -DESC="supervisord" - -CONFIGFILE=/etc/supervisord.conf # the supervisord config file -SUPERVISORCTL=/usr/local/bin/supervisorctl # used for reload command(s) -#SUPERVISORCTL=/usr/bin/supervisorctl # again: official deb version - -if [ ! -x $DAEMON ]; then - echo "ERROR: Not executable: $DAEMON" - exit 0 -fi - -LOGDIR=/var/log/supervisor -PIDFILE=/var/run/$NAME.pid -DODTIME=5 # Time to wait for the server to die, in seconds - # If this value is set too low you might not - # let some servers to die gracefully and - # 'restart' will not work. - -# fix some args for certain commands -DAEMON_ARGS="-c$CONFIGFILE" -CTL_ARGS="-c$CONFIGFILE" -STARTSTOP_ARGS="--quiet --pidfile $PIDFILE --exec $DAEMON" - -# Include supervisor defaults if available -if [ -r /etc/default/supervisor ]; then - . /etc/default/supervisor -fi - -set -e - -dod_sleep () { - if [ -n "$DODTIME" ]; then - sleep "$DODTIME"s - fi -} - -running_pid () { - # Check if a pid's cmdline contains a string (name). - # This should work for all users. - pid="$1" - name="$2" - if [ -z "$pid" ]; then - return 1 # no pid given - fi - if [ ! -d /proc/"$pid" ]; then - return 1 # no /proc/$pid directory - fi - if cat /proc/"$pid"/cmdline | tr "\000" "\n"| grep -q "$name"; then - return 0 - else - return 1 # $pid does not match $name - fi -} - -running () { - # Check if DAEMON is running by examining $PIDFILE. - # If this succeeds, it sets $pid (a side effect being used). - - if [ ! -f "$PIDFILE" ]; then - return 1 # No pidfile, probably no daemon present. - fi - # Now, obtain the pid and check it's /proc cmdline: - pid="$(cat $PIDFILE)" - if running_pid "$pid" "$DAEMON"; then - return 0 - else - return 1 - fi -} - -normal_start () { - start-stop-daemon $STARTSTOP_ARGS --start \ - -- "$DAEMON_ARGS" $DAEMON_OPTS - if [ ! -f "$PIDFILE" ]; then - sleep 1 # grace time to create PIDFILE - fi -} - -normal_stop () { - #start-stop-daemon $STARTSTOP_ARGS --stop --oknodo - "$SUPERVISORCTL" $CTL_ARGS shutdown -} - -force_stop () { - # Forcefully stop a running DAEMON. - if running; then - kill -15 "$pid" - dod_sleep - # Check again, try harder if needed. - if running; then - kill -9 "$pid" - dod_sleep - if running; then - echo "Unable to kill running $NAME process (pid=$pid)!" - exit 1 - fi - fi - fi - rm -f "$PIDFILE" - return 0 -} - -ctl_reload () { - # make supervisord reload it's config - if [ -x "$SUPERVISORCTL" ]; then - "$SUPERVISORCTL" $CTL_ARGS reload - else - return 1 - fi -} - -ctl_status () { - # show stati of supervised processes. - # do not mind if this fails. - "$SUPERVISORCTL" $CTL_ARGS status -} - -case "$1" in - start) - echo -n "Starting $DESC: " - normal_start - if running; then - echo "$NAME." - else - echo "ERROR." - fi - ;; - stop) - echo -n "Stopping $DESC: " - if normal_stop; then - echo "$NAME." - else - echo "ERROR." - fi - ;; - restart) - echo "Restarting $DESC..." - "$0" stop && "$0" start - ;; - force-stop) - echo -n "Forcefully stopping $DESC: " - force_stop - if running; then - echo "$NAME." - else - echo "ERROR." - fi - ;; - reload|force-reload) - # - # If the daemon can reload its config files on the fly - # for example by sending it SIGHUP, do it here. - # - # If the daemon responds to changes in its config file - # directly anyway, make this a do-nothing entry. - # - echo "Reloading $DESC: " - if ctl_reload; then - echo "$NAME." - else - echo "ERROR." - fi - ;; - #force-reload) - # - # If the "reload" option is implemented, move the "force-reload" - # option to the "reload" entry above. If not, "force-reload" is - # just the same as "restart" except that it does nothing if the - # daemon isn't already running. - # Check wether $DAEMON is running. If so, restart. - #echo "Not implemented." - #;; - status) - echo -n "$NAME is " - if running; then - echo "running" -# ctl_status - else - echo "not running." - exit 1 - fi - ;; - *) - N=/etc/init.d/"$NAME" - echo "Usage: $N {start|stop|restart|reload|status|force-stop}" >&2 - exit 1 - ;; -esac - -exit 0 diff --git a/puppet/modules/supervisor/files/debian-isnok-initscript b/puppet/modules/supervisor/files/debian-isnok-initscript new file mode 100755 index 0000000..01fd900 --- /dev/null +++ b/puppet/modules/supervisor/files/debian-isnok-initscript @@ -0,0 +1,217 @@ +#! /bin/sh +# +# supervisor built from skeleton /etc/init.d/ script. +# +# skeleton by Miquel van Smoorenburg . +# Modified for Debian by Ian Murdock . +# Further changes by Javier Fernandez-Sanguino . +# More changes by Konstantin Martini . +# +# Version: @(#)supervisor 0.8 25-Jun-2013 isnok@tuxcode.org +# +### BEGIN INIT INFO +# Provides: supervisor +# Required-Start: $remote_fs $network $named +# Required-Stop: $remote_fs $network $named +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Start/stop supervisord +# Description: Start/stop supervisor daemon and its configured +# subprocesses. +### END INIT INFO + + +PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin +#DAEMON=/usr/bin/supervisord # Debian package version (presently 3.0a8-1) +DAEMON=/usr/local/bin/supervisord # Python package index (pypi) version (3.0b1) +NAME=supervisord +DESC="supervisord" + +CONFIGFILE=/etc/supervisord.conf # the supervisord config file +SUPERVISORCTL=/usr/local/bin/supervisorctl # used for reload command(s) +#SUPERVISORCTL=/usr/bin/supervisorctl # again: official deb version + +if [ ! -x $DAEMON ]; then + echo "ERROR: Not executable: $DAEMON" + exit 0 +fi + +LOGDIR=/var/log/supervisor +PIDFILE=/var/run/$NAME.pid +DODTIME=5 # Time to wait for the server to die, in seconds + # If this value is set too low you might not + # let some servers to die gracefully and + # 'restart' will not work. + +# fix some args for certain commands +DAEMON_ARGS="-c$CONFIGFILE" +CTL_ARGS="-c$CONFIGFILE" +STARTSTOP_ARGS="--quiet --pidfile $PIDFILE --exec $DAEMON" + +# Include supervisor defaults if available +if [ -r /etc/default/supervisor ]; then + . /etc/default/supervisor +fi + +set -e + +dod_sleep () { + if [ -n "$DODTIME" ]; then + sleep "$DODTIME"s + fi +} + +running_pid () { + # Check if a pid's cmdline contains a string (name). + # This should work for all users. + pid="$1" + name="$2" + if [ -z "$pid" ]; then + return 1 # no pid given + fi + if [ ! -d /proc/"$pid" ]; then + return 1 # no /proc/$pid directory + fi + if cat /proc/"$pid"/cmdline | tr "\000" "\n"| grep -q "$name"; then + return 0 + else + return 1 # $pid does not match $name + fi +} + +running () { + # Check if DAEMON is running by examining $PIDFILE. + # If this succeeds, it sets $pid (a side effect being used). + + if [ ! -f "$PIDFILE" ]; then + return 1 # No pidfile, probably no daemon present. + fi + # Now, obtain the pid and check it's /proc cmdline: + pid="$(cat $PIDFILE)" + if running_pid "$pid" "$DAEMON"; then + return 0 + else + return 1 + fi +} + +normal_start () { + start-stop-daemon $STARTSTOP_ARGS --start \ + -- "$DAEMON_ARGS" $DAEMON_OPTS + if [ ! -f "$PIDFILE" ]; then + sleep 1 # grace time to create PIDFILE + fi +} + +normal_stop () { + #start-stop-daemon $STARTSTOP_ARGS --stop --oknodo + "$SUPERVISORCTL" $CTL_ARGS shutdown +} + +force_stop () { + # Forcefully stop a running DAEMON. + if running; then + kill -15 "$pid" + dod_sleep + # Check again, try harder if needed. + if running; then + kill -9 "$pid" + dod_sleep + if running; then + echo "Unable to kill running $NAME process (pid=$pid)!" + exit 1 + fi + fi + fi + rm -f "$PIDFILE" + return 0 +} + +ctl_reload () { + # make supervisord reload it's config + if [ -x "$SUPERVISORCTL" ]; then + "$SUPERVISORCTL" $CTL_ARGS reload + else + return 1 + fi +} + +ctl_status () { + # show stati of supervised processes. + # do not mind if this fails. + "$SUPERVISORCTL" $CTL_ARGS status +} + +case "$1" in + start) + echo -n "Starting $DESC: " + normal_start + if running; then + echo "$NAME." + else + echo "ERROR." + fi + ;; + stop) + echo -n "Stopping $DESC: " + if normal_stop; then + echo "$NAME." + else + echo "ERROR." + fi + ;; + restart) + echo "Restarting $DESC..." + "$0" stop && "$0" start + ;; + force-stop) + echo -n "Forcefully stopping $DESC: " + force_stop + if running; then + echo "$NAME." + else + echo "ERROR." + fi + ;; + reload|force-reload) + # + # If the daemon can reload its config files on the fly + # for example by sending it SIGHUP, do it here. + # + # If the daemon responds to changes in its config file + # directly anyway, make this a do-nothing entry. + # + echo "Reloading $DESC: " + if ctl_reload; then + echo "$NAME." + else + echo "ERROR." + fi + ;; + #force-reload) + # + # If the "reload" option is implemented, move the "force-reload" + # option to the "reload" entry above. If not, "force-reload" is + # just the same as "restart" except that it does nothing if the + # daemon isn't already running. + # Check wether $DAEMON is running. If so, restart. + #echo "Not implemented." + #;; + status) + echo -n "$NAME is " + if running; then + echo "running" +# ctl_status + else + echo "not running." + exit 1 + fi + ;; + *) + N=/etc/init.d/"$NAME" + echo "Usage: $N {start|stop|restart|reload|status|force-stop}" >&2 + exit 1 + ;; +esac + +exit 0 diff --git a/puppet/modules/supervisor/files/ubuntu-initscript b/puppet/modules/supervisor/files/ubuntu-initscript new file mode 100755 index 0000000..511befe --- /dev/null +++ b/puppet/modules/supervisor/files/ubuntu-initscript @@ -0,0 +1,170 @@ +#! /bin/sh +# +# Downloaded from: +# http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/trusty/supervisor/trusty/view/head:/debian/supervisor.init +# +# skeleton example file to build /etc/init.d/ scripts. +# This file should be used to construct scripts for /etc/init.d. +# +# Written by Miquel van Smoorenburg . +# Modified for Debian +# by Ian Murdock . +# Further changes by Javier Fernandez-Sanguino +# +# Version: @(#)skeleton 1.9 26-Feb-2001 miquels@cistron.nl +# +### BEGIN INIT INFO +# Provides: supervisor +# Required-Start: $remote_fs $network $named +# Required-Stop: $remote_fs $network $named +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Start/stop supervisor +# Description: Start/stop supervisor daemon and its configured +# subprocesses. +### END INIT INFO + +. /lib/lsb/init-functions + +PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin +DAEMON=/usr/local/bin/supervisord +NAME=supervisord +DESC=supervisor + +test -x $DAEMON || exit 0 + +LOGDIR=/var/log/supervisor +PIDFILE=/var/run/$NAME.pid +DODTIME=5 # Time to wait for the server to die, in seconds + # If this value is set too low you might not + # let some servers to die gracefully and + # 'restart' will not work + +# Include supervisor defaults if available +if [ -f /etc/default/supervisor ] ; then + . /etc/default/supervisor +fi +DAEMON_OPTS="-c /etc/supervisord.conf $DAEMON_OPTS" + +set -e + +running_pid() +{ + # Check if a given process pid's cmdline matches a given name + pid=$1 + name=$2 + [ -z "$pid" ] && return 1 + [ ! -d /proc/$pid ] && return 1 + (cat /proc/$pid/cmdline | tr "\000" "\n"|grep -q $name) || return 1 + return 0 +} + +running() +{ +# Check if the process is running looking at /proc +# (works for all users) + + # No pidfile, probably no daemon present + [ ! -f "$PIDFILE" ] && return 1 + # Obtain the pid and check it against the binary name + pid=`cat $PIDFILE` + running_pid $pid $DAEMON || return 1 + return 0 +} + +force_stop() { +# Forcefully kill the process + [ ! -f "$PIDFILE" ] && return + if running ; then + kill -15 $pid + # Is it really dead? + [ -n "$DODTIME" ] && sleep "$DODTIME"s + if running ; then + kill -9 $pid + [ -n "$DODTIME" ] && sleep "$DODTIME"s + if running ; then + echo "Cannot kill $LABEL (pid=$pid)!" + exit 1 + fi + fi + fi + rm -f $PIDFILE + return 0 +} + +case "$1" in + start) + echo -n "Starting $DESC: " + start-stop-daemon --start --quiet --pidfile $PIDFILE \ + --startas $DAEMON -- $DAEMON_OPTS + test -f $PIDFILE || sleep 1 + if running ; then + echo "$NAME." + else + echo " ERROR." + fi + ;; + stop) + echo -n "Stopping $DESC: " + start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE + echo "$NAME." + ;; + force-stop) + echo -n "Forcefully stopping $DESC: " + force_stop + if ! running ; then + echo "$NAME." + else + echo " ERROR." + fi + ;; + #reload) + # + # If the daemon can reload its config files on the fly + # for example by sending it SIGHUP, do it here. + # + # If the daemon responds to changes in its config file + # directly anyway, make this a do-nothing entry. + # + # echo "Reloading $DESC configuration files." + # start-stop-daemon --stop --signal 1 --quiet --pidfile \ + # /var/run/$NAME.pid --exec $DAEMON + #;; + force-reload) + # + # If the "reload" option is implemented, move the "force-reload" + # option to the "reload" entry above. If not, "force-reload" is + # just the same as "restart" except that it does nothing if the + # daemon isn't already running. + # check wether $DAEMON is running. If so, restart + start-stop-daemon --stop --test --quiet --pidfile $PIDFILE \ + --startas $DAEMON \ + && $0 restart \ + || exit 0 + ;; + restart) + echo -n "Restarting $DESC: " + start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE + [ -n "$DODTIME" ] && sleep $DODTIME + start-stop-daemon --start --quiet --pidfile $PIDFILE \ + --startas $DAEMON -- $DAEMON_OPTS + echo "$NAME." + ;; + status) + echo -n "$LABEL is " + if running ; then + echo "running" + else + echo " not running." + exit 1 + fi + ;; + *) + N=/etc/init.d/$NAME + # echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2 + echo "Usage: $N {start|stop|restart|force-reload|status|force-stop}" >&2 + exit 1 + ;; +esac + +exit 0 diff --git a/puppet/modules/supervisor/manifests/app.pp b/puppet/modules/supervisor/manifests/app.pp index 7155062..c1f8f0e 100644 --- a/puppet/modules/supervisor/manifests/app.pp +++ b/puppet/modules/supervisor/manifests/app.pp @@ -3,6 +3,9 @@ define supervisor::app ( $command, $directory, $user = 'ubuntu', + $startsecs = undef, + $stopwaitsecs = undef, + $priority = undef, ) { $conf_file = "supervisor_${app_name}" diff --git a/puppet/modules/supervisor/manifests/init.pp b/puppet/modules/supervisor/manifests/init.pp index 7fc3b06..50d427c 100644 --- a/puppet/modules/supervisor/manifests/init.pp +++ b/puppet/modules/supervisor/manifests/init.pp @@ -16,8 +16,13 @@ class supervisor { subscribe => File['/etc/supervisord.conf'], } + case $operatingsystem { + debian: { $supervisord_conf = "puppet:///modules/supervisor/debian-isnok-initscript" } + ubuntu: { $supervisord_conf = "puppet:///modules/supervisor/ubuntu-initscript" } + } + file { '/etc/init.d/supervisord': - source => 'puppet:///modules/supervisor/debian-isnok', + source => $supervisord_conf, mode => '0755', } diff --git a/puppet/modules/supervisor/templates/supervisor.conf.erb b/puppet/modules/supervisor/templates/supervisor.conf.erb index c8be1dd..b49c739 100644 --- a/puppet/modules/supervisor/templates/supervisor.conf.erb +++ b/puppet/modules/supervisor/templates/supervisor.conf.erb @@ -5,3 +5,12 @@ user=<%= @user %> autostart=true autorestart=true redirect_stderr=True +<%- if @startsecs -%> +startsecs=<%= @startsecs %> +<%- end -%> +<%- if @stopwaitsecs -%> +stopwaitsecs=<%= @stopwaitsecs %> +<%- end -%> +<%- if @priority -%> +priority=<%= @priority %> +<%- end -%> -- libgit2 0.21.2