diff options
author | Aric Gardner <agardner@linuxfoundation.org> | 2015-10-13 07:48:30 -0400 |
---|---|---|
committer | Fatih Degirmenci <fatih.degirmenci@ericsson.com> | 2015-11-03 09:22:04 +0000 |
commit | fb6e5333dec7223bc4aa397e0930a0e4eb48662e (patch) | |
tree | 0d461aca1d27d94316bb21a4751bfeff795ed5cd | |
parent | 37a4beacd198f7c797babb0210e5152e228077ae (diff) |
Script to configure monit for jnlp slave connections
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>
-rwxr-xr-x | utils/jenkins-jnlp-connect.sh | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/utils/jenkins-jnlp-connect.sh b/utils/jenkins-jnlp-connect.sh new file mode 100755 index 000000000..d048859c2 --- /dev/null +++ b/utils/jenkins-jnlp-connect.sh @@ -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 "$@" |