elastic / elastic/logstash

Add configcheck to init and make sure to check config before trying to start

Open
#2,901 2 comments 0 reactions 0 assignees View on GitHub
enhancement packaging
Dominant language
Java
Stars
14.9k
Forks
3.5k
Avg merge
19h 14m
Merged PRs (30d)
63

Description

Using the deb package (1.5RC2), when using 'service' to start logstash, it will tell you that it started correctly if you have an invalid configuration. Java did, logstash started but exited immediately because the config is invalid.

So, this patch add an option to check the config and it also makes sure to check the config before starting.

```
diff --git a/pkg/logstash.sysv b/pkg/logstash.sysv
index fddc14d..d9954d0 100755
--- a/pkg/logstash.sysv
+++ b/pkg/logstash.sysv
@@ -115,6 +115,27 @@ force_stop() {
fi
}

+config_test() {
+ # Check if a config file exists
+ if [ ! "$(ls -A $LS_CONF_DIR/*.conf 2> /dev/null)" ]; then
+ log_failure_msg "There aren't any configuration files in $LS_CONF_DIR"
+ exit 1
+ fi
+
+ JAVA_OPTS=${LS_JAVA_OPTS}
+ HOME=${LS_HOME}
+ export PATH HOME JAVA_OPTS LS_HEAP_SIZE LS_JAVA_OPTS LS_USE_GC_LOGGING
+
+ test_args="-f ${LS_CONF_DIR} --configtest ${LS_OPTS}"
+ if [ "$1" = '1' ]; then
+ $program ${test_args} 2>/dev/null >/dev/null
+ else
+ $program ${test_args}
+ fi
+ [ $? -eq 0 ] && return 0
+ # Program not configured
+ return 6
+}

case "$1" in
start)
@@ -123,8 +144,14 @@ case "$1" in
if [ $code -eq 0 ]; then
echo "$name is already running"
else
- start
+ config_test 1
code=$?
+ if [ $code -ne 0 ]; then
+ echo "Invalid config for $name. Re-run with configtest to see what's wrong"
+ else
+ start
+ code=$?
+ fi
fi
exit $code
;;
@@ -144,8 +171,12 @@ case "$1" in

stop && start
;;
+ configtest)
+ config_test
+ exit $?
+ ;;
*)
- echo "Usage: $SCRIPTNAME {start|stop|force-stop|status|restart}" >&2
+ echo "Usage: $SCRIPTNAME {start|stop|force-stop|status|restart|configtest}" >&2
exit 3
;;
esac
diff --git a/pkg/logstash.sysv.debian b/pkg/logstash.sysv.debian
index 61e8c80..9741bd7 100644
--- a/pkg/logstash.sysv.debian
+++ b/pkg/logstash.sysv.debian
@@ -90,26 +90,35 @@ case "$1" in
cd "${LS_HOME}"
export PATH HOME JAVACMD JAVA_OPTS LS_HEAP_SIZE LS_JAVA_OPTS LS_USE_GC_LOGGING

- # Start Daemon
- start-stop-daemon --start -b --user "$LS_USER" -c "$LS_USER":"$LS_GROUP" \
- -d "$LS_HOME" --nicelevel "$LS_NICE" --pidfile "$PID_FILE" --make-pidfile \
- --exec $DAEMON -- $DAEMON_OPTS
-
- sleep 1
-
- # Parse the actual JAVACMD from the process' environment, we don't care about errors.
- JAVA=$(cat /proc/$(cat "${PID_FILE}" 2>/dev/null)/environ 2>/dev/null | grep -z ^JAVACMD= | cut -d= -f2)
- if start-stop-daemon --test --start --pidfile "$PID_FILE" \
- --user "$LS_USER" --exec "$JAVA" \
- >/dev/null; then
-
- if [ -f "$PID_FILE" ]; then
- rm -f "$PID_FILE"
+ # Check config
+ test_args="-f ${LS_CONF_DIR} --configtest ${LS_OPTS}"
+ $DAEMON ${test_args} 2>/dev/null >/dev/null
+
+ if [ $? -eq 0 ]; then
+ # Start Daemon
+ start-stop-daemon --start -b --user "$LS_USER" -c "$LS_USER":"$LS_GROUP" \
+ -d "$LS_HOME" --nicelevel "$LS_NICE" --pidfile "$PID_FILE" --make-pidfile \
+ --exec $DAEMON -- $DAEMON_OPTS
+
+ sleep 1
+
+ # Parse the actual JAVACMD from the process' environment, we don't care about errors.
+ JAVA=$(cat /proc/$(cat "${PID_FILE}" 2>/dev/null)/environ 2>/dev/null | grep -z ^JAVACMD= | cut -d= -f2)
+ if start-stop-daemon --test --start --pidfile "$PID_FILE" \
+ --user "$LS_USER" --exec "$JAVA" \
+ >/dev/null; then
+
+ if [ -f "$PID_FILE" ]; then
+ rm -f "$PID_FILE"
+ fi
+
+ log_end_msg 1
+ else
+ log_end_msg 0
fi
-
- log_end_msg 1
else
- log_end_msg 0
+ log_progress_msg "(invalid config)"
+ log_end_msg 1
fi
else
log_progress_msg "(already running)"
@@ -173,8 +182,23 @@ case "$1" in

$0 start
;;
+ configtest)
+ log_daemon_msg "Checking $DESC configuration"
+
+ # Check if a config file exists
+ if [ ! "$(ls -A $LS_CONF_DIR/*.conf 2> /dev/null)" ]; then
+ log_failure_msg "There aren't any configuration files in $LS_CONF_DIR"
+ exit 1
+ fi
+
+ test_args="-f ${LS_CONF_DIR} --configtest ${LS_OPTS}"
+ $DAEMON ${test_args}
+
+ [ $? -eq 0 ] && log_end_msg 0
+ log_end_msg 1
+ ;;
*)
- log_success_msg "Usage: $0 {start|stop|restart|force-reload|status}"
+ log_success_msg "Usage: $0 {start|stop|restart|force-reload|status|configtest}"
exit 1
;;
esac
diff --git a/pkg/logstash.sysv.redhat b/pkg/logstash.sysv.redhat
index f95f3c1..f8ca50b 100755
--- a/pkg/logstash.sysv.redhat
+++ b/pkg/logstash.sysv.redhat
@@ -102,11 +102,36 @@ do_stop()
[ $RETVAL = 0 ] && rm -f ${PID_FILE}
}

+do_config_test() {
+ # Check if a config file exists
+ if [ ! "$(ls -A $LS_CONF_DIR/*.conf 2> /dev/null)" ]; then
+ log_failure_msg "There aren't any configuration files in $LS_CONF_DIR"
+ exit 1
+ fi
+
+ HOME="${HOME:-$LS_HOME}"
+ JAVA_OPTS="${LS_JAVA_OPTS}"
+ export PATH HOME JAVA_OPTS LS_HEAP_SIZE LS_JAVA_OPTS LS_USE_GC_LOGGING
+
+ test_args="-f ${LS_CONF_DIR} --configtest ${LS_OPTS}"
+ if [ "$1" = '1' ]; then
+ $program ${test_args} 2>/dev/null >/dev/null
+ else
+ $program ${test_args}
+ fi
+ [ $? -eq 0 ] && success
+}
+
case "$1" in
start)
- echo -n "Starting $DESC: "
- do_start
- touch /var/run/logstash/$NAME
+ do_config_test 1
+ if [ $? -eq 0 ]; then
+ echo -n "Starting $DESC: "
+ do_start
+ touch /var/run/logstash/$NAME
+ else
+ echo "Invalid config for $name. Re-run with configtest to see what's wrong"
+ fi
;;
stop)
echo -n "Stopping $DESC: "
@@ -123,8 +148,13 @@ case "$1" in
status -p $PID_FILE
exit $?
;;
+ configtest)
+ do_config_test
+ [$? -eq 0 ] && exit 0
+ exit 6
+ ;;
*)
- echo "Usage: $SCRIPTNAME {start|stop|status|restart}" >&2
+ echo "Usage: $SCRIPTNAME {start|stop|status|restart|configtest}" >&2
exit 3
;;
esac
```

I only tested logstash.sysv.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.