| Index: crash_sender
|
| diff --git a/crash_sender b/crash_sender
|
| deleted file mode 100644
|
| index 4332117ae43a3e291c03ff047d0f2763efb91843..0000000000000000000000000000000000000000
|
| --- a/crash_sender
|
| +++ /dev/null
|
| @@ -1,206 +0,0 @@
|
| -#!/bin/sh
|
| -
|
| -# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -set -e
|
| -
|
| -# Product ID in crash report
|
| -CHROMEOS_PRODUCT=ChromeOS
|
| -
|
| -# 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"
|
| -
|
| -# URL to send official build crashes to.
|
| -MINIDUMP_UPLOAD_PROD_URL="http://clients2.google.com/cr/report"
|
| -
|
| -# File whose existence mocks crash sending. If empty we pretend the
|
| -# crash sending was successful, otherwise unsuccessful.
|
| -MOCK_CRASH_SENDING="/tmp/mock-crash-sending"
|
| -
|
| -# File whose existence causes crash sending to be delayed (for testing).
|
| -PAUSE_CRASH_SENDING="/tmp/pause-crash-sending"
|
| -
|
| -# File whose existence implies we're running and not to start again.
|
| -RUN_FILE="/var/run/crash_sender.pid"
|
| -
|
| -# Maximum time to sleep between sends.
|
| -SECONDS_SEND_SPREAD=600
|
| -
|
| -# The syslog tag for all logging we emit.
|
| -TAG="$(basename $0)[$$]"
|
| -
|
| -# Directory to store timestamp files indicating the uploads in the past 24
|
| -# hours.
|
| -TIMESTAMPS_DIR="/var/lib/crash_sender"
|
| -
|
| -lecho() {
|
| - logger -t "${TAG}" "$@"
|
| -}
|
| -
|
| -remove_run_file() {
|
| - rm -f "${RUN_FILE}"
|
| -}
|
| -
|
| -check_not_already_running() {
|
| - if [ ! -f "${RUN_FILE}" ]; then
|
| - return
|
| - fi
|
| - local last_pid=$(cat "${RUN_FILE}")
|
| - if [ ! -f "/proc/${last_pid}/cmdline" ]; then
|
| - trap remove_run_file EXIT
|
| - echo $$ > "${RUN_FILE}"
|
| - return
|
| - fi
|
| - # This could just be an unrelated process, but it's ok to be conservative.
|
| - lecho "Already running. Exiting now."
|
| - exit 1
|
| -}
|
| -
|
| -get_version() {
|
| - grep ^CHROMEOS_RELEASE_VERSION /etc/lsb-release | cut -d = -f 2-
|
| -}
|
| -
|
| -is_official() {
|
| - grep ^CHROMEOS_RELEASE_DESCRIPTION /etc/lsb-release | cut -d = -f 2- | \
|
| - grep Official
|
| -}
|
| -
|
| -# Generate a uniform random number in 0..max-1.
|
| -generate_uniform_random() {
|
| - local max=$1
|
| - local random="$(od -An -N4 -tu /dev/urandom)"
|
| - echo $((random % max))
|
| -}
|
| -
|
| -is_feedback_disabled() {
|
| - # See crosbug.com/3303.
|
| - return 1
|
| -}
|
| -
|
| -is_on_3g() {
|
| - # See crosbug.com/3304.
|
| - return 1
|
| -}
|
| -
|
| -# Check if sending a crash now does not exceed the maximum 24hr rate and
|
| -# commit to doing so, if not.
|
| -check_rate() {
|
| - mkdir -p ${TIMESTAMPS_DIR}
|
| - # Only consider minidumps written in the past 24 hours by removing all older.
|
| - find "${TIMESTAMPS_DIR}" -mindepth 1 -mmin +$((24 * 60)) -exec rm '{}' ';'
|
| - local sends_in_24hrs=$(echo "${TIMESTAMPS_DIR}"/* | wc -w)
|
| - lecho "Current send rate: ${sends_in_24hrs}sends/24hrs"
|
| - if [ ${sends_in_24hrs} -ge ${MAX_CRASH_RATE} ]; then
|
| - lecho "Cannot send more crashes:"
|
| - lecho " current ${sends_in_24hrs}send/24hrs >= " \
|
| - "max ${MAX_CRASH_RATE}send/24hrs"
|
| - return 1
|
| - fi
|
| - mktemp "${TIMESTAMPS_DIR}"/XXXX > /dev/null
|
| - return 0
|
| -}
|
| -
|
| -send_crash() {
|
| - local sleep_time=$(generate_uniform_random $SECONDS_SEND_SPREAD)
|
| - local url="${MINIDUMP_UPLOAD_STAGING_URL}"
|
| - if is_official; then
|
| - url="${MINIDUMP_UPLOAD_PROD_URL}"
|
| - fi
|
| - lecho "Sending crash:"
|
| - lecho " Scheduled to send in ${sleep_time}s"
|
| - lecho " Minidump: ${minidump_path}"
|
| - lecho " URL: ${url}"
|
| - lecho " Product: ${CHROMEOS_PRODUCT}"
|
| - lecho " Version: ${chromeos_version}"
|
| - if [ -s "${minidump_path}" ]; then
|
| - # We cannot tell much from the minidump without symbols, but we can tell
|
| - # at least what modules were loaded at the time of crash
|
| - local modules="$(/usr/bin/minidump_dump "${minidump_path}" 2>&- | \
|
| - grep 'code_file' | sed -e 's/^.* = "//g;s/"//g' | \
|
| - tr '\n' ' ')"
|
| - lecho " Mapped: ${modules}"
|
| - fi
|
| - if [ -f "${MOCK_CRASH_SENDING}" ]; then
|
| - local mock_in=$(cat "${MOCK_CRASH_SENDING}")
|
| - if [ "${mock_in}" = "" ]; then
|
| - lecho "Mocking successful send"
|
| - return 0
|
| - else
|
| - lecho "Mocking unsuccessful send"
|
| - return 1
|
| - fi
|
| - fi
|
| -
|
| - if ! sleep ${sleep_time}; then
|
| - lecho "Sleep failed"
|
| - return 1
|
| - fi
|
| -
|
| - "${MINIDUMP_UPLOADER}" -p "${CHROMEOS_PRODUCT}" \
|
| - -v "${chromeos_version}" "${minidump_path}" "${url}"
|
| - return $?
|
| -}
|
| -
|
| -# 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).
|
| -send_crashes() {
|
| - local dir="$1"
|
| - lecho "Considering crashes in ${dir}"
|
| - # Cycle through minidumps, most recent first. That way if we're about
|
| - # to exceed the daily rate, we send the most recent minidumps.
|
| - if [ ! -d "${dir}" ]; then
|
| - return
|
| - fi
|
| - for file in $(ls -1t "${dir}"); do
|
| - local minidump_path="${dir}/${file}"
|
| - lecho "Considering crash ${minidump_path}"
|
| - if ! check_rate; then
|
| - lecho "Sending ${minidump_path} would exceed rate. Leaving for later."
|
| - return 0
|
| - fi
|
| - local chromeos_version=$(get_version)
|
| - if is_feedback_disabled; then
|
| - lecho "Uploading is disabled. Removing crash."
|
| - rm "${minidump_path}"
|
| - elif is_on_3g; then
|
| - lecho "Not sending crash report while on 3G, saving for later."
|
| - elif send_crash ${minidump_path}; then
|
| - # Send was successful, now remove
|
| - lecho "Successfully sent crash ${minidump_path} and removing"
|
| - rm "${minidump_path}"
|
| - else
|
| - lecho "Problem sending ${minidump_path}, not removing"
|
| - fi
|
| - done
|
| -}
|
| -
|
| -main() {
|
| - lecho "Starting"
|
| - if [ -e "${PAUSE_CRASH_SENDING}" ]; then
|
| - lecho "Exiting early due to ${PAUSE_CRASH_SENDING}"
|
| - exit 1
|
| - fi
|
| -
|
| - check_not_already_running
|
| -
|
| - # Send system-wide crashes
|
| - send_crashes "/var/spool/crash"
|
| -
|
| - # Send user-specific crashes
|
| - send_crashes "/home/chronos/user/crash"
|
| -
|
| - lecho "Done"
|
| -}
|
| -
|
| -main
|
|
|