Merge "KVMFORNFV: Implementing kvmfornfv daily jobs."
[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 process jenkins with pidfile /var/run/$jenkinsuser/jenkins_jnlp_pid
99 start program = "/usr/bin/sudo -u $jenkinsuser /bin/bash -c 'cd $jenkinshome; export started_monit=true; $0 $@' with timeout 60 seconds"
100 stop program = "/bin/bash -c '/bin/kill \$(/bin/cat /var/run/$jenkinsuser/jenkins_jnlp_pid)'"
101 EOF
102         }
103
104         if [[ -f $monitconfdir/jenkins ]]; then
105             #test for diff
106             if [[ "$(diff $monitconfdir/jenkins <(echo "\
107 check process jenkins with pidfile /var/run/$jenkinsuser/jenkins_jnlp_pid
108 start program = \"/usr/bin/sudo -u $jenkinsuser /bin/bash -c 'cd $jenkinshome; export started_monit=true; $0 $@' with timeout 60 seconds\"
109 stop program = \"/bin/bash -c '/bin/kill \$(/bin/cat /var/run/$jenkinsuser/jenkins_jnlp_pid)'\"\
110 ") )" ]]; then
111                 echo "Updating monit config..."
112                 makemonit $@
113             fi
114         else
115             makemonit $@
116         fi
117     fi
118
119 if [[ $started_monit == "true" ]]; then
120     wget --timestamping https://build.opnfv.org/ci/jnlpJars/slave.jar && true
121     chown $jenkinsuser:$jenkinsuser slave.jar
122
123     if [[ -f /var/run/$jenkinsuser/jenkins_jnlp_pid ]]; then
124         echo "pid file found"
125         if ! kill -0 "$(/bin/cat /var/run/$jenkinsuser/jenkins_jnlp_pid)"; then
126             echo "no java process running cleaning up pid file"
127             rm -f /var/run/$jenkinsuser/jenkins_jnlp_pid;
128         else
129             echo "java connection process found and running already running quitting."
130             exit 1
131         fi
132     fi
133
134     if [[ $run_in_foreground == true ]]; then
135         $connectionstring
136     else
137         exec $connectionstring &
138         echo $! > /var/run/$jenkinsuser/jenkins_jnlp_pid
139     fi
140 else
141     echo "you are ready to start monit"
142     echo "eg: service monit start"
143     echo "example debug mode if you are having problems:  /usr/bin/monit -Ivv -c /etc/monit.conf "
144     exit 0
145 fi
146 }
147
148 usage() {
149     cat << EOF
150
151 **this file must be copied to the jenkins home directory to work**
152 jenkins-jnlp-connect.sh configures monit to keep slave connection up
153 Checks for new versions of slave.jar
154 run as root to create pid directory and create monit config.
155 can be run as root additional times if you change variables and need to update monit config.
156 after running as root you should see "you are ready to start monit"
157
158 usage: $0 [OPTIONS]
159  -h  show this message
160  -j  set jenkins home
161  -u  set jenkins user
162  -n  set slave name
163  -s  set secret key
164  -t  test the connection string by connecting without monit
165  -f  test firewall
166
167 Example: $0 -j /home/jenkins -u jenkins -n lab1 -s 727fdefoofoofoofoofoofoofof800
168 note: a trailing slash on -j /home/jenkins will break the script
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 "$@"