Merge "utils/jenkins-jnlp-connect.sh: Make sure the pid directory exists"
[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"; 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         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
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         makemonit () {
96             echo "Writing the following as monit config:"
97         cat << EOF | tee $monitconfdir/jenkins
98 check directory jenkins_piddir path /var/run/$jenkinsuser
99 if does not exist then exec "/usr/bin/mkdir -p /var/run/$jenkinsuser"
100 if failed uid $jenkinsuser then exec "/usr/bin/chown $jenkinsuser /var/run/$jenkinsuser"
101 if failed gid $jenkinsuser then exec "/usr/bin/chown :$jenkinsuser /var/run/$jenkinsuser"
102
103 check process jenkins with pidfile /var/run/$jenkinsuser/jenkins_jnlp_pid
104 start program = "/usr/bin/sudo -u $jenkinsuser /bin/bash -c 'cd $jenkinshome; export started_monit=true; $0 $@' with timeout 60 seconds"
105 stop program = "/bin/bash -c '/bin/kill \$(/bin/cat /var/run/$jenkinsuser/jenkins_jnlp_pid)'"
106 depends on jenkins_piddir
107 EOF
108         }
109
110         if [[ -f $monitconfdir/jenkins ]]; then
111             #test for diff
112             if [[ "$(diff $monitconfdir/jenkins <(echo "\
113 check directory jenkins_piddir path /var/run/$jenkinsuser
114 if does not exist then exec \"/usr/bin/mkdir -p /var/run/$jenkinsuser\"
115 if failed uid $jenkinsuser then exec \"/usr/bin/chown $jenkinsuser /var/run/$jenkinsuser\"
116 if failed gid $jenkinsuser then exec \"/usr/bin/chown :$jenkinsuser /var/run/$jenkinsuser\"
117
118 check process jenkins with pidfile /var/run/$jenkinsuser/jenkins_jnlp_pid
119 start program = \"/usr/bin/sudo -u $jenkinsuser /bin/bash -c 'cd $jenkinshome; export started_monit=true; $0 $@' with timeout 60 seconds\"
120 stop program = \"/bin/bash -c '/bin/kill \$(/bin/cat /var/run/$jenkinsuser/jenkins_jnlp_pid)'\"
121 depends on jenkins_piddir\
122 ") )" ]]; then
123                 echo "Updating monit config..."
124                 makemonit $@
125             fi
126         else
127             makemonit $@
128         fi
129     fi
130
131     if [[ $started_monit == "true" ]]; then
132         wget --timestamping https://build.opnfv.org/ci/jnlpJars/slave.jar && true
133         chown $jenkinsuser:$jenkinsuser slave.jar
134
135         if [[ -f /var/run/$jenkinsuser/jenkins_jnlp_pid ]]; then
136             echo "pid file found"
137             if ! kill -0 "$(/bin/cat /var/run/$jenkinsuser/jenkins_jnlp_pid)"; then
138                 echo "no java process running cleaning up pid file"
139                 rm -f /var/run/$jenkinsuser/jenkins_jnlp_pid;
140             else
141                 echo "java connection process found and running already running quitting."
142                 exit 1
143             fi
144         fi
145
146         if [[ $run_in_foreground == true ]]; then
147             $connectionstring
148         else
149             exec $connectionstring &
150             echo $! > /var/run/$jenkinsuser/jenkins_jnlp_pid
151         fi
152     else
153         echo "you are ready to start monit"
154         echo "eg: service monit start"
155         echo "example debug mode if you are having problems:  /usr/bin/monit -Ivv -c /etc/monit.conf "
156         exit 0
157     fi
158 }
159
160 usage() {
161     cat << EOF
162
163 **this file must be copied to the jenkins home directory to work**
164 jenkins-jnlp-connect.sh configures monit to keep slave connection up
165 Checks for new versions of slave.jar
166 run as root to create pid directory and create monit config.
167 can be run as root additional times if you change variables and need to update monit config.
168 after running as root you should see "you are ready to start monit"
169
170 usage: $0 [OPTIONS]
171  -h  show this message
172  -j  set jenkins home
173  -u  set jenkins user
174  -n  set slave name
175  -s  set secret key
176  -t  test the connection string by connecting without monit
177  -f  test firewall
178
179 Example: $0 -j /home/jenkins -u jenkins -n lab1 -s 727fdefoofoofoofoofoofoofof800
180 note: a trailing slash on -j /home/jenkins will break the script
181 EOF
182
183     exit 1
184 }
185
186 if [[ -z "$@" ]]; then
187     usage
188 fi
189
190 while getopts "j:u:n:s:htf" OPTION
191 do
192     case $OPTION in
193         j ) jenkinshome="$OPTARG" ;;
194         u ) jenkinsuser="$OPTARG" ;;
195         n ) slave_name="$OPTARG" ;;
196         s ) slave_secret="$OPTARG";;
197         h ) usage ;;
198         t ) started_monit=true
199             skip_monit=true
200             run_in_foreground=true ;;
201         f ) test_firewall ;;
202         \? ) echo "Unknown option: -$OPTARG" >&2; exit 1;;
203     esac
204 done
205
206 connectionstring="java -jar slave.jar -jnlpUrl https://build.opnfv.org/ci/computer/"$slave_name"/slave-agent.jnlp -secret "$slave_secret" -noCertificateCheck "
207
208 main "$@"