From b0b97a0b293ce407490b8c71d14feb2526cef22c Mon Sep 17 00:00:00 2001 From: Doug Fitzmaurice Date: Tue, 30 Sep 2014 14:56:32 +0100 Subject: [PATCH 1/9] 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 From 4456cf64b1d86419947956bcd68ba28331d585bf Mon Sep 17 00:00:00 2001 From: Doug Fitzmaurice Date: Fri, 3 Oct 2014 12:12:56 +0100 Subject: [PATCH 2/9] Test fixes for OS support --- spec/unit/classes/selenium_params_spec.rb | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) 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 From a6c688efe40ed8eb53324d1edf9a3f04ebf24fb5 Mon Sep 17 00:00:00 2001 From: Markus Rekkenbeil Date: Thu, 16 Oct 2014 11:47:17 +0200 Subject: [PATCH 3/9] Fix debian init.d template To avoid errors with update-rc.d / insserv and a grid + node setup --- templates/init.d/debian.selenium.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/init.d/debian.selenium.erb b/templates/init.d/debian.selenium.erb index b80826d..e5519ad 100644 --- a/templates/init.d/debian.selenium.erb +++ b/templates/init.d/debian.selenium.erb @@ -4,7 +4,7 @@ # Amelia A Lewis # ### BEGIN INIT INFO -# Provides: seleniumserver +# Provides: <%= @prog %> # Required-Start: $remote_fs $syslog $network # Required-Stop: $remote_fs $syslog $network # Default-Start: 2 3 4 5 From eec17bfa2db48640bfe1a4e553c8c650ac5b0b63 Mon Sep 17 00:00:00 2001 From: Doug Fitzmaurice Date: Sun, 2 Nov 2014 15:11:33 +0000 Subject: [PATCH 4/9] Resource ordering and lint fixes Added ensure_package call, and explicit ordering to ensure it runs before the init script is generated. Added a default block to the switch. --- manifests/config.pp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/manifests/config.pp b/manifests/config.pp index 77a22a1..aff0bdd 100644 --- a/manifests/config.pp +++ b/manifests/config.pp @@ -21,17 +21,18 @@ case $::osfamily { 'debian': { - package { "daemon": - ensure => "installed" - } + 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', From 8288b6440451146568a8c524cde7170299c8246a Mon Sep 17 00:00:00 2001 From: Josh Holland Date: Wed, 20 May 2015 17:15:54 +0100 Subject: [PATCH 5/9] Fix test failures --- spec/unit/defines/selenium_config_spec.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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', From bc82b725513081c390a8afabc8c666834482b22f Mon Sep 17 00:00:00 2001 From: Josh Holland Date: Thu, 21 May 2015 18:00:00 +0100 Subject: [PATCH 6/9] Fix acceptance tests for Ubuntu --- spec/acceptance/selenium_hub_spec.rb | 6 +++++- spec/acceptance/selenium_node_spec.rb | 6 +++++- spec/acceptance/selenium_server_spec.rb | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/spec/acceptance/selenium_hub_spec.rb b/spec/acceptance/selenium_hub_spec.rb index 238db0f..e89d1f4 100644 --- a/spec/acceptance/selenium_hub_spec.rb +++ b/spec/acceptance/selenium_hub_spec.rb @@ -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 389c1ff..dc7b43f 100644 --- a/spec/acceptance/selenium_node_spec.rb +++ b/spec/acceptance/selenium_node_spec.rb @@ -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 92f1a8a..1019d25 100644 --- a/spec/acceptance/selenium_server_spec.rb +++ b/spec/acceptance/selenium_server_spec.rb @@ -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 From c08252d2a383ab395b1a364cf936092ca6f66052 Mon Sep 17 00:00:00 2001 From: Joshua Hoblitt Date: Sat, 23 May 2015 09:10:55 -0700 Subject: [PATCH 7/9] add debian 7.8 nodeset --- spec/acceptance/nodesets/debian-7.8.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 spec/acceptance/nodesets/debian-7.8.yml diff --git a/spec/acceptance/nodesets/debian-7.8.yml b/spec/acceptance/nodesets/debian-7.8.yml new file mode 100644 index 0000000..652642c --- /dev/null +++ b/spec/acceptance/nodesets/debian-7.8.yml @@ -0,0 +1,9 @@ +HOSTS: + debian-7.8: + roles: + - master + platform: debian-7-amd64 + box: chef/debian-7.8 + hypervisor: vagrant +CONFIG: + type: foss From 4e11d8697398af2abdbfa5771ac500d4659a0844 Mon Sep 17 00:00:00 2001 From: Joshua Hoblitt Date: Sat, 23 May 2015 16:17:43 -0700 Subject: [PATCH 8/9] fix whitespace errors --- spec/unit/classes/selenium_params_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/unit/classes/selenium_params_spec.rb b/spec/unit/classes/selenium_params_spec.rb index dfe773a..e5aecae 100644 --- a/spec/unit/classes/selenium_params_spec.rb +++ b/spec/unit/classes/selenium_params_spec.rb @@ -7,7 +7,7 @@ it { should contain_class('selenium::params') } end - + context 'for osfamily Debian' do let(:facts) {{ :osfamily => 'Debian' }} @@ -21,7 +21,7 @@ :operatingsystem => 'SuSE', } end - + it 'should fail' do expect { should contain_class('selenium::params') }. to raise_error(Puppet::Error, /not supported on SuSE/) From 3c1962bad47ed7ba464298f5085e9499ff41d1e0 Mon Sep 17 00:00:00 2001 From: Joshua Hoblitt Date: Sat, 23 May 2015 16:17:57 -0700 Subject: [PATCH 9/9] fix linter errors --- manifests/config.pp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/manifests/config.pp b/manifests/config.pp index aff0bdd..ac6d12e 100644 --- a/manifests/config.pp +++ b/manifests/config.pp @@ -21,8 +21,8 @@ case $::osfamily { 'debian': { - ensure_packages(["daemon"]) - Package["daemon"] -> File["init-script"] + ensure_packages(['daemon']) + Package['daemon'] -> File['init-script'] } default : {} } @@ -30,9 +30,9 @@ # prog is the 'name' of the init.d script. $prog = "selenium${name}" - file { "init-script": + file { 'init-script': ensure => 'file', - path => "/etc/init.d/${prog}", + path => "/etc/init.d/${prog}", owner => 'root', group => 'root', mode => '0755',