utils: jenkins-jnlp-connect.sh: Fix start up script
[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
62     if [ -d /etc/monit/conf.d ]; then
63         monitconfdir="/etc/monit/conf.d/"
64     elif [ -d /etc/monit.d ]; then
65         monitconfdir="/etc/monit.d"
66     else
67         echo "Could not determine the location of the monit configuration file."
68         echo "Make sure monit is installed."
69         exit 1
70     fi
71
72     #make pid dir
73     pidfile="/var/run/$jenkinsuser/jenkins_jnlp_pid"
74     if ! [ -d /var/run/$jenkinsuser/ ]; then
75         mkdir /var/run/$jenkinsuser/
76         chown $jenkinsuser:$jenkinsuser /var/run/$jenkinsuser/
77     fi
78
79     if [[ $skip_monit != true ]]; then
80         #check for monit
81         if [ $(which monit) ]; then
82             echo "monit installed"
83         else
84             if [ -n "$(command -v yum)" ]; then
85                 echo "please install monit; eg: yum -y install monit"
86                 exit 1
87             elif [ -n "$(command -v apt-get)" ]; then
88                 echo "please install monit; eg: apt-get install -y monit"
89                 exit 1
90             else
91                 echo "system not supported plese contact help desk"
92                 exit 1
93             fi
94         fi
95     fi
96
97     makemonit () {
98         echo "Writing the following as monit config:"
99         cat << EOF | tee $monitconfdir/jenkins
100 check process jenkins with pidfile /var/run/$jenkinsuser/jenkins_jnlp_pid
101 start program = "/usr/bin/sudo -u $jenkinsuser /bin/bash -c 'cd $jenkinshome; export started_monit=true; $0 $@' with timeout 60 seconds"
102 stop program = "/bin/bash -c '/bin/kill \$(/bin/cat /var/run/$jenkinsuser/jenkins_jnlp_pid)'"
103 EOF
104     }
105
106     if [[ -f $monitconfdir/jenkins ]]; then
107         #test for diff
108         if [[ "$(diff $monitconfdir/jenkins <(echo "\
109 check process jenkins with pidfile /var/run/$jenkinsuser/jenkins_jnlp_pid
110 start program = \"/usr/bin/sudo -u $jenkinsuser /bin/bash -c 'cd $jenkinshome; export started_monit=true; $0 $@' with timeout 60 seconds\"
111 stop program = \"/bin/bash -c '/bin/kill \$(/bin/cat /var/run/$jenkinsuser/jenkins_jnlp_pid)'\"\
112 ") )" ]]; then
113             echo "Updating monit config..."
114             makemonit $@
115         fi
116     else
117         makemonit $@
118     fi
119
120 if [[ $started_monit == "true" ]]; then
121     wget --timestamping https://build.opnfv.org/ci/jnlpJars/slave.jar && true
122     chown $jenkinsuser:$jenkinsuser slave.jar
123
124     if [[ -f /var/run/$jenkinsuser/jenkins_jnlp_pid ]]; then
125         echo "pid file found"
126         if ! kill -0 "$(/bin/cat /var/run/$jenkinsuser/jenkins_jnlp_pid)"; then
127             echo "no java process running cleaning up pid file"
128             rm -f /var/run/$jenkinsuser/jenkins_jnlp_pid;
129         else
130             echo "java connection process found and running already running quitting."
131             exit 1
132         fi
133     fi
134
135     if [[ $run_in_foreground == true ]]; then
136         $connectionstring
137     else
138         exec $connectionstring &
139         echo $! > /var/run/$jenkinsuser/jenkins_jnlp_pid
140     fi
141 else
142     echo "you are ready to start monit"
143     echo "eg: service monit start"
144     echo "example debug mode if you are having problems:  /usr/bin/monit -Ivv -c /etc/monit.conf "
145     exit 0
146 fi
147 }
148
149 usage() {
150     cat << EOF
151
152 **this file must be copied to the jenkins home directory to work**
153 jenkins-jnlp-connect.sh configures monit to keep slave connection up
154 Checks for new versions of slave.jar
155 run as root to create pid directory and create monit config.
156 can be run as root additional times if you change variables and need to update monit config.
157 after running as root you should see "you are ready to start monit"
158
159 usage: $0 [OPTIONS]
160  -h  show this message
161  -j  set jenkins home
162  -u  set jenkins user
163  -n  set slave name
164  -s  set secret key
165  -t  test the connection string by connecting without monit
166  -f  test firewall
167
168 Example: $0 -j /home/jenkins/ -u jenkins -n lab1 -s 727fdefoofoofoofoofoofoofof800
169 EOF
170
171     exit 1
172 }
173
174 if [[ -z "$@" ]]; then
175     usage
176 fi
177
178 while getopts "j:u:n:s:htf" OPTION
179 do
180     case $OPTION in
181         j ) jenkinshome="$OPTARG" ;;
182         u ) jenkinsuser="$OPTARG" ;;
183         n ) slave_name="$OPTARG" ;;
184         s ) slave_secret="$OPTARG";;
185         h ) usage ;;
186         t ) started_monit=true
187             skip_monit=true
188             run_in_foreground=true ;;
189         f ) test_firewall ;;
190         \? ) echo "Unknown option: -$OPTARG" >&2; exit 1;;
191     esac
192 done
193
194 connectionstring="java -jar slave.jar -jnlpUrl https://build.opnfv.org/ci/computer/"$slave_name"/slave-agent.jnlp -secret "$slave_secret" -noCertificateCheck "
195
196 main "$@"