Jiri Moskovcak 3a42d8
#!/bin/bash
Jiri Moskovcak 3a42d8
# Install abrt coredump hook
Jiri Moskovcak 3a42d8
#
Jiri Moskovcak 3a42d8
# chkconfig: 35 82 16
Jiri Moskovcak 3a42d8
# description: Installs coredump handler which saves segfault data
Jiri Moskovcak 3a42d8
### BEGIN INIT INFO
Jiri Moskovcak 3a42d8
# Provides: abrt-ccpp
Jiri Moskovcak 3a42d8
# Required-Start: $abrtd
Jiri Moskovcak 3a42d8
# Default-Stop: 0 1 2 6
Jiri Moskovcak 3a42d8
# Default-Start: 3 5
Jiri Moskovcak 3a42d8
# Short-Description: Installs coredump handler which saves segfault data
Jiri Moskovcak 3a42d8
# Description: Installs coredump handler which saves segfault data
Jiri Moskovcak 3a42d8
### END INIT INFO
Jiri Moskovcak 3a42d8
Jiri Moskovcak 3a42d8
# Source function library.
Jiri Moskovcak 3a42d8
. /etc/rc.d/init.d/functions
Jiri Moskovcak 3a42d8
Jiri Moskovcak 3a42d8
# For debugging
Jiri Moskovcak 3a42d8
dry_run=false
Jiri Moskovcak 3a42d8
verbose=false
Jiri Moskovcak 3a42d8
Jiri Moskovcak 3a42d8
# We don't have pid files, therefore have to use
Jiri Moskovcak 3a42d8
# a flag file in /var/lock/subsys to enable GUI service tools
Jiri Moskovcak 3a42d8
# to figure out our status
Jiri Moskovcak 3a42d8
LOCK="/var/lock/subsys/abrt-ccpp"
Jiri Moskovcak 3a42d8
Jiri Moskovcak 3a42d8
PATTERN_FILE="/proc/sys/kernel/core_pattern"
Jiri Moskovcak 3a42d8
SAVED_PATTERN_FILE="/var/run/abrt/saved_core_pattern"
Jiri Moskovcak 3a42d8
HOOK_BIN="/usr/libexec/abrt-hook-ccpp"
Jiri Moskovcak 3a42d8
PATTERN="|$HOOK_BIN /var/spool/abrt %s %c %p %u %g %t %h %e"
Jiri Moskovcak 3a42d8
Jiri Moskovcak 3a42d8
# core_pipe_limit specifies how many dump_helpers can run at the same time
Jiri Moskovcak 3a42d8
# 0 - means unlimited, but it's not guaranteed that /proc/<pid> of crashing
Jiri Moskovcak 3a42d8
#     process will be available for dump_helper.
Jiri Moskovcak 3a42d8
# 4 - means that 4 dump_helpers can run at the same time (the rest will also
Jiri Moskovcak 3a42d8
#     run, but they will fail to read /proc/<pid>).
Jiri Moskovcak 3a42d8
#
Jiri Moskovcak 3a42d8
# This should be enough for ABRT, we can miss some crashes, but what are
Jiri Moskovcak 3a42d8
# the odds that more processes crash at the same time? And moreover,
Jiri Moskovcak 3a42d8
# do people want to save EVERY ONE of the crashes when they have
Jiri Moskovcak 3a42d8
# a crash storm? I don't think so.
Jiri Moskovcak 3a42d8
# The value of 4 has been recommended by nhorman.
Jiri Moskovcak 3a42d8
#
Jiri Moskovcak 3a42d8
CORE_PIPE_LIMIT_FILE="/proc/sys/kernel/core_pipe_limit"
Jiri Moskovcak 3a42d8
CORE_PIPE_LIMIT="4"
Jiri Moskovcak 3a42d8
Jiri Moskovcak 3a42d8
RETVAL=0
Jiri Moskovcak 3a42d8
Jiri Moskovcak 3a42d8
check() {
Jiri Moskovcak 3a42d8
	# Check that we're a privileged user
Jiri Moskovcak 3a42d8
	[ "`id -u`" = 0 ] || exit 4
Jiri Moskovcak 3a42d8
}
Jiri Moskovcak 3a42d8
Jiri Moskovcak 3a42d8
start() {
Jiri Moskovcak 3a42d8
	check
Jiri Moskovcak 3a42d8
Jiri Moskovcak 3a42d8
	cur=`cat "$PATTERN_FILE"`
Jiri Moskovcak 3a42d8
	cur_first=`printf "%s" "$cur" | sed 's/ .*//'`
Jiri Moskovcak 3a42d8
Jiri Moskovcak 3a42d8
	$verbose && printf "cur:'%s'\n" "$cur"
Jiri Moskovcak 3a42d8
	# Is it already installed?
Jiri Moskovcak 3a42d8
	if test x"$cur_first" != x"|$HOOK_BIN"; then   # no
Jiri Moskovcak 3a42d8
		# It is not installed
Jiri Moskovcak 3a42d8
		printf "%s\n" "$cur" >"$SAVED_PATTERN_FILE"
Jiri Moskovcak 3a42d8
		OLD_PATTERN=""
Jiri Moskovcak 3a42d8
		# Does old pattern start with '|'?
Jiri Moskovcak 3a42d8
		if test x"${cur#|}" = x"$cur"; then   # no
Jiri Moskovcak 3a42d8
			# Encode it as hex string, NUL terminated
Jiri Moskovcak 3a42d8
			OLD_PATTERN=`printf "%s" "$cur" | od -tx1 | sed 's/000[^ ]*//' | xargs | sed 's/ //g'`
Jiri Moskovcak 3a42d8
			$verbose && printf "OLD_PATTERN:'%s'\n" "$OLD_PATTERN"
Jiri Moskovcak 3a42d8
			OLD_PATTERN=" ${OLD_PATTERN}00"
Jiri Moskovcak 3a42d8
		fi
Jiri Moskovcak 3a42d8
		# Install new handler
Jiri Moskovcak 3a42d8
		$verbose && printf "Installing to %s:'%s'\n" "$PATTERN_FILE" "${PATTERN}${OLD_PATTERN}"
Jiri Moskovcak 3a42d8
		$dry_run || echo "${PATTERN}${OLD_PATTERN}" >"$PATTERN_FILE"
Jiri Moskovcak 3a42d8
		$dry_run || touch -- "$LOCK"
Jiri Moskovcak 3a42d8
Jiri Moskovcak 3a42d8
		# Check core_pipe_limit and change it if it's 0,
Jiri Moskovcak 3a42d8
		# otherwise the abrt-hook-ccpp won't be able to read /proc/<pid>
Jiri Moskovcak 3a42d8
		# of the crashing process
Jiri Moskovcak 3a42d8
		if test x"`cat "$CORE_PIPE_LIMIT_FILE"`" = x"0"; then
Jiri Moskovcak 3a42d8
			echo "$CORE_PIPE_LIMIT" >"$CORE_PIPE_LIMIT_FILE"
Jiri Moskovcak 3a42d8
		fi
Jiri Moskovcak 3a42d8
	fi
Jiri Moskovcak 3a42d8
	return $RETVAL
Jiri Moskovcak 3a42d8
}
Jiri Moskovcak 3a42d8
Jiri Moskovcak 3a42d8
stop() {
Jiri Moskovcak 3a42d8
	check
Jiri Moskovcak 3a42d8
Jiri Moskovcak 3a42d8
	if test -f "$SAVED_PATTERN_FILE"; then
Jiri Moskovcak 3a42d8
		$verbose && printf "Restoring to %s:'%s'\n" "$PATTERN_FILE" "`cat "$SAVED_PATTERN_FILE"`"
Jiri Moskovcak 3a42d8
		$dry_run || cat "$SAVED_PATTERN_FILE" >"$PATTERN_FILE"
Jiri Moskovcak 3a42d8
	fi
Jiri Moskovcak 3a42d8
	$dry_run || rm -f -- "$LOCK"
Jiri Moskovcak 3a42d8
	return $RETVAL
Jiri Moskovcak 3a42d8
}
Jiri Moskovcak 3a42d8
Jiri Moskovcak 3a42d8
restart() {
Jiri Moskovcak 3a42d8
	stop
Jiri Moskovcak 3a42d8
	start
Jiri Moskovcak 3a42d8
}
Jiri Moskovcak 3a42d8
Jiri Moskovcak 3a42d8
reload() {
Jiri Moskovcak 3a42d8
	restart
Jiri Moskovcak 3a42d8
}
Jiri Moskovcak 3a42d8
Jiri Moskovcak 3a42d8
case "$1" in
Jiri Moskovcak 3a42d8
start)
Jiri Moskovcak 3a42d8
	start
Jiri Moskovcak 3a42d8
	;;
Jiri Moskovcak 3a42d8
stop)
Jiri Moskovcak 3a42d8
	stop
Jiri Moskovcak 3a42d8
	;;
Jiri Moskovcak 3a42d8
reload)
Jiri Moskovcak 3a42d8
	reload
Jiri Moskovcak 3a42d8
	;;
Jiri Moskovcak 3a42d8
force-reload)
Jiri Moskovcak 3a42d8
	echo "$0: Unimplemented feature."
Jiri Moskovcak 3a42d8
	RETVAL=3
Jiri Moskovcak 3a42d8
	;;
Jiri Moskovcak 3a42d8
restart)
Jiri Moskovcak 3a42d8
	restart
Jiri Moskovcak 3a42d8
	;;
Jiri Moskovcak 3a42d8
condrestart)
Jiri Moskovcak 3a42d8
	cur=`cat "$PATTERN_FILE"`
Jiri Moskovcak 3a42d8
	cur_first=`printf "%s" "$cur" | sed 's/ .*//'`
Jiri Moskovcak 3a42d8
	# Is it already installed?
Jiri Moskovcak 3a42d8
	if test x"$cur_first" = x"|$HOOK_BIN"; then   # yes
Jiri Moskovcak 3a42d8
		$verbose && printf "Installed, re-installing\n"
Jiri Moskovcak 3a42d8
		restart
Jiri Moskovcak 3a42d8
	fi
Jiri Moskovcak 3a42d8
	;;
Jiri Moskovcak 3a42d8
status)
Jiri Moskovcak 3a42d8
	cur=`cat "$PATTERN_FILE"`
Jiri Moskovcak 3a42d8
	cur_first=`printf "%s" "$cur" | sed 's/ .*//'`
Jiri Moskovcak 3a42d8
	# Is it already installed?
Jiri Moskovcak 3a42d8
	if test x"$cur_first" = x"|$HOOK_BIN"; then   # yes
Jiri Moskovcak 3a42d8
		$verbose && printf "Installed\n"
Jiri Moskovcak 3a42d8
		RETVAL=0
Jiri Moskovcak 3a42d8
	else
Jiri Moskovcak 3a42d8
		$verbose && printf "Not installed\n"
Jiri Moskovcak 3a42d8
		RETVAL=3  # "stopped normally"
Jiri Moskovcak 3a42d8
	fi
Jiri Moskovcak 3a42d8
	;;
Jiri Moskovcak 3a42d8
*)
Jiri Moskovcak 3a42d8
	echo $"Usage: $0 {start|stop|status|restart|condrestart|reload|force-reload}"
Jiri Moskovcak 3a42d8
	RETVAL=2
Jiri Moskovcak 3a42d8
esac
Jiri Moskovcak 3a42d8
Jiri Moskovcak 3a42d8
exit $RETVAL