Fix the "The controller is not up" problem caused by the fuel9.0 changing the online...
[releng.git] / utils / jenkins-jnlp-connect.sh
1 #!/bin/bash
2 # SPDX-license-identifier: Apache-2.0
3 ##############################################################################
4 # Copyright (c) 2016 Linux Foundation and others.
5 # All rights reserved. This program and the accompanying materials
6 # are made available under the terms of the Apache License, Version 2.0
7 # which accompanies this distribution, and is available at
8 # http://www.apache.org/licenses/LICENSE-2.0
9 ##############################################################################
10
11 #Monit setup script for opnfv jnlp slave connections
12
13 test_firewall() {
14     echo "testing that the firewall is open for us at build.opnfv.org"
15     test=$(echo "blah"| nc -w 4 build.opnfv.org 57387 > /dev/null 2>&1; echo $?)
16     if [[ $test == 0 ]]; then
17         echo "Firewall is open for us at build.opnfv.org"
18         exit 0
19     else
20         cat << EOF
21 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
22 opnfv-helpdesk@rt.linuxfoundation.org
23 Jenkins Home: $jenkinshome
24 Jenkins User: $jenkinsuser
25 Slave Name: $slave_name
26 IP Address: $(curl -s http://icanhazip.com)
27 EOF
28         exit 1
29     fi
30 }
31
32 main () {
33     dir=$(cd $(dirname $0); pwd)
34
35     #tests
36     if [[ -z $jenkinsuser || -z $jenkinshome ]]; then
37         echo "jenkinsuser or home not defined, please edit this file to define it"
38         exit 1
39     fi
40
41     if [[ -z $slave_name || -z $slave_secret ]]; then
42         echo "slave name or secret not defined, please edit this file to define it"
43         exit 1
44     fi
45
46     if [[ $(whoami) != "root" && $(whoami) != "$jenkinsuser"  ]]; then
47         echo "This script must be run as user root or jenkins user"
48         exit 1
49     fi
50
51     if [ -d /etc/monit/conf.d ]; then
52         monitconfdir="/etc/monit/conf.d/"
53     elif [ -d /etc/monit.d ]; then
54         monitconfdir="/etc/monit.d"
55     else
56         echo "Could not determine the location of the monit configuration file."
57         echo "Make sure monit is installed."
58         exit 1
59     fi
60
61     #make pid dir
62     pidfile="/var/run/$jenkinsuser/jenkins_jnlp_pid"
63     if ! [ -d /var/run/$jenkinsuser/ ]; then
64         mkdir /var/run/$jenkinsuser/
65         chown $jenkinsuser:$jenkinsuser /var/run/$jenkinsuser/
66     fi
67
68     if [[ $skip_monit != true ]]; then
69         #check for monit
70         if [ $(which monit) ]; then
71             echo "monit installed"
72         else
73             if [ -n "$(command -v yum)" ]; then
74                 echo "please install monit; eg: yum -y install monit"
75                 exit 1
76             elif [ -n "$(command -v apt-get)" ]; then
77                 echo "please install monit; eg: apt-get install -y monit"
78                 exit 1
79             else
80                 echo "system not supported plese contact help desk"
81                 exit 1
82             fi
83         fi
84     fi
85
86     makemonit () {
87         echo "Writing the following as monit config:"
88         cat << EOF | tee $monitconfdir/jenkins
89 check process jenkins with pidfile /var/run/$jenkinsuser/jenkins_jnlp_pid
90 start program = "/usr/bin/sudo -u $jenkinsuser /bin/bash -c 'cd $dir; export started_monit=true; $0 $@'"
91 stop program = "/bin/bash -c '/bin/kill \$(/bin/cat /var/run/$jenkinsuser/jenkins_jnlp_pid)'"
92 EOF
93     }
94
95     if [[ -f $monitconfdir/jenkins ]]; then
96         #test for diff
97         if [[ "$(diff $monitconfdir/jenkins <(echo "\
98 check process jenkins with pidfile /var/run/$jenkinsuser/jenkins_jnlp_pid
99 start program = \"/usr/bin/sudo -u $jenkinsuser /bin/bash -c 'cd $dir; export started_monit=true; $0 $@'\"
100 stop program = \"/bin/bash -c '/bin/kill \$(/bin/cat /var/run/$jenkinsuser/jenkins_jnlp_pid)'\"\
101 ") )" ]]; then
102             echo "Updating monit config..."
103             makemonit $@
104         fi
105     else
106         makemonit $@
107     fi
108
109 if [[ $started_monit == "true" ]]; then
110     wget --timestamping https://build.opnfv.org/ci/jnlpJars/slave.jar && true
111     chown $jenkinsuser:$jenkinsuser slave.jar
112
113     if [[ -f /var/run/$jenkinsuser/jenkins_jnlp_pid ]]; then
114         echo "pid file found"
115         if ! kill -0 "$(/bin/cat /var/run/$jenkinsuser/jenkins_jnlp_pid)"; then
116             echo "no java process running cleaning up pid file"
117             rm -f /var/run/$jenkinsuser/jenkins_jnlp_pid;
118         else
119             echo "java connection process found and running already running quitting."
120             exit 1
121         fi
122     fi
123
124     if [[ $run_in_foreground == true ]]; then
125         $connectionstring
126     else
127         exec $connectionstring &
128         echo $! > /var/run/$jenkinsuser/jenkins_jnlp_pid
129     fi
130 else
131     echo "you are ready to start monit"
132     echo "eg: service monit start"
133     echo "example debug mode if you are having problems:  /usr/bin/monit -Ivv -c /etc/monit.conf "
134     exit 0
135 fi
136 }
137
138 usage() {
139     cat << EOF
140
141 jenkins-jnlp-connect.sh configures monit to keep slave connection up
142 Checks for new versions of slave.jar
143 run as root to create pid directory and create monit config.
144 can be run as root additional times if you change variables and need to update monit config.
145 after running as root you should see "you are ready to start monit"
146
147 usage: $0 [OPTIONS]
148  -h  show this message
149  -j  set jenkins home
150  -u  set jenkins user
151  -n  set slave name
152  -s  set secret key
153  -t  test the connection string by connecting without monit
154  -f  test firewall
155
156 Example: $0 -j /home/jenkins/ -u jenkins -n lab1 -s 727fdefoofoofoofoofoofoofof800
157 EOF
158
159     exit 1
160 }
161
162 if [[ -z "$@" ]]; then
163     usage
164 fi
165
166 while getopts "j:u:n:s:htf" OPTION
167 do
168     case $OPTION in
169         j ) jenkinshome="$OPTARG" ;;
170         u ) jenkinsuser="$OPTARG" ;;
171         n ) slave_name="$OPTARG" ;;
172         s ) slave_secret="$OPTARG";;
173         h ) usage ;;
174         t ) started_monit=true
175             skip_monit=true
176             run_in_foreground=true ;;
177         f ) test_firewall ;;
178         \? ) echo "Unknown option: -$OPTARG" >&2; exit 1;;
179     esac
180 done
181
182 connectionstring="java -jar slave.jar -jnlpUrl https://build.opnfv.org/ci/computer/"$slave_name"/slave-agent.jnlp -secret "$slave_secret" -noCertificateCheck "
183
184 main "$@"