| #!/bin/sh |
| # |
| # Copyright (c) 2012 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. |
| # |
| # Copies all logs, screen-shots, crash dumps to Downloads folder. |
| # Help information about script usage. |
| |
| . /usr/share/misc/shflags |
| |
| DEFINE_boolean delete $FLAGS_FALSE \ |
| "To collect data and clear up folders" |
| DEFINE_boolean screenshots $FLAGS_FALSE \ |
| "To also collect saved screenshots" |
| DEFINE_boolean profile_data $FLAGS_FALSE \ |
| "To also collect profile web data and sync data" |
| FLAGS_HELP="USAGE: To collect logs and crash dumps: sh $0 [flags] \ |
| \nCollected data is zipped to tar.bz2 file with timestamp in Downloads \ |
| folder." |
| |
| # Parse command line |
| FLAGS "$@" || exit 1 |
| eval set -- "${FLAGS_ARGV}" |
| |
| echo "Collecting logs for user" |
| home_dir=/home/chronos |
| |
| # Creating folder to copy logs, screenshots and dumps. |
| if [ -z "$(ls -A /home/chronos/user)" ]; then |
| log_dir=${home_dir}/diagnostic_logs |
| tar_path=${home_dir} |
| echo "Create diagnostic logs folder in Downloads" |
| else |
| log_dir=${home_dir}/user/Downloads/diagnostic_logs |
| tar_path=${home_dir}/user/Downloads |
| echo "Create diagnostic logs folder in home" |
| fi |
| mkdir -p ${log_dir} |
| sudo rm -rf ${log_dir}/* |
| |
| # Copying file with current timestamp and date. |
| date > ${log_dir}/timestamp.txt |
| echo "Copied current timestamp" |
| |
| # Copying file with ping test result. |
| ping -c 5 google.com > ${log_dir}/ping_result.txt |
| echo "Copied ping test result" |
| |
| # Run lsusb. |
| sudo lsusb -v > ${log_dir}/lsusb_output.txt && |
| echo "Obtaining lsusb information" |
| |
| # Copying lsb-release file. |
| sudo cp /etc/lsb-release ${log_dir}/lsb_release.txt && |
| echo "Copied lsb-release file with version information" |
| |
| # Copying Consent To Send Stats file for client id. |
| sudo cp "${home_dir}/Consent To Send Stats" \ |
| ${log_dir}/consent_to_send_stats.txt && |
| echo "Copied Consent To Send Stats file with client id" |
| |
| # Copying Local State file from /home/chronos. |
| sudo cp "${home_dir}/Local State" ${log_dir}/local_state.txt && |
| echo "Copied Local State file" |
| |
| # Get the xrand output |
| DISPLAY=:0.0 /usr/bin/xrandr --verbose > ${log_dir}/xrand_output.txt && |
| echo "Dumped xrand output" |
| |
| # Get modem status |
| /usr/bin/modem status > ${log_dir}/modem_status.txt && |
| echo "Dumped modem status" |
| |
| # Get trackpad user feedback |
| sudo /opt/google/touchpad/generate_userfeedback > \ |
| ${log_dir}/trackpad_feedback.dat && |
| echo "Dumped touchpad feedback" |
| |
| # Get touchscreen user feedback |
| sudo /opt/google/touchscreen/touchscreen_feedback > \ |
| ${log_dir}/touchscreen_feedback.dat && |
| echo "Dumped touchscreen feedback" |
| |
| # Get shill's service list |
| sudo /usr/bin/network_diagnostics --show-macs --flimflam > \ |
| ${log_dir}/shill_services_list.txt && |
| echo "Dumped shill's service list" |
| |
| # Get the network diagnostics |
| sudo /usr/bin/network_diagnostics > ${log_dir}/network_diagnostics.txt && |
| echo "Dumped network_diagnostics" |
| |
| # Copying mount-encrypted log |
| sudo cp /tmp/mount-encrypted.log ${log_dir} && |
| echo "Copied mount encryption log" |
| |
| # Copy the stateful partition permission map. |
| sudo ls -alR /mnt/stateful_partition/ > ${log_dir}/stateful.txt && |
| echo "Copied list of entire stateful contents" |
| |
| # List what is in the OEM folder |
| sudo ls -alR /opt/oem/ > ${log_dir}/oem.txt && |
| echo "Copied list of oem folder contents" |
| |
| # Copy startup_manifest.json.txt if it exists |
| if [ -e /opt/oem/etc/startup_manifest.json ]; then |
| cp /opt/oem/etc/startup_manifest.json ${log_dir}/startup_manifest.json.txt |
| fi |
| |
| mkdir -p ${log_dir}/system_level_logs ${log_dir}/user_level_logs \ |
| ${log_dir}/crashdumps |
| # Copying all logs under /var/log/. |
| sudo cp -r /var/log/* ${log_dir}/system_level_logs && |
| echo "Copied all system level logs from /var/log/" |
| sudo cp -r ${home_dir}/user/log/* ${log_dir}/user_level_logs && |
| echo "Copied relevant user level logs" |
| |
| # Adding extension .txt to all copied log files. |
| log_array="${log_dir}/system_level_logs/* ${log_dir}/user_level_logs/*" |
| for log_file in ${log_array}; do |
| if [ -f ${log_file} ] && [ ${log_file#*.txt} ]; then |
| sudo mv "${log_file}" "${log_file}.txt" |
| fi |
| done |
| |
| # Copying crash dumps. |
| sudo cp -rf "/var/log/chrome/Crash Reports/" ${log_dir}/crashdumps/ |
| spool_crash="/var/spool/crash/*" |
| home_crash="${home_dir}/user/crash/*" |
| if [ -e ${spool_crash} ]; then |
| sudo cp -rf ${spool_crash} ${log_dir}/crashdumps/ && |
| echo "Copied system crash dumps" |
| fi |
| if [ -e ${home_crash} ]; then |
| sudo cp -rf ${home_crash} ${log_dir}/crashdumps/ && |
| echo "Copied user crash dumps" |
| fi |
| |
| # Dumping TPM token contents |
| pkcs11-tool -p 111111 -O --module libchaps.so \ |
| > ${log_dir}/tpm_token_contents.txt 2>&1 && echo "Dumped TPM token contents" |
| |
| # Dumping Cryptohomed/TPM ownership status |
| cryptohome --action=status > ${log_dir}/cryptohomed_status.txt 2>&1 && |
| echo "Dumped cryptohomed status" |
| |
| # Dumping Cryptohome PKCS11 status |
| cryptohome --action=pkcs11_token_status \ |
| >> ${log_dir}/cryptohomed_status.txt 2>&1 && |
| echo "Dumped cryptohomed pkcs11 status" |
| |
| # Dumping firmware log if it exists |
| if [ -r /sys/firmware/log ]; then |
| cat /sys/firmware/log > ${log_dir}/firmware_log.txt |
| fi |
| |
| # Dumping firmware event log |
| if [ -n "$(sudo mosys -t | grep -o eventlog)" ]; then |
| sudo mosys -k eventlog list > ${log_dir}/firmware_event_log.txt |
| fi |
| |
| # Copy device and user policy data. |
| policy_dir="${log_dir}/policy_data/" |
| mkdir -p ${policy_dir} |
| device_policy="/var/lib/whitelist/" |
| users_policy="/home/root/*/session_manager/policy/" |
| if [ -e ${device_policy} ]; then |
| sudo cp -rf ${device_policy} ${policy_dir} && |
| echo "Copied device whitelist" |
| fi |
| if [ -e ${users_policy} ]; then |
| sudo cp -rf ${users_policy} ${policy_dir} && |
| echo "Copied user policy" |
| fi |
| |
| # Copying screen-shots if flag --screenshots is specified. |
| if [ ${FLAGS_screenshots} -eq ${FLAGS_TRUE} ]; then |
| cp -f ${home_dir}/user/Downloads/screenshot* ${log_dir}/ && |
| echo "Copied screen-shots" |
| fi |
| |
| # Copying profile data if flag --profile_data is specified. |
| if [ ${FLAGS_profile_data} -eq ${FLAGS_TRUE} ]; then |
| cp -f "${home_dir}/user/Web Data" "${log_dir}/Web Data" && |
| cp -rf "${home_dir}/user/Sync Data" "${log_dir}/Sync Data" && |
| echo "Copied profile data" |
| fi |
| |
| # Copying autotest results if they exist |
| if [ -d "/usr/local/autotest/results" ]; then |
| sudo rsync -a --exclude='*/sysinfo*' "/usr/local/autotest/results" \ |
| "${log_dir}/autotest" |
| echo "Copied autotest results" |
| if [ ${FLAGS_delete} -eq ${FLAGS_TRUE} ]; then |
| rm -rf "/usr/local/autotest/results" |
| fi |
| fi |
| |
| # If we have the synaptics touchpad driver grab those additional files |
| if [ -e "/opt/Synaptics/bin/syncontrol" ]; then |
| mkdir -p ${log_dir}/synaptic_touchpad |
| sudo rm /home/chronos/user/SynDiag* |
| # We can only query syncontrol if it is running |
| if [ -e "/var/run/dbus/synaptics_bus_socket" ]; then |
| DISPLAY=:0 /opt/Synaptics/bin/syncontrol diag |
| sudo cp /home/chronos/user/SynDiag* ${log_dir}/synaptic_touchpad |
| fi |
| fi |
| |
| # Grabbing network profiles. |
| echo "Copying network profiles" |
| network_profiles_dir="${log_dir}/network_profiles" |
| mkdir -p ${network_profiles_dir} |
| for manager in shill; do |
| global_profile="/var/cache/${manager}/" |
| user_profile="/var/run/${manager}/user_profiles/chronos/" |
| for profile in ${global_profile} ${user_profile}; do |
| test -e "${profile}" && \ |
| sudo cp -rf --parents "${profile}" "${network_profiles_dir}" |
| done |
| done |
| |
| # Grabbing preserved memory. |
| if [ -e "/dev/pstore/console-ramoops" ]; then |
| echo "Copying preserved memory" |
| sudo cp /dev/pstore/console-ramoops "${log_dir}/console-ramoops.txt" |
| fi |
| |
| # Compressing the log folder with all collected files. |
| currentdate=$(date +%m%d%y-%H%M%S) |
| sudo tar cjfP ${tar_path}/log-${currentdate}.tar.bz2 ${log_dir}/ |
| sudo rm -rf ${log_dir}/ |
| echo "Log files zipped to folder under ${tar_path}: log-${currentdate}.tar.bz2" |
| |
| # Deleting logs, dumps, screenshots from original location with flag --delete. |
| if [ ${FLAGS_delete} -eq ${FLAGS_TRUE} ]; then |
| echo "Deleting all logs" |
| sudo rm -rf /var/log/* ${home_dir}/${chrome_log_path} |
| sudo rm -rf ${home_dir}/user/log/* ${home_dir}/user/${chrome_log_path} |
| |
| echo "Deleting crash dumps" |
| sudo rm -rf "/var/log/chrome/Crash Reports/" |
| sudo rm -rf ${crash_array} |
| |
| # Deleting screenshots with both --delete and --screenshots flags. |
| if [ ${FLAGS_screenshots} -eq ${FLAGS_TRUE} ]; then |
| echo "Deleting screen-shots" |
| sudo rm -rf ${home_dir}/user/Downloads/Screenshots/* |
| fi |
| |
| # Reboot after deleting all files. |
| echo "Rebooting system after clean up in 1 minute" |
| sudo shutdown -r 1 |
| else |
| echo "Logs and dumps are copied but not deleted." |
| echo "To clear all logs, run the script with --delete flag." |
| echo "For all flag options, run the script with --help or -h flag." |
| fi |