Skip to content

Commit

Permalink
Remove pleaserun (via bin/system-install) usage
Browse files Browse the repository at this point in the history
This change removes the usage of 'pleaserun', which
was leveraged create the init.d scripts or systemd units.

Now, we ship init.d scripts and systemd units to make
the maintenance easier and following the lead of the
other Elastic projects.

Fixes: elastic#10519, Fixes: elastic#12439
  • Loading branch information
roaksoax committed Feb 10, 2022
1 parent 6313da2 commit 6aa13bb
Show file tree
Hide file tree
Showing 10 changed files with 250 additions and 3 deletions.
1 change: 0 additions & 1 deletion pkg/centos/after-install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ sed -i \
-e 's|# path.logs:|path.logs: /var/log/logstash|' \
-e 's|# path.data:|path.data: /var/lib/logstash|' \
/etc/logstash/logstash.yml
/usr/share/logstash/bin/system-install /etc/logstash/startup.options
chmod 600 /etc/logstash/startup.options
chmod 600 /etc/default/logstash

5 changes: 5 additions & 0 deletions pkg/centos/before-install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,8 @@ if ! getent passwd logstash >/dev/null; then
useradd -r -g logstash -d /usr/share/logstash \
-s /sbin/nologin -c "logstash" logstash
fi

# Handle upgrade: Check if old service unit exists and remove it
if [ -f /etc/systemd/system/logstash.service ]; then
rm -rf /etc/systemd/system/logstash.service || true
fi
1 change: 0 additions & 1 deletion pkg/debian/after-install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ sed -i \
-e 's|# path.logs:|path.logs: /var/log/logstash|' \
-e 's|# path.data:|path.data: /var/lib/logstash|' \
/etc/logstash/logstash.yml
/usr/share/logstash/bin/system-install /etc/logstash/startup.options
chmod 600 /etc/logstash/startup.options
chmod 600 /etc/default/logstash

5 changes: 5 additions & 0 deletions pkg/debian/before-install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,8 @@ if ! getent passwd logstash >/dev/null; then
useradd -M -r -g logstash -d /usr/share/logstash \
-s /usr/sbin/nologin -c "LogStash Service User" logstash
fi

# Handle upgrade: Check if old service unit exists and remove it
if [ -f /etc/systemd/system/logstash.service ]; then
rm -rf /etc/systemd/system/logstash.service || true
fi
24 changes: 24 additions & 0 deletions pkg/service_templates/systemd/lib/systemd/system/logstash.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
[Unit]
Description=logstash

[Service]
Type=simple
User=logstash
Group=logstash
# Load env vars from /etc/default/ and /etc/sysconfig/ if they exist.
# Prefixing the path with '-' makes it try to load, but if the file doesn't
# exist, it continues onward.
EnvironmentFile=-/etc/default/logstash
EnvironmentFile=-/etc/sysconfig/logstash
ExecStart=/usr/share/logstash/bin/logstash "--path.settings" "/etc/logstash"
Restart=always
WorkingDirectory=/
Nice=19
LimitNOFILE=16384

# When stopping, how long to wait before giving up and sending SIGKILL?
# Keep in mind that SIGKILL on a process can cause data loss.
TimeoutStopSec=infinity

[Install]
WantedBy=multi-user.target
10 changes: 10 additions & 0 deletions pkg/service_templates/sysv/etc/default/logstash
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
LS_HOME="/usr/share/logstash"
LS_SETTINGS_DIR="/etc/logstash"
LS_PIDFILE="/var/run/logstash.pid"
LS_USER="logstash"
LS_GROUP="logstash"
LS_GC_LOG_FILE="/var/log/logstash/gc.log"
LS_OPEN_FILES="16384"
LS_NICE="19"
SERVICE_NAME="logstash"
SERVICE_DESCRIPTION="logstash"
182 changes: 182 additions & 0 deletions pkg/service_templates/sysv/etc/init.d/logstash
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
#!/bin/sh
# Init script for logstash
# Maintained by
# Generated by pleaserun.
# Implemented based on LSB Core 3.1:
# * Sections: 20.2, 20.3
#
### BEGIN INIT INFO
# Provides: logstash
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description:
# Description: logstash
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin
export PATH

name=logstash
program=/usr/share/logstash/bin/logstash
args=--path.settings\ /etc/logstash
pidfile="/var/run/$name.pid"
user="logstash"
group="logstash"
chroot="/"
chdir="/"
nice="19"
limit_open_files="16384"


# If this is set to 1, then when `stop` is called, if the process has
# not exited within a reasonable time, SIGKILL will be sent next.
# The default behavior is to simply log a message "program stop failed; still running"
KILL_ON_STOP_TIMEOUT=0

# When loading default and sysconfig files, we use `set -a` to make
# all variables automatically into environment variables.
set -a
[ -r /etc/default/logstash ] && . /etc/default/logstash
[ -r /etc/sysconfig/logstash ] && . /etc/sysconfig/logstash
set +a

[ -z "$nice" ] && nice=0

trace() {
logger -t "/etc/init.d/logstash" "$@"
}

emit() {
trace "$@"
echo "$@"
}

start() {

# Ensure the log directory is setup correctly.
if [ ! -d "/var/log" ]; then
mkdir "/var/log"
chown "$user":"$group" "/var/log"
chmod 755 "/var/log"
fi


# Setup any environmental stuff beforehand
ulimit -n ${limit_open_files}

# Run the program!
nice -n "$nice" \
chroot --userspec "$user":"$group" "$chroot" sh -c "
ulimit -n ${limit_open_files}
cd \"$chdir\"
exec \"$program\" $args
" >> /var/log/logstash-stdout.log 2>> /var/log/logstash-stderr.log &

# Generate the pidfile from here. If we instead made the forked process
# generate it there will be a race condition between the pidfile writing
# and a process possibly asking for status.
echo $! > $pidfile

emit "$name started"
return 0
}

stop() {
# Try a few times to kill TERM the program
if status ; then
pid=$(cat "$pidfile")
trace "Killing $name (pid $pid) with SIGTERM"
kill -TERM $pid
# Wait for it to exit.
for i in 1 2 3 4 5 ; do
trace "Waiting $name (pid $pid) to die..."
status || break
sleep 1
done
if status ; then
if [ "$KILL_ON_STOP_TIMEOUT" -eq 1 ] ; then
trace "Timeout reached. Killing $name (pid $pid) with SIGKILL. This may result in data loss."
kill -KILL $pid
emit "$name killed with SIGKILL."
else
emit "$name stop failed; still running."
fi
else
emit "$name stopped."
fi
fi
}

status() {
if [ -f "$pidfile" ] ; then
pid=$(cat "$pidfile")
if ps -p $pid > /dev/null 2> /dev/null ; then
# process by this pid is running.
# It may not be our pid, but that's what you get with just pidfiles.
# TODO(sissel): Check if this process seems to be the same as the one we
# expect. It'd be nice to use flock here, but flock uses fork, not exec,
# so it makes it quite awkward to use in this case.
return 0
else
return 2 # program is dead but pid file exists
fi
else
return 3 # program is not running
fi
}

force_stop() {
if status ; then
stop
status && kill -KILL $(cat "$pidfile")
fi
}


case "$1" in
force-start|start|stop|force-stop|restart)
trace "Attempting '$1' on logstash"
;;
esac

case "$1" in
force-start)
PRESTART=no
exec "$0" start
;;
start)
status
code=$?
if [ $code -eq 0 ]; then
emit "$name is already running"
exit $code
else
start
exit $?
fi
;;
stop) stop ;;
force-stop) force_stop ;;
status)
status
code=$?
if [ $code -eq 0 ] ; then
emit "$name is running"
else
emit "$name is not running"
fi
exit $code
;;
restart)

stop && start
;;
*)
echo "Usage: $SCRIPTNAME {start|force-start|stop|force-start|force-stop|status|restart}" >&2
exit 3
;;
esac

exit $?
1 change: 0 additions & 1 deletion pkg/ubuntu/after-install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,5 @@ sed -i \
-e 's|# path.logs:|path.logs: /var/log/logstash|' \
-e 's|# path.data:|path.data: /var/lib/logstash|' \
/etc/logstash/logstash.yml
/usr/share/logstash/bin/system-install /etc/logstash/startup.options
chmod 600 /etc/logstash/startup.options
chmod 600 /etc/default/logstash
5 changes: 5 additions & 0 deletions pkg/ubuntu/before-install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,8 @@ if ! getent passwd logstash >/dev/null; then
useradd -M -r -g logstash -d /usr/share/logstash \
-s /usr/sbin/nologin -c "LogStash Service User" logstash
fi

# Handle upgrade: Check if old service unit exists and remove it
if [ -f /etc/systemd/system/logstash.service ]; then
rm -rf /etc/systemd/system/logstash.service || true
fi
19 changes: 19 additions & 0 deletions rakelib/artifacts.rake
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ namespace "artifact" do
PACKAGE_SUFFIX = SNAPSHOT_BUILD ? "-SNAPSHOT" : ""
end

## TODO: Install new service files
def package_files
[
"NOTICE.TXT",
Expand Down Expand Up @@ -553,6 +554,9 @@ namespace "artifact" do
dir.input("#{empty}/=/var/log/logstash")
dir.input("#{empty}/=/var/lib/logstash")
dir.input("#{empty}/=/etc/logstash/conf.d")
dir.input("#{empty}/=/lib/systemd/system")
dir.input("#{empty}/=/etc/init.d/")
dir.input("#{empty}/=/etc/default")
end

File.join(basedir, "config", "log4j2.properties").tap do |path|
Expand All @@ -579,6 +583,15 @@ namespace "artifact" do
File.join(basedir, "pkg", "pipelines.yml").tap do |path|
dir.input("#{path}=/etc/logstash")
end
File.join(basedir, "pkg", "service_templates", "systemd", "lib", "systemd", "system", "logstash.service").tap do |path|
dir.input("#{path}=/lib/systemd/system")
end
File.join(basedir, "pkg", "service_templates", "sysv", "etc", "init.d", "logstash").tap do |path|
dir.input("#{path}=/etc/init.d")
end
File.join(basedir, "pkg", "service_templates", "sysv", "etc", "default", "logstash").tap do |path|
dir.input("#{path}=/etc/default")
end

case platform
when "redhat", "centos"
Expand All @@ -599,6 +612,9 @@ namespace "artifact" do
out.config_files << "/etc/logstash/logstash.yml"
out.config_files << "/etc/logstash/logstash-sample.conf"
out.config_files << "/etc/logstash/pipelines.yml"
out.config_files << "/lib/systemd/system/logstash.service"
out.config_files << "/etc/init.d/logstash"
out.config_files << "/etc/default/logstash"
when "debian", "ubuntu"
require "fpm/package/deb"

Expand All @@ -615,6 +631,9 @@ namespace "artifact" do
out.config_files << "/etc/logstash/logstash.yml"
out.config_files << "/etc/logstash/logstash-sample.conf"
out.config_files << "/etc/logstash/pipelines.yml"
out.config_files << "/lib/systemd/system/logstash.service"
out.config_files << "/etc/init.d/logstash"
out.config_files << "/etc/default/logstash"
end

# Packaging install/removal scripts
Expand Down

0 comments on commit 6aa13bb

Please sign in to comment.