#!/bin/bash # Install coredump handler which saves segfault data # For debugging dry_run=false verbose=false PATTERN_FILE="/proc/sys/kernel/core_pattern" SAVED_PATTERN_DIR="/var/run/abrt" SAVED_PATTERN_FILE="/var/run/abrt/saved_core_pattern" HOOK_BIN="/usr/libexec/abrt-hook-ccpp" # Must match percent_specifiers[] order in abrt-hook-ccpp.c: PATTERN="|$HOOK_BIN /var/spool/abrt %s %c %p %u %g %t %e" # Same, but with bogus "executable name" parameter PATTERN1="|$HOOK_BIN /var/spool/abrt %s %c %p %u %g %t e" # core_pipe_limit specifies how many dump_helpers can run at the same time # 0 - means unlimited, but it's not guaranteed that /proc/ of crashing # process will be available for dump_helper. # 4 - means that 4 dump_helpers can run at the same time (the rest will also # run, but they will fail to read /proc/). # # This should be enough for ABRT, we can miss some crashes, but what are # the odds that more processes crash at the same time? And moreover, # do people want to save EVERY ONE of the crashes when they have # a crash storm? I don't think so. # The value of 4 has been recommended by nhorman. # CORE_PIPE_LIMIT_FILE="/proc/sys/kernel/core_pipe_limit" CORE_PIPE_LIMIT="4" start() { cur=`cat "$PATTERN_FILE"` cur_first=`printf "%s" "$cur" | sed 's/ .*//'` # Is there a %e (executable name) in old pattern anywhere? if test x"${cur#.*%e}" = x"${cur}"; then # No. Can use PATTERN with less risk of overflow # on expansion (executable names can be LONG). # Overflow would cause kernel to abort coredump. BAD. PATTERN="$PATTERN1" fi $verbose && printf "cur:'%s'\n" "$cur" # Is it already installed? if test x"$cur_first" != x"|$HOOK_BIN"; then # no # It is not installed mkdir -p -- "$SAVED_PATTERN_DIR" printf "%s\n" "$cur" >"$SAVED_PATTERN_FILE" # Install new handler $verbose && printf "Installing to %s:'%s'\n" "$PATTERN_FILE" "$PATTERN" $dry_run || echo "$PATTERN" >"$PATTERN_FILE" # Check core_pipe_limit and change it if it's 0, # otherwise the abrt-hook-ccpp won't be able to read /proc/ # of the crashing process if test x"`cat "$CORE_PIPE_LIMIT_FILE"`" = x"0"; then echo "$CORE_PIPE_LIMIT" >"$CORE_PIPE_LIMIT_FILE" fi fi } stop() { if test -f "$SAVED_PATTERN_FILE"; then $verbose && printf "Restoring to %s:'%s'\n" "$PATTERN_FILE" "`cat "$SAVED_PATTERN_FILE"`" $dry_run || cat "$SAVED_PATTERN_FILE" >"$PATTERN_FILE" fi } status() { cur=`cat "$PATTERN_FILE"` cur_first=`printf "%s" "$cur" | sed 's/ .*//'` # Is it already installed? if test x"$cur_first" = x"|$HOOK_BIN"; then # yes $verbose && printf "Installed\n" return 0 else $verbose && printf "Not installed\n" return 1 fi } case "$1" in install) start ;; uninstall) stop ;; is-installed) status ;; *) echo $"Usage: $0 {install|uninstall|is-installed}" return 2 esac