summaryrefslogtreecommitdiff
path: root/cleopatre/application/fw_wd/S99trace
blob: fee0a1cf9485c5b25e8f3460997de924754a810f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!/bin/sh

# Do not get trace from firmware and keep them compressed.
TRACE_ENABLED=false
# Reboot automatically after getting trace.
TRACE_REBOOT=true
# Trace folder.
TRACE_FOLDER=/usr/local/trace/
# Trace basename.
TRACE_BASENAME=trace_
# Header of the last trace, uncompressed.
TRACE_HEADER_PATH=${TRACE_FOLDER}/last_head_trace.txt
# Number of lines to store in the uncompressed trace.
TRACE_HEADER_LINE=3

# Load personnalize preferences.
test -f /etc/default/trace && . /etc/default/trace

# Do not continue if disabled.
test $TRACE_ENABLED = true || exit 1

# Ensure trace folder is created.
mkdir -p $TRACE_FOLDER || exit 1

# Get list of traces, sort them (by the last number)
# and handle case where there are no traces.
last_trace=$(ls -1 $TRACE_FOLDER/$TRACE_BASENAME[0-9]*.gz 2>/dev/null | sort \
-n -k 2 -t _ | tail -n 1)
# No trace file found.
if [[ -z $last_trace ]];
then
	# Start at 1.
	new_trace_digit=1
else
	# Remove prefix & suffix.
	new_trace_digit=${last_trace##$TRACE_FOLDER/$TRACE_BASENAME}
	new_trace_digit=${new_trace_digit%%.gz}
	# Get trace + 1.
	new_trace_digit=$(expr $new_trace_digit + 1)
fi

# Sleep for the watchdog, get trace (uncompressed, then compressed), get files
# and execute commands and reboot if required.
(fw_wd && \
	rm -f ${TRACE_HEADER_PATH} && \
	head -n ${TRACE_HEADER_LINE} /dev/trace > ${TRACE_HEADER_PATH} && \
	echo "Full trace available in ${TRACE_FOLDER}/${TRACE_BASENAME}${new_trace_digit}.gz" \
	>> ${TRACE_HEADER_PATH} && \
	(head -n ${TRACE_HEADER_LINE} ${TRACE_FOLDER}/last_head_trace.txt && \
	cat /dev/trace && \
	IFSOLD=$IFS
	IFS=":" && for i in $TRACE_FILES
	do
		IFS=$IFSOLD
		test -f "$i" && echo "==== $i ====" && cat "$i" && echo ""
	done
	IFS=":" && for i in $TRACE_CMDS
	do
		IFS=$IFSOLD
		echo "==== $i ====" && $i && echo ""
	done
	) | gzip -c \
		> ${TRACE_FOLDER}/${TRACE_BASENAME}${new_trace_digit}.gz \
		&& test $TRACE_REBOOT = true && reboot) &