aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-application/src/main/assembly/bin/macosx-universal-64/sonar.sh
blob: e18d6cd1949cafc6de70fdcb4b819cfc5aab07ae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
#! /bin/sh

APP_NAME="SonarQube"

# By default, java from the PATH is used, except if SONAR_JAVA_PATH env variable is set
findjava() {
  if [ -z "${SONAR_JAVA_PATH}" ]; then
    if ! command -v java 2>&1; then
      echo "Java not found. Please make sure that the environmental variable SONAR_JAVA_PATH points to a Java executable"
      exit 1
    fi
    JAVA_CMD=java
  else
    if ! [ -x "${SONAR_JAVA_PATH}" ] || ! [ -f "${SONAR_JAVA_PATH}" ]; then
      echo "File '${SONAR_JAVA_PATH}' is not executable. Please make sure that the environmental variable SONAR_JAVA_PATH points to a Java executable"
      exit 1
    fi
    JAVA_CMD="${SONAR_JAVA_PATH}"
  fi
}

findjava

# Get the fully qualified path to the script
case $0 in
    /*)
        SCRIPT="$0"
        ;;
    *)
        PWD=`pwd`
        SCRIPT="$PWD/$0"
        ;;
esac

# Resolve the true real path without any sym links.
CHANGED=true
while [ "X$CHANGED" != "X" ]
do
    # Change spaces to ":" so the tokens can be parsed.
    SAFESCRIPT=`echo $SCRIPT | sed -e 's; ;:;g'`
    # Get the real path to this script, resolving any symbolic links
    TOKENS=`echo $SAFESCRIPT | sed -e 's;/; ;g'`
    REALPATH=
    for C in $TOKENS; do
        # Change any ":" in the token back to a space.
        C=`echo $C | sed -e 's;:; ;g'`
        REALPATH="$REALPATH/$C"
        # If REALPATH is a sym link, resolve it.  Loop for nested links.
        while [ -h "$REALPATH" ] ; do
            LS="`ls -ld "$REALPATH"`"
            LINK="`expr "$LS" : '.*-> \(.*\)$'`"
            if expr "$LINK" : '/.*' > /dev/null; then
                # LINK is absolute.
                REALPATH="$LINK"
            else
                # LINK is relative.
                REALPATH="`dirname "$REALPATH"`""/$LINK"
            fi
        done
    done

    if [ "$REALPATH" = "$SCRIPT" ]
    then
        CHANGED=""
    else
        SCRIPT="$REALPATH"
    fi
done

# Change the current directory to the location of the script
cd "`dirname "$REALPATH"`"

LIB_DIR="../../lib"

HAZELCAST_ADDITIONAL="--add-exports=java.base/jdk.internal.ref=ALL-UNNAMED \
--add-opens=java.base/java.lang=ALL-UNNAMED \
--add-opens=java.base/java.nio=ALL-UNNAMED \
--add-opens=java.base/sun.nio.ch=ALL-UNNAMED \
--add-opens=java.management/sun.management=ALL-UNNAMED \
--add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED"

# Sonar app launching process memory setting
XMS="-Xms8m"
XMX="-Xmx32m"

COMMAND_LINE="$JAVA_CMD $XMS $XMX $HAZELCAST_ADDITIONAL -jar $LIB_DIR/sonar-application-@sqversion@.jar"

# Location of the pid file.
PIDFILE="./$APP_NAME.pid"

# Resolve the location of the 'ps' command
PSEXE="/usr/bin/ps"
if [ ! -x "$PSEXE" ]
then
    PSEXE="/bin/ps"
    if [ ! -x "$PSEXE" ]
    then
        echo "Unable to locate 'ps'."
        echo "Please report this message along with the location of the command on your system."
        exit 1
    fi
fi

getpid() {
    if [ -f "$PIDFILE" ]
    then
        if [ -r "$PIDFILE" ]
        then
            pid=`cat "$PIDFILE"`
            if [ "X$pid" != "X" ]
            then
                # It is possible that 'a' process with the pid exists but that it is not the
                #  correct process.  This can happen in a number of cases, but the most
                #  common is during system startup after an unclean shutdown.
                # The ps statement below looks for the specific wrapper command running as
                #  the pid.  If it is not found then the pid file is considered to be stale.
                pidtest=`$PSEXE -p $pid | grep "sonar-application-@sqversion@.jar" | tail -1`
                if [ "X$pidtest" = "X" ]
                then
                    # This is a stale pid file.
                    rm -f "$PIDFILE"
                    echo "Removed stale pid file: $PIDFILE"
                    pid=""
                fi
            fi
        else
            echo "Cannot read $PIDFILE."
            exit 1
        fi
    fi
}

testpid() {
    pid=`$PSEXE -p $pid | grep $pid | grep -v grep | awk '{print $1}' | tail -1`
    if [ "X$pid" = "X" ]
    then
        # Process is gone so remove the pid file.
        rm -f "$PIDFILE"
        pid=""
    fi
}

console() {
    echo "Running $APP_NAME..."
    getpid
    if [ "X$pid" = "X" ]
    then
        echo $$ > $PIDFILE
        exec $COMMAND_LINE -Dsonar.log.console=true
    else
        echo "$APP_NAME is already running."
        exit 1
    fi
}

start() {
    echo "Starting $APP_NAME..."
    getpid
    if [ "X$pid" = "X" ]
    then
        exec nohup $COMMAND_LINE >../../logs/nohup.log 2>&1 &
        echo $! > $PIDFILE
    else
        echo "$APP_NAME is already running."
        exit 1
    fi
    getpid
    if [ "X$pid" != "X" ]
    then
        echo "Started $APP_NAME."
    else
        echo "Failed to start $APP_NAME."
    fi
}

waitforstop() {
    # We can not predict how long it will take for the wrapper to
    #  actually stop as it depends on settings in wrapper.conf.
    #  Loop until it does.
    savepid=$pid
    CNT=0
    TOTCNT=0
    while [ "X$pid" != "X" ]
    do
        # Show a waiting message every 5 seconds.
        if [ "$CNT" -lt "5" ]
        then
            CNT=`expr $CNT + 1`
        else
            echo "Waiting for $APP_NAME to exit..."
            CNT=0
        fi
        TOTCNT=`expr $TOTCNT + 1`

        sleep 1

        testpid
    done

    pid=$savepid
    testpid
    if [ "X$pid" != "X" ]
    then
        echo "Failed to stop $APP_NAME."
        exit 1
    else
        echo "Stopped $APP_NAME."
    fi
}

stopit() {
    echo "Gracefully stopping $APP_NAME..."
    getpid
    if [ "X$pid" = "X" ]
    then
        echo "$APP_NAME was not running."
    else
        kill $pid
        if [ $? -ne 0 ]
        then
            # An explanation for the failure should have been given
            echo "Unable to stop $APP_NAME."
            exit 1
        fi

        waitforstop
    fi
}

forcestopit() {
    getpid
    if [ "X$pid" = "X" ]
    then
        echo "$APP_NAME not running"
        exit 1
    fi

    testpid
    if [ "X$pid" != "X" ]
    then
      # start shutdowner from SQ installation directory
      cd "../.."

      echo "Force stopping $APP_NAME..."
      ${JAVA_CMD} -jar "lib/sonar-shutdowner-@sqversion@.jar"

      waitforstop
    fi
}

status() {
    getpid
    if [ "X$pid" = "X" ]
    then
        echo "$APP_NAME is not running."
        exit 1
    else
        echo "$APP_NAME is running ($pid)."
        exit 0
    fi
}

dump() {
    echo "Dumping $APP_NAME..."
    getpid
    if [ "X$pid" = "X" ]
    then
        echo "$APP_NAME was not running."

    else
        kill -3 $pid

        if [ $? -ne 0 ]
        then
            echo "Failed to dump $APP_NAME."
            exit 1
        else
            echo "Dumped $APP_NAME."
        fi
    fi
}

case "$1" in

    'console')
        console
        ;;

    'start')
        start
        ;;

    'stop')
        stopit
        ;;

    'force-stop')
        forcestopit
        ;;

    'restart')
        stopit
        start
        ;;

    'status')
        status
        ;;

    'dump')
        dump
        ;;

    *)
        echo "Usage: $0 { console | start | stop | force-stop | restart | status | dump }"
        exit 1
        ;;
esac

exit 0