f7c67694f2d1cd4290db842ecca9cca25843b71f
[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     #tests
34     if [[ -z $jenkinsuser || -z $jenkinshome ]]; then
35         echo "jenkinsuser or home not defined, please edit this file to define it"
36         exit 1
37     fi
38
39     if [[ $(pwd) != "$jenkinshome" ]]; then
40         echo "This script needs to be run from the jenkins users home dir"
41         exit 1
42     fi
43
44     if [[ -z $slave_name || -z $slave_secret ]]; then
45         echo "slave name or secret not defined, please edit this file to define it"
46         exit 1
47     fi
48
49     if [[ $(whoami) != "root" && $(whoami) != "$jenkinsuser"  ]]; then
50         echo "This script must be run as user root or jenkins user"
51         exit 1
52     fi
53
54     if [[ $(whoami) != "root" ]]; then
55       if sudo -l | grep "requiretty"  | grep -v "\!requiretty"; then
56         echo "please comment out Defaults requiretty from /etc/sudoers"
57         exit 1
58       fi
59     fi
60
61     #make pid dir
62     pidfile="/var/run/$jenkinsuser/jenkins_jnlp_pid"
63     if ! [ -d /var/run/$jenkinsuser/ ]; then
64         sudo mkdir /var/run/$jenkinsuser/
65         sudo 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
85         if [ -d /etc/monit/conf.d ]; then
86             monitconfdir="/etc/monit/conf.d/"
87         elif [ -d /etc/monit.d ]; then
88             monitconfdir="/etc/monit.d"
89         else
90             echo "Could not determine the location of the monit configuration file."
91             echo "Make sure monit is installed."
92             exit 1
93         fi
94
95         chown=$(type -p chown)
96         mkdir=$(type -p mkdir)
97
98         makemonit () {
99             echo "Writing the following as monit config:"
100         cat << EOF | tee $monitconfdir/jenkins
101 check directory jenkins_piddir path /var/run/$jenkinsuser
102 if does not exist then exec "$mkdir -p /var/run/$jenkinsuser"
103 if failed uid $jenkinsuser then exec "$chown $jenkinsuser /var/run/$jenkinsuser"
104 if failed gid $jenkinsuser then exec "$chown :$jenkinsuser /var/run/$jenkinsuser"
105
106 check process jenkins with pidfile /var/run/$jenkinsuser/jenkins_jnlp_pid every 2 cycles
107 start program = "/usr/bin/sudo -u $jenkinsuser /bin/bash -c 'cd $jenkinshome; export started_monit=true; $0 $@' with timeout 60 seconds"
108 stop program = "/bin/bash -c '/bin/kill \$(/bin/cat /var/run/$jenkinsuser/jenkins_jnlp_pid)'"
109 depends on jenkins_piddir
110 EOF
111         }
112
113         if [[ -f $monitconfdir/jenkins ]]; then
114             #test for diff
115             if [[ "$(diff $monitconfdir/jenkins <(echo "\
116 check directory jenkins_piddir path /var/run/$jenkinsuser
117 if does not exist then exec \"$mkdir -p /var/run/$jenkinsuser\"
118 if failed uid $jenkinsuser then exec \"$chown $jenkinsuser /var/run/$jenkinsuser\"
119 if failed gid $jenkinsuser then exec \"$chown :$jenkinsuser /var/run/$jenkinsuser\"
120
121 check process jenkins with pidfile /var/run/$jenkinsuser/jenkins_jnlp_pid every 2 cycles
122 start program = \"/usr/bin/sudo -u $jenkinsuser /bin/bash -c 'cd $jenkinshome; export started_monit=true; $0 $@' with timeout 60 seconds\"
123 stop program = \"/bin/bash -c '/bin/kill \$(/bin/cat /var/run/$jenkinsuser/jenkins_jnlp_pid)'\"
124 depends on jenkins_piddir\
125 ") )" ]]; then
126                 echo "Updating monit config..."
127                 makemonit $@
128             fi
129         else
130             makemonit $@
131         fi
132     fi
133
134     if [[ $started_monit == "true" ]]; then
135         wget --timestamping https://build.opnfv.org/ci/jnlpJars/slave.jar && true
136         chown $jenkinsuser:$jenkinsuser slave.jar
137
138         if [[ -f /var/run/$jenkinsuser/jenkins_jnlp_pid ]]; then
139             echo "pid file found"
140             if ! kill -0 "$(/bin/cat /var/run/$jenkinsuser/jenkins_jnlp_pid)"; then
141                 echo "no java process running cleaning up pid file"
142                 rm -f /var/run/$jenkinsuser/jenkins_jnlp_pid;
143             else
144                 echo "java connection process found and running already running quitting."
145                 exit 1
146             fi
147         fi
148
149         if [[ $run_in_foreground == true ]]; then
150             $connectionstring
151         else
152             exec $connectionstring &
153             echo $! > /var/run/$jenkinsuser/jenkins_jnlp_pid
154         fi
155     else
156         echo "you are ready to start monit"
157         echo "eg: service monit start"
158         echo "example debug mode if you are having problems:  /usr/bin/monit -Ivv -c /etc/monit.conf "
159         exit 0
160     fi
161 }
162
163 usage() {
164     cat << EOF
165
166 **this file must be copied to the jenkins home directory to work**
167 jenkins-jnlp-connect.sh configures monit to keep slave connection up
168 Checks for new versions of slave.jar
169 run as root to create pid directory and create monit config.
170 can be run as root additional times if you change variables and need to update monit config.
171 after running as root you should see "you are ready to start monit"
172
173 usage: $0 [OPTIONS]
174  -h  show this message
175  -j  set jenkins home
176  -u  set jenkins user
177  -n  set slave name
178  -s  set secret key
179  -t  test the connection string by connecting without monit
180  -f  test firewall
181
182 Example: $0 -j /home/jenkins -u jenkins -n lab1 -s 727fdefoofoofoofoofoofoofof800
183 note: a trailing slash on -j /home/jenkins will break the script
184 EOF
185
186     exit 1
187 }
188
189 if [[ -z "$@" ]]; then
190     usage
191 fi
192
193 while getopts "j:u:n:s:htf" OPTION
194 do
195     case $OPTION in
196         j ) jenkinshome="$OPTARG" ;;
197         u ) jenkinsuser="$OPTARG" ;;
198         n ) slave_name="$OPTARG" ;;
199         s ) slave_secret="$OPTARG";;
200         h ) usage ;;
201         t ) started_monit=true
202             skip_monit=true
203             run_in_foreground=true ;;
204         f ) test_firewall ;;
205         \? ) echo "Unknown option: -$OPTARG" >&2; exit 1;;
206     esac
207 done
208
209 connectionstring="java -jar slave.jar -jnlpUrl https://build.opnfv.org/ci/computer/"$slave_name"/slave-agent.jnlp -secret "$slave_secret" -noCertificateCheck "
210
211 main "$@"