diff --git a/manifests/config.pp b/manifests/config.pp index b5ed388..aff0bdd 100644 --- a/manifests/config.pp +++ b/manifests/config.pp @@ -19,15 +19,24 @@ validate_string($java) validate_string($jar_name) + case $::osfamily { + 'debian': { + ensure_packages(["daemon"]) + Package["daemon"] -> File["init-script"] + } + default : {} + } + # prog is the 'name' of the init.d script. $prog = "selenium${name}" - file { "/etc/init.d/${prog}": + file { "init-script": ensure => 'file', + path => "/etc/init.d/${prog}", 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 3d37c4a..686881d 100644 --- a/manifests/params.pp +++ b/manifests/params.pp @@ -17,7 +17,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/spec/acceptance/selenium_hub_spec.rb b/spec/acceptance/selenium_hub_spec.rb index c0d7bb2..e89d1f4 100644 --- a/spec/acceptance/selenium_hub_spec.rb +++ b/spec/acceptance/selenium_hub_spec.rb @@ -16,8 +16,8 @@ class { 'selenium::hub': } EOS # Run it twice and test for idempotency - expect(apply_manifest(pp, :catch_failures => true).stderr).to eq("") - expect(apply_manifest(pp, :catch_changes => true).stderr).to eq("") + apply_manifest(pp, :catch_failures => true) + apply_manifest(pp, :catch_changes => true) end end @@ -33,7 +33,11 @@ class { 'selenium::hub': } it { should be_file } it { should be_owned_by 'selenium' } it { should be_grouped_into 'selenium' } - it { should be_mode 644} + if fact('operatingsystem') == 'Ubuntu' + it { should be_mode 664 } + else + it { should be_mode 644 } + end end end diff --git a/spec/acceptance/selenium_node_spec.rb b/spec/acceptance/selenium_node_spec.rb index 2270cc1..dc7b43f 100644 --- a/spec/acceptance/selenium_node_spec.rb +++ b/spec/acceptance/selenium_node_spec.rb @@ -16,8 +16,8 @@ class { 'selenium::node': } EOS # Run it twice and test for idempotency - expect(apply_manifest(pp, :catch_failures => true).stderr).to eq("") - expect(apply_manifest(pp, :catch_changes => true).stderr).to eq("") + apply_manifest(pp, :catch_failures => true) + apply_manifest(pp, :catch_changes => true) end end @@ -33,7 +33,11 @@ class { 'selenium::node': } it { should be_file } it { should be_owned_by 'selenium' } it { should be_grouped_into 'selenium' } - it { should be_mode 644} + if fact('operatingsystem') == 'Ubuntu' + it { should be_mode 664 } + else + it { should be_mode 644 } + end end end diff --git a/spec/acceptance/selenium_server_spec.rb b/spec/acceptance/selenium_server_spec.rb index 9eaed09..1019d25 100644 --- a/spec/acceptance/selenium_server_spec.rb +++ b/spec/acceptance/selenium_server_spec.rb @@ -16,8 +16,8 @@ class { 'selenium::server': } EOS # Run it twice and test for idempotency - expect(apply_manifest(pp, :catch_failures => true).stderr).to eq("") - expect(apply_manifest(pp, :catch_changes => true).stderr).to eq("") + apply_manifest(pp, :catch_failures => true) + apply_manifest(pp, :catch_changes => true) end end @@ -33,7 +33,11 @@ class { 'selenium::server': } it { should be_file } it { should be_owned_by 'selenium' } it { should be_grouped_into 'selenium' } - it { should be_mode 644} + if fact('operatingsystem') == 'Ubuntu' + it { should be_mode 664 } + else + it { should be_mode 644 } + end end end diff --git a/spec/acceptance/selenium_spec.rb b/spec/acceptance/selenium_spec.rb index 0930e58..67461c7 100644 --- a/spec/acceptance/selenium_spec.rb +++ b/spec/acceptance/selenium_spec.rb @@ -12,8 +12,8 @@ class { 'selenium': } EOS # Run it twice and test for idempotency - expect(apply_manifest(pp, :catch_failures => true).stderr).to eq("") - expect(apply_manifest(pp, :catch_changes => true).stderr).to eq("") + apply_manifest(pp, :catch_failures => true) + apply_manifest(pp, :catch_changes => true) end end diff --git a/spec/unit/classes/selenium_params_spec.rb b/spec/unit/classes/selenium_params_spec.rb index 8d9919e..dfe773a 100644 --- a/spec/unit/classes/selenium_params_spec.rb +++ b/spec/unit/classes/selenium_params_spec.rb @@ -7,18 +7,24 @@ it { should contain_class('selenium::params') } end + + context 'for osfamily Debian' do + let(:facts) {{ :osfamily => 'Debian' }} + + it { should contain_class('selenium::params') } + end context 'unsupported osfamily' do let :facts do { - :osfamily => 'Debian', - :operatingsystem => 'Debian', + :osfamily => 'Suse', + :operatingsystem => 'SuSE', } end it 'should fail' do expect { should contain_class('selenium::params') }. - to raise_error(Puppet::Error, /not supported on Debian/) + to raise_error(Puppet::Error, /not supported on SuSE/) end end diff --git a/spec/unit/defines/selenium_config_spec.rb b/spec/unit/defines/selenium_config_spec.rb index 3ac7dc1..69cf18a 100644 --- a/spec/unit/defines/selenium_config_spec.rb +++ b/spec/unit/defines/selenium_config_spec.rb @@ -14,12 +14,13 @@ :options => '-Dwebdriver.enable.native.events=1', :java => 'java', } - + p.merge!(params) if params it do - should contain_file("/etc/init.d/selenium#{title}").with({ + should contain_file('init-script').with({ 'ensure' => 'file', + 'path' => "/etc/init.d/selenium#{title}", 'owner' => 'root', 'group' => 'root', 'mode' => '0755', diff --git a/templates/init.d/debian.selenium.erb b/templates/init.d/debian.selenium.erb new file mode 100644 index 0000000..e5519ad --- /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: <%= @prog %> +# 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