From b0b97a0b293ce407490b8c71d14feb2526cef22c Mon Sep 17 00:00:00 2001 From: Doug Fitzmaurice Date: Tue, 30 Sep 2014 14:56:32 +0100 Subject: [PATCH] Preliminary Debian support Added a new init.d file for Debian, which requires the "daemon" package.T This will be automatically required on Debian systems. --- manifests/config.pp | 10 +- manifests/params.pp | 7 +- templates/init.d/debian.selenium.erb | 231 ++++++++++++++++++ .../{selenium.erb => redhat.selenium.erb} | 0 4 files changed, 246 insertions(+), 2 deletions(-) create mode 100644 templates/init.d/debian.selenium.erb rename templates/init.d/{selenium.erb => redhat.selenium.erb} (100%) diff --git a/manifests/config.pp b/manifests/config.pp index b5ed388..77a22a1 100644 --- a/manifests/config.pp +++ b/manifests/config.pp @@ -19,6 +19,14 @@ validate_string($java) validate_string($jar_name) + case $::osfamily { + 'debian': { + package { "daemon": + ensure => "installed" + } + } + } + # prog is the 'name' of the init.d script. $prog = "selenium${name}" @@ -27,7 +35,7 @@ owner => 'root', group => 'root', mode => '0755', - content => template("${module_name}/init.d/selenium.erb"), + content => template("${module_name}/init.d/${selenium::params::service_template}"), } ~> service { $prog: ensure => running, diff --git a/manifests/params.pp b/manifests/params.pp index 025d3f2..dec2807 100644 --- a/manifests/params.pp +++ b/manifests/params.pp @@ -19,7 +19,12 @@ $download_timeout = '90' case $::osfamily { - 'redhat': {} + 'redhat': { + $service_template = 'redhat.selenium.erb' + } + 'debian': { + $service_template = 'debian.selenium.erb' + } default: { fail("Module ${module_name} is not supported on ${::operatingsystem}") } diff --git a/templates/init.d/debian.selenium.erb b/templates/init.d/debian.selenium.erb new file mode 100644 index 0000000..b80826d --- /dev/null +++ b/templates/init.d/debian.selenium.erb @@ -0,0 +1,231 @@ +#!/bin/bash +# /etc/init.d/seleniumserver +# debian-compatible seleniumserver startup script. +# Amelia A Lewis +# +### BEGIN INIT INFO +# Provides: seleniumserver +# Required-Start: $remote_fs $syslog $network +# Required-Stop: $remote_fs $syslog $network +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Start seleniumserver at boot time +# Description: Controls the selenium server engine. +### END INIT INFO + +PATH=/bin:/usr/bin:/sbin:/usr/sbin + +DESC="Selenium Remote Control Server" +NAME='<%= @prog %>' +SCRIPTNAME=/etc/init.d/$NAME +PIDFILE=/var/run/$NAME/$NAME.pid +SELENIUM_USER='<%= @user %>' +SELENIUM_INSTALL_ROOT='<%= @install_root %>' +SELENIUM_JAR_NAME='<%= @jar_name %>' +SELENIUM_JAR="${SELENIUM_INSTALL_ROOT}/jars/${SELENIUM_JAR_NAME}" +SELENIUM_LOG_NAME='<%= @name %>' +SELENIUM_LOG="${SELENIUM_INSTALL_ROOT}/log/${SELENIUM_LOG_NAME}_stdout.log" +SELENIUM_ERROR_LOG="${SELENIUM_INSTALL_ROOT}/log/${SELENIUM_LOG_NAME}_stderr.log" +SELENIUM_DISPLAY='<%= @display %>' +SELENIUM_OPTIONS='<%= @options %>' +HTTP_PORT=4444 +SELENIUM_ARGS="-port $HTTP_PORT" +SELENIUM_JAVA='<%= @java %>' + +[ -r /etc/default/$NAME ] && . /etc/default/$NAME + +DAEMON=/usr/bin/daemon +DAEMON_ARGS="--name=$NAME --inherit --output=$SELENIUM_LOG --pidfile=$PIDFILE --env='DISPLAY=${SELENIUM_DISPLAY}'" + +SU=/bin/su +# Exit if the package is not installed +[ -x "$DAEMON" ] || exit 0 + +# load environments +if [ -r /etc/default/locale ]; then + . /etc/default/locale + export LANG LANGUAGE +elif [ -r /etc/environment ]; then + . /etc/environment + export LANG LANGUAGE +fi + +# Load the VERBOSE setting and other rcS variables +. /lib/init/vars.sh + +# Define LSB log_* functions. +# Depend on lsb-base (>= 3.0-6) to ensure that this file is present. +. /lib/lsb/init-functions + +# Make sure we run as root, since setting the max open files through +# ulimit requires root access +if [ `id -u` -ne 0 ]; then + echo "The $NAME init script can only be run as root" + exit 1 +fi + +check_tcp_port() { + local service=$1 + local assigned=$2 + local default=$3 + + if [ -n "$assigned" ]; then + port=$assigned + else + port=$default + fi + + count=`netstat --listen --numeric-ports | grep \:$port[[:space:]] | grep -c . ` + + if [ $count -ne 0 ]; then + echo "The selected $service port ($port) seems to be in use by another program " + echo "Please select another port to use for $NAME" + return 1 + fi +} + +# +# Function that starts the daemon/service +# +do_start() +{ + # the default location is /var/run/seleniumserver/seleniumserver.pid but the parent directory needs to be created + mkdir `dirname $PIDFILE` > /dev/null 2>&1 || true + chown $SELENIUM_USER `dirname $PIDFILE` + # Return + # 0 if daemon has been started + # 1 if daemon was already running + # 2 if daemon could not be started + $DAEMON $DAEMON_ARGS --running && return 1 + + # Verify that the seleniumserver port is not already in use + check_tcp_port "http" "$HTTP_PORT" "4444" || return 1 + + # --user in daemon doesn't prepare environment variables like HOME, USER, LOGNAME or USERNAME, + # so we let su do so for us now + $SU -l $SELENIUM_USER --shell=/bin/bash -c "$DAEMON $DAEMON_ARGS -- java -jar ${SELENIUM_JAR} ${SELENIUM_OPTIONS} > ${SELENIUM_LOG} 2> ${SELENIUM_ERROR_LOG}" || return 2 +} + +# +# Verify that all seleniumserver processes have been shutdown +# and if not, then do killall for them +# +get_running() +{ + return `ps -U $SELENIUM_USER --no-headers -f | egrep -e '(java|daemon)' | grep -c . ` +} + +force_stop() +{ + get_running + if [ $? -ne 0 ]; then + killall -u $SELENIUM_USER java daemon || return 3 + fi +} + +# Get the status of the daemon process +get_daemon_status() +{ + $DAEMON $DAEMON_ARGS --running || return 1 +} + +# +# 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 + get_daemon_status + case "$?" in + 0) + $DAEMON $DAEMON_ARGS --stop || return 2 + # wait for the process to really terminate + for n in 1 2 3 4 5; do + sleep 1 + $DAEMON $DAEMON_ARGS --running || break + done + if get_daemon_status; then + force_stop || return 3 + fi + ;; + *) + force_stop || return 3 + ;; + esac + + # Many daemons don't delete their pidfiles when they exit. + rm -f $PIDFILE + return 0 +} + +case "$1" in + start) + log_daemon_msg "Starting $DESC" "$NAME" + do_start + case "$?" in + 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 + ;; + 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 + ;; + status) + get_daemon_status + case "$?" in + 0) echo "$DESC is running with the pid `cat $PIDFILE`";; + *) + get_running + procs=$? + if [ $procs -eq 0 ]; then + echo -n "$DESC is not running" + if [ -f $PIDFILE ]; then + echo ", but the pidfile ($PIDFILE) still exists" + else + echo + fi + else + echo "$procs instances of seleniumserver are running at the moment" + echo "but the pidfile $PIDFILE is missing" + fi + ;; + esac + ;; + *) + echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 + exit 3 + ;; +esac + +exit 0 diff --git a/templates/init.d/selenium.erb b/templates/init.d/redhat.selenium.erb similarity index 100% rename from templates/init.d/selenium.erb rename to templates/init.d/redhat.selenium.erb