self-hosted/install/error-handling.sh

160 lines
5.2 KiB
Bash

echo "${_group}Setting up error handling ..."
export SENTRY_DSN='https://19555c489ded4769978daae92f2346ca@self-hosted.getsentry.net/3'
export SENTRY_ORG=self-hosted
export SENTRY_PROJECT=installer
export REPORT_ERRORS=0
function send_event {
local sentry_cli="docker run --rm -v $basedir:/work -e SENTRY_ORG=$SENTRY_ORG -e SENTRY_PROJECT=$SENTRY_PROJECT -e SENTRY_DSN=$SENTRY_DSN getsentry/sentry-cli"
command pushd .. > /dev/null
$sentry_cli send-event --no-environ -f "$1" -m "$2" --logfile $log_file
command popd > /dev/null
}
reporterrors="$basedir/.reporterrors"
if [[ -f $reporterrors ]]; then
echo -n "Found a .reporterrors file. What does it say? "
cat $reporterrors
if [[ "$(cat $reporterrors)" == "yes" ]]; then
export REPORT_ERRORS=1
else
export REPORT_ERRORS=0
fi
else
if [[ $PROMPTABLE == "0" ]]; then
echo
echo "Hey, so ... we would love to find out when you hit an issue with this here"
echo "installer you are running. Turns out there is an app for that, called Sentry."
echo "Would you be willing to let us automatically send data to Sentry from this "
echo "installer? If so, add this to your automation:"
echo
echo " echo yes > /path/to/sentry/.reporterrors"
echo
echo "(Btw, we send this to our own self-hosted Sentry instance, not to Sentry SaaS,"
echo "so that we can be in this together.)"
echo
echo "Here's the info we may collect in order to help us improve the installer:"
echo
echo " - OS username"
echo " - IP address"
echo " - install log"
echo " - performance data"
echo
echo "Thirty (30) day retention. No marketing. Privacy policy at sentry.io/privacy."
echo
echo "For now we are defaulting to not sending data, but our plan is to hard-require"
echo "a choice from you starting in version 22.10.0, because let's be honest, none of"
echo "you will act on this otherwise. To avoid disruption you can use one of these"
echo "flags:"
echo
echo " echo no > /path/to/sentry/.reporterrors"
echo
echo "We'll probably also add an env var and/or CLI flag before then, too. See:"
echo
echo " https://github.com/getsentry/team-ospo/issues/36"
echo
echo "Thanks for using Sentry."
echo
else
echo
echo "Hey, so ... we would love to find out when you hit an issue with this here"
echo "installer you are running. Turns out there is an app for that, called Sentry."
echo "Are you okay with us sending info to Sentry when you run this installer?"
echo
echo " y / yes / 1"
echo " n / no / 0"
echo
echo "(Btw, we send this to our own self-hosted Sentry instance, not to Sentry SaaS,"
echo "so that we can be in this together.)"
echo
echo "Here's the info we may collect in order to help us improve the installer:"
echo
echo " - OS username"
echo " - IP address"
echo " - install log"
echo " - performance data"
echo
echo "Thirty (30) day retention. No marketing. Privacy policy at sentry.io/privacy."
echo
yn=""
until [ ! -z "$yn" ]
do
read -p "y or n? " yn
case $yn in
y | yes | 1) export REPORT_ERRORS=1; echo "yes" > $reporterrors; echo; echo -n "Thank you.";;
n | no | 0) export REPORT_ERRORS=0; echo "no" > $reporterrors; echo; echo -n "Understood.";;
*) yn="";;
esac
done
echo " Your answer is cached in '.reporterrors', remove it to see this"
echo "prompt again."
echo
sleep 5
fi
fi
# Make sure we can use sentry-cli if we need it.
if [ "$REPORT_ERRORS" == 1 ]; then
if ! docker pull getsentry/sentry-cli:latest; then
echo "Failed to pull sentry-cli, won't report errors after all."
export REPORT_ERRORS=0
fi;
fi;
# Courtesy of https://stackoverflow.com/a/2183063/90297
trap_with_arg() {
func="$1" ; shift
for sig ; do
trap "$func $sig" "$sig"
done
}
DID_CLEAN_UP=0
# the cleanup function will be the exit point
cleanup () {
local retcode=$?
local cmd="${BASH_COMMAND}"
if [[ "$DID_CLEAN_UP" -eq 1 ]]; then
return 0;
fi
DID_CLEAN_UP=1
if [[ "$1" != "EXIT" ]]; then
set +o xtrace
printf -v err '%s' "Error in ${BASH_SOURCE[1]}:${BASH_LINENO[0]}."
printf -v cmd_exit '%s' "'$cmd' exited with status $retcode"
printf '%s\n%s\n' "$err" "$cmd_exit"
local stack_depth=${#FUNCNAME[@]}
local traceback=""
if [ $stack_depth -gt 2 ]; then
for ((i=$(($stack_depth - 1)),j=1;i>0;i--,j++)); do
local indent="$(yes a | head -$j | tr -d '\n')"
local src=${BASH_SOURCE[$i]}
local lineno=${BASH_LINENO[$i-1]}
local funcname=${FUNCNAME[$i]}
printf -v traceback '%s\n' "$traceback${indent//a/-}> $src:$funcname:$lineno"
done
fi
echo "$traceback"
if [ "$REPORT_ERRORS" == 1 ]; then
local traceback_hash=$(echo -n $traceback | docker run --rm busybox md5sum | cut -d' ' -f1)
send_event "$traceback_hash" "$cmd_exit"
fi
if [[ -n "$MINIMIZE_DOWNTIME" ]]; then
echo "*NOT* cleaning up, to clean your environment run \"docker compose stop\"."
else
echo "Cleaning up..."
fi
fi
if [[ -z "$MINIMIZE_DOWNTIME" ]]; then
$dc stop -t $STOP_TIMEOUT &> /dev/null
fi
}
echo "${_endgroup}"