%cmake . \
-DCMAKE_INSTALL_PREFIX=%{_prefix} \
-DTZ_SYS_BIN=%{TZ_SYS_BIN} \
- -DUNIT_DIR=%{_unitdir} \
-DCRASH_PATH=%{crash_path} \
-DCRASH_TEMP=%{crash_temp} \
-DCRASH_PIPE_PATH=%{_libexecdir}/crash-pipe
mkdir -p %{buildroot}%{crash_path}
mkdir -p %{buildroot}%{crash_temp}
-%install_service sysinit.target.wants crash-init.service
-
%files
%license LICENSE
%manifest crash-worker.manifest
%dir %{crash_temp}
%attr(0755,system,system) %{_bindir}/dump_systemstate
%{_bindir}/crash-manager.sh
-%{_bindir}/crash-init.sh
%{_libexecdir}/crash-pipe
%{_prefix}/lib/sysctl.d/99-crash-manager.conf
-%{_unitdir}/crash-init.service
-%{_unitdir}/sysinit.target.wants/crash-init.service
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
SET(CRASH_MANAGER "crash-manager")
-SET(CRASH_INIT "crash-init")
CONFIGURE_FILE(${CRASH_MANAGER}.sh.in ${CRASH_MANAGER}.sh @ONLY)
CONFIGURE_FILE(99-${CRASH_MANAGER}.conf.in 99-${CRASH_MANAGER}.conf @ONLY)
-CONFIGURE_FILE(${CRASH_INIT}.service.in ${CRASH_INIT}.service @ONLY)
-CONFIGURE_FILE(${CRASH_INIT}.sh.in ${CRASH_INIT}.sh @ONLY)
INSTALL(FILES ${CMAKE_SOURCE_DIR}/src/${CRASH_MANAGER}/${CRASH_MANAGER}.sh
DESTINATION ${TZ_SYS_BIN}
INSTALL(FILES ${CMAKE_SOURCE_DIR}/src/${CRASH_MANAGER}/99-${CRASH_MANAGER}.conf
DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/sysctl.d
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)
-
-INSTALL(FILES ${CMAKE_SOURCE_DIR}/src/${CRASH_MANAGER}/${CRASH_INIT}.service
- DESTINATION ${UNIT_DIR}
- PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE
- GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
-
-INSTALL(FILES ${CMAKE_SOURCE_DIR}/src/${CRASH_MANAGER}/${CRASH_INIT}.sh
- DESTINATION ${TZ_SYS_BIN}
- PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE
- GROUP_READ GROUP_EXECUTE WORLD_READ)
+++ /dev/null
-[Unit]
-Description=Crash init
-DefaultDependencies=no
-After=local-fs.target
-
-[Service]
-Type=normal
-ExecStart=@TZ_SYS_BIN@/@CRASH_INIT@.sh
-
-[Install]
-WantedBy=sysinit.target
+++ /dev/null
-#!/bin/sh
-
-################################
-# MOUNT tmpfs ON TEMPORARY PATH
-################################
-
-mkdir -p @CRASH_TEMP@
-/usr/bin/mount tmpfs @CRASH_TEMP@ -t tmpfs
-
-
-############################
-# REMOVE PREVIOUS COREDUMPS
-############################
-
-id=""
-
-if [ -e "/proc/sys/kernel/random/boot_id" ]
-then
- read line< /proc/sys/kernel/random/boot_id
- id=`echo ${line} | sed -e 's/-//g'`
-fi
-
-if [ -d "/var/lib/systemd/coredump" ]
-then
- cd /var/lib/systemd/coredump
-
-#remove garbage dump files
- if [ -e ".#core.*" ]
- then
- for i in `ls -a .#core.*`
- do
- rm -f "$i"
- done
- fi
-
- for i in `ls -a`
- do
- if [ -d $i ]
- then
- continue
- fi
-
-#remove dump files if boot id is different
- if [ $i != *.$id.* ]
- then
- rm -f "$i"
- fi
- done
-fi
#!/bin/sh
-process="$1"
-user="$2"
-group="$3"
-signal="$4"
-time="$5"
-app="$6"
-
-/usr/lib/systemd/systemd-coredump "$process" "$user" "$group" "$signal" "$time" "$app"
+set -e
+exec >/dev/null 2>&1
-temppath=@CRASH_TEMP@
-resultpath=@CRASH_PATH@
-name="$app"_"$process"_"$time"
-path="$temppath"/"$name"
-info="$name".info
-dump="$name".coredump
-log="$name".log
-result="$name".tar.gz
+PATH=/bin:/usr/bin
+CRASH_PATH="@CRASH_PATH@"
+CRASH_TEMP="@CRASH_TEMP@"
-/usr/bin/mkdir -p "$temppath"
-/usr/bin/mkdir -p "$resultpath"
-/usr/bin/mkdir -p "$path"
+# Expected invocation from kernel:
+#
+# argv0 PID UID GID SIGNAL TIME CMD
+pid="$1"
+time="$5"
+cmd="$6"
-cd "$path"
+temp_dir="$(mktemp -d "${CRASH_TEMP}/crash.XXXXXX")"
+cleanup()
+{
+ [ "$temp_dir" ] && rm -rf "$temp_dir"
+}
+trap cleanup 0 2 15
-/usr/bin/coredumpctl info "$process" >> "$info"
-/usr/bin/coredumpctl dump "$process" --output="$dump"
-/usr/bin/dump_systemstate -d -k -f "$log"
+name="${cmd}_${pid}_${time}"
+result_path="${CRASH_PATH}/${name}.tar.gz"
+pfx="${temp_dir}/${name}"
+info_path="${pfx}/${name}.info"
+core_path="${pfx}/${name}.coredump"
+log_path="${pfx}/${name}.log"
-cd "$temppath"
-/usr/bin/tar cvfz "$result" "$name"/"$dump" "$name"/"$info" "$name"/"$log"
+mkdir -p "$CRASH_PATH" "$pfx"
-/usr/bin/mv "$temppath"/"$result" "$resultpath"/"$result"
+@CRASH_PIPE_PATH@ --save-core "$core_path" --report "$@" > "$info_path"
+dump_systemstate -d -k -f "$log_path" || true
-/usr/bin/rm -rf "$path"
+tar czf "${temp_dir}/report.tar.gz" -C "$temp_dir" "$name"
+mv "${temp_dir}/report.tar.gz" "$result_path"