| #!/bin/bash |
| |
| PROGRAM_NAME=$(basename "$0") |
| TEMPDIR=$(mktemp -p /tmp -d bugreport.XXXXXXXX) |
| |
| QUIET="" |
| DEBUG="" |
| SUMMARY="" |
| PACKAGE="" |
| |
| function die |
| { |
| echo "${PROGRAM_NAME}: $@" |
| exit 1 |
| } |
| |
| function show-help |
| { |
| cat <<EOF |
| Usage: $PROGRAM_NAME [-d] [-h] [-p <packagename>] [-s <summary>] |
| |
| Where the options are: |
| -d Turns on debug mode. Doesn't delete the temp directory this script |
| creates. |
| -h Shows this help text. |
| -p <packagename> |
| Sets the package name this bugreport pertains to. |
| -s <summary> |
| Sets the summary about what this bug is about. |
| EOF |
| exit 1 |
| } |
| |
| function cleanup |
| { |
| rm -rf "${TEMPDIR}" |
| } |
| |
| function is-debug-on |
| { |
| if [[ -z "${DEBUG}" ]]; then |
| return 1 |
| fi |
| return 0 |
| } |
| |
| function debug |
| { |
| if is-debug-on; then |
| echo "$@" |
| fi |
| } |
| |
| function gather-system-info |
| { |
| cat <<EOF |
| --- system information |
| $(uname -a) |
| $(uptime) |
| $(lsb_release -idrc) |
| |
| --- dmesg |
| $(dmesg) |
| |
| --- systemctl status |
| $(systemctl -l --no-legend) |
| |
| --- installed packages |
| $(dpkg --get-selections) |
| |
| --- apt sources |
| EOF |
| |
| if [[ -e /etc/apt/sources.list.d/* ]]; then |
| cat /etc/apt/sources.list.d/* |
| fi |
| |
| if [[ -f /etc/apt/sources.list ]]; then |
| cat /etc/apt/sources.list |
| fi |
| } |
| |
| function generate-message |
| { |
| cat <<EOF |
| --- summary |
| $SUMMARY |
| |
| --- package affected |
| $PACKAGE |
| |
| --- date |
| $(date) |
| |
| EOF |
| } |
| |
| function get-summary-line |
| { |
| local message="$1" |
| local done |
| local yn |
| |
| while [[ -z "${done}" ]]; do |
| echo "${message}" |
| read -p '> ' SUMMARY |
| |
| if [[ -z "${SUMMARY}" ]]; then |
| echo |
| echo "Sorry, please try again." |
| continue |
| fi |
| |
| read -p "Does this look correct? (y/n) " yn |
| if [[ "${yn}" == "y" ]]; then |
| done=t |
| fi |
| done |
| } |
| |
| function main |
| { |
| local args=$(getopt hdp:s:q $*) |
| local keep_tempdir="" |
| |
| set -- $args |
| |
| for i; do |
| case "$1" in |
| -d) # debug (don't delete tempdir) |
| QUIET="" |
| DEBUG=1 |
| shift |
| ;; |
| |
| -p) # package |
| PACKAGE="$2" |
| shift 2 |
| ;; |
| |
| -s) # summary |
| SUMMARY="$2" |
| shift 2 |
| ;; |
| |
| -q) # quiet |
| QUIET=1 |
| DEBUG="" |
| shift 1 |
| ;; |
| |
| --) |
| shift |
| break |
| ;; |
| |
| -h|*) # help |
| show-help |
| exit 1 |
| ;; |
| esac |
| done |
| |
| if ! is-debug-on; then |
| trap cleanup EXIT |
| fi |
| |
| debug "Working in ${TEMPDIR}" |
| gather-system-info > "${TEMPDIR}/system-info.txt" |
| |
| if [[ -z "$SUMMARY" ]]; then |
| get-summary-line "In a few words, describe the problem you've experienced." |
| fi |
| |
| if [[ -z "$PACKAGE" ]]; then |
| echo "If you know the name of the package you think this relates to, please enter it here." |
| echo "If you don't, just press ENTER here." |
| read -p "> " PACKAGE |
| fi |
| |
| generate-message > "${TEMPDIR}/message.txt" |
| |
| local bugreport_filename="bugreport-$(date +%Y%m%dT%H%M%S).txt" |
| cat "${TEMPDIR}/message.txt" "${TEMPDIR}/system-info.txt" > "${TEMPDIR}/${bugreport_filename}" |
| gzip "${TEMPDIR}/${bugreport_filename}" |
| mv "${TEMPDIR}/${bugreport_filename}.gz" . |
| |
| if [[ -z "${QUIET}" ]]; then |
| cat <<EOF |
| |
| Bugreport saved as ${bugreport_filename}.gz in your current directory. |
| |
| This is a plain text file containing system information. You can examine it by |
| running the command 'zless ${bugreport_filename}.gz'. |
| |
| Please attach this in an email to coral-support@google.com. |
| EOF |
| else |
| echo "${bugreport_filename}.gz" |
| fi |
| } |
| |
| main "$@" |