Script to configure monit for jnlp slave connections 91/2491/21
authorAric Gardner <agardner@linuxfoundation.org>
Tue, 13 Oct 2015 11:48:30 +0000 (07:48 -0400)
committerFatih Degirmenci <fatih.degirmenci@ericsson.com>
Tue, 3 Nov 2015 09:22:04 +0000 (09:22 +0000)
added optargs
added test mode to test connection without monit
Creates and/or updates monit config
Updates slave.jar before each connection
Monit will restart slave connection if it drops.
detects distro
can generate a help desk email template if firewall not open

JIRA: RELENG-42

Change-Id: I237eda32ac59a57202811bc1d0c7ce29010ac71d
Signed-off-by: Aric Gardner <agardner@linuxfoundation.org>
utils/jenkins-jnlp-connect.sh [new file with mode: 0755]

diff --git a/utils/jenkins-jnlp-connect.sh b/utils/jenkins-jnlp-connect.sh
new file mode 100755 (executable)
index 0000000..d048859
--- /dev/null
@@ -0,0 +1,177 @@
+#!/bin/bash
+#Monit setup script for opnfv jnlp slave connections
+
+test_firewall() {
+echo "testing that the firewall is open for us at build.opnfv.org"
+test=$(echo "blah"| nc -w 4 build.opnfv.org 57387 > /dev/null 2>&1; echo $?)
+if [[ $test == 0 ]]; then
+  echo "Firewall is open for us at build.opnfv.org"
+  exit 0
+else
+cat << EOF
+LF firewall not open, please send a report to helpdesk with your gpg key attached, or better yet upload it to the key servers. (I should be able to find it with gpg --search-keys your@company.email.com
+opnfv-helpdesk@rt.linuxfoundation.org
+Jenkins Home: $jenkinshome
+Jenkins User: $jenkinsuser
+Slave Name: $slave_name
+IP Address: $(curl -s http://icanhazip.com)
+EOF
+exit 1
+fi
+}
+
+main () {
+dir=$(cd $(dirname $0); pwd)
+
+#tests
+if [[ -z $jenkinsuser || -z $jenkinshome ]]; then
+  echo "jenkinsuser or home not defined, please edit this file to define it"
+  exit 1
+fi
+
+if [[ -z $slave_name || -z $slave_secret ]]; then
+  echo "slave name or secret not defined, please edit this file to define it"
+  exit 1
+fi
+
+if [[ $(whoami) != "root" && $(whoami) != "$jenkinsuser"  ]]; then
+  echo "This script must be run as user root or jenkins user"
+  exit 1
+fi
+
+if [[ $distro == Debian || $distro == Ubuntu ]]; then
+  monitconfdir="/etc/monit/conf.d/"
+elif [[ $distro == Fedora || $distro == CentOS || $distro == Redhat ]]; then
+  monitconfdir="/etc/monit.d"
+fi
+
+#make pid dir
+pidfile="/var/run/$jenkinsuser/jenkins_jnlp_pid"
+if ! [ -d /var/run/$jenkinsuser/ ]; then
+  mkdir   /var/run/$jenkinsuser/
+  chown $jenkinsuser:$jenkinsuser /var/run/$jenkinsuser/
+fi
+
+
+
+if [[ $skip_monit == true ]]; then
+  :
+else
+  #check for monit
+  if [ $(which monit) ]; then
+    echo "monit installed"
+  else
+    if [ -n "$(command -v yum)" ]; then
+      echo "please install monit; eg: yum -y install monit"
+      exit 1
+    elif [ -n "$(command -v apt-get)" ]; then
+      echo "please install monit  eg: apt-get install -y monit"
+      exit 1
+    else
+      echo "system not supported plese contact help desk"
+      exit 1
+    fi
+  fi
+fi
+
+makemonit () {
+echo "Writing the following as monit config:"
+cat << EOF | tee $monitconfdir/jenkins
+check process jenkins with pidfile /var/run/$jenkinsuser/jenkins_jnlp_pid
+start program = "/bin/bash -c 'cd $dir; export started_monit=true; $0 $@'" as uid "$jenkinsuser" and gid "$jenkinsuser"
+stop program = "/bin/bash -c '/bin/kill \$(/bin/cat /var/run/$jenkinsuser/jenkins_jnlp_pid)'"
+EOF
+}
+
+if [[ -f $monitconfdir/jenkins ]]; then
+  #test for diff
+  if [[ "$(diff $monitconfdir/jenkins <(echo "\
+check process jenkins with pidfile /var/run/$jenkinsuser/jenkins_jnlp_pid
+start program = \"/bin/bash -c 'cd $dir; export started_monit=true; $0 $@'\" as uid \"$jenkinsuser\" and gid \"$jenkinsuser\"
+stop program = \" /bin/bash -c '/bin/kill \$(/bin/cat /var/run/$jenkinsuser/jenkins_jnlp_pid)'\"\
+") )" ]]; then
+    echo "Updating monit config..."
+    makemonit $@
+  fi
+else
+  makemonit $@
+fi
+
+
+if [[ $started_monit == "true" ]]; then
+wget --timestamping https://build.opnfv.org/ci/jnlpJars/slave.jar && true
+
+if [[ -f /var/run/$jenkinsuser/jenkins_jnlp_pid ]];
+then echo "pid file found"
+        if ! kill -0 "$(/bin/cat /var/run/$jenkinsuser/jenkins_jnlp_pid)"; then
+                echo "no java process running cleaning up pid file"
+                rm -f /var/run/$jenkinsuser/jenkins_jnlp_pid;
+        else
+                echo "java connection process found and running already running quitting."
+                exit 1
+
+        fi
+fi
+
+exec $connectionstring &
+echo $! > /var/run/$jenkinsuser/jenkins_jnlp_pid
+#trap 'rm -f "$pidfile"; exit' EXIT SIGQUIT SIGINT SIGSTOP SIGTERM
+
+else
+  echo "you are ready to start monit"
+  echo "eg: service monit start"
+  echo "example debug mode if you are having problems:  /usr/bin/monit -Ivv -c /etc/monit.conf "
+  exit 0
+fi
+
+}
+
+usage() {
+cat << EOF
+
+jenkins-jnlp-connect.sh configures monit to keep slave connection up
+Checks for new versions of slave.jar
+run as root to create pid directory and create monit config.
+can be run as root additional times if you change variables and need to update monit config.
+after running as root you should see "you are ready to start monit"
+
+usage: $0 [OPTIONS]
+ -h  show this message
+ -j  set jenkins home
+ -u  set jenkins user
+ -n  set slave name
+ -s  set secret key
+ -t  test the connection string by connecting without monit
+ -f  test firewall
+
+Example: $0 -j /home/jenkins/ -u jenkins -n lab1 -s 727fdefoofoofoofoofoofoofof800
+
+EOF
+
+exit 1
+
+}
+
+if [[ -z "$@" ]]; then usage
+fi
+
+
+while getopts "j:u:n:s:htf" OPTION
+do
+        case $OPTION in
+                j ) jenkinshome="$OPTARG" ;;
+                u ) jenkinsuser="$OPTARG" ;;
+                n ) slave_name="$OPTARG" ;;
+                s ) slave_secret="$OPTARG";;
+                h ) usage; exit;;
+                t ) started_monit=true
+                    skip_monit=true ;;
+                f ) test_firewall ;;
+                \? ) echo "Unknown option: -$OPTARG" >&2; exit 1;;
+        esac
+done
+
+connectionstring="java -jar slave.jar -jnlpUrl https://build.opnfv.org/ci/computer/"$slave_name"/slave-agent.jnlp -secret "$slave_secret" -noCertificateCheck "
+distro="$(tr -s ' \011' '\012' < /etc/issue | head -n 1)"
+
+main "$@"