Index: crash_sender |
diff --git a/crash_sender b/crash_sender |
index 4332117ae43a3e291c03ff047d0f2763efb91843..8c409d385ba2addbd6a5f3c07d36ed35ce274bbe 100644 |
--- a/crash_sender |
+++ b/crash_sender |
@@ -9,12 +9,13 @@ set -e |
# Product ID in crash report |
CHROMEOS_PRODUCT=ChromeOS |
+# File whose existence implies crash reports may be sent, and whose |
+# contents includes our machine's anonymized guid. |
+CONSENT_ID="/home/chronos/Consent To Send Stats" |
+ |
# Send up to 8 crashes per day. |
MAX_CRASH_RATE=8 |
-# Minidump uploading tool (provided by Google Breakpad). |
-MINIDUMP_UPLOADER=/usr/bin/minidump_upload |
- |
# URL to send non-official build crashes to. |
MINIDUMP_UPLOAD_STAGING_URL="http://clients2.google.com/cr/staging_report" |
@@ -32,7 +33,7 @@ PAUSE_CRASH_SENDING="/tmp/pause-crash-sending" |
RUN_FILE="/var/run/crash_sender.pid" |
# Maximum time to sleep between sends. |
-SECONDS_SEND_SPREAD=600 |
+SECONDS_SEND_SPREAD=${SECONDS_SEND_SPREAD:-600} |
# The syslog tag for all logging we emit. |
TAG="$(basename $0)[$$]" |
@@ -45,8 +46,18 @@ lecho() { |
logger -t "${TAG}" "$@" |
} |
-remove_run_file() { |
+log_done() { |
+ lecho "Done" |
+} |
+ |
+cleanup_tmp_dir() { |
+ rm -rf "${TMP_DIR}" |
+ log_done |
+} |
+ |
+cleanup_run_file_and_tmp_dir() { |
rm -f "${RUN_FILE}" |
+ cleanup_tmp_dir |
} |
check_not_already_running() { |
@@ -55,7 +66,7 @@ check_not_already_running() { |
fi |
local last_pid=$(cat "${RUN_FILE}") |
if [ ! -f "/proc/${last_pid}/cmdline" ]; then |
- trap remove_run_file EXIT |
+ trap cleanup_run_file_and_tmp_dir EXIT INT |
echo $$ > "${RUN_FILE}" |
return |
fi |
@@ -81,8 +92,8 @@ generate_uniform_random() { |
} |
is_feedback_disabled() { |
- # See crosbug.com/3303. |
- return 1 |
+ [ -r "${CONSENT_ID}" ] && return 1 |
+ return 0 |
} |
is_on_3g() { |
@@ -144,16 +155,31 @@ send_crash() { |
return 1 |
fi |
- "${MINIDUMP_UPLOADER}" -p "${CHROMEOS_PRODUCT}" \ |
- -v "${chromeos_version}" "${minidump_path}" "${url}" |
- return $? |
+ local report_id="${TMP_DIR}/report_id" |
+ local curl_stderr="${TMP_DIR}/curl_stderr" |
+ |
+ set +e |
+ curl "${url}" \ |
+ -F "prod=${CHROMEOS_PRODUCT}" \ |
+ -F "ver=${chromeos_version}" \ |
+ -F "upload_file_minidump=@${minidump_path}" \ |
+ -F "guid=<${CONSENT_ID}" -o "${report_id}" 2>"${curl_stderr}" |
+ local curl_result=$? |
+ set -e |
+ |
+ if [ ${curl_result} -eq 0 ]; then |
+ lecho "Crash report receipt ID $(cat ${report_id})" |
+ else |
+ lecho "Crash sending failed with: $(cat ${curl_stderr})" |
+ fi |
+ |
+ rm -f "${report_id}" "${output_file}" |
+ |
+ return ${curl_result} |
} |
# Send all crashes from the given directory. The directory is currently |
-# expected to just contain a bunch of minidumps - but this will change |
-# over time to be a directory of directories where the minidump and core |
-# file are in the directory as well as other metadata about the context |
-# of the crash (executable name for instance). |
+# expected to just contain a bunch of minidumps. |
send_crashes() { |
local dir="$1" |
lecho "Considering crashes in ${dir}" |
@@ -187,6 +213,8 @@ send_crashes() { |
main() { |
lecho "Starting" |
+ trap log_done EXIT INT |
+ |
if [ -e "${PAUSE_CRASH_SENDING}" ]; then |
lecho "Exiting early due to ${PAUSE_CRASH_SENDING}" |
exit 1 |
@@ -194,13 +222,14 @@ main() { |
check_not_already_running |
+ TMP_DIR="$(mktemp -d /tmp/crash_sender.XXXX)" |
+ trap cleanup_tmp_dir EXIT INT |
+ |
# Send system-wide crashes |
send_crashes "/var/spool/crash" |
# Send user-specific crashes |
send_crashes "/home/chronos/user/crash" |
- |
- lecho "Done" |
} |
main |