diff options
Diffstat (limited to 'src/util/dovecot-sysreport')
-rwxr-xr-x | src/util/dovecot-sysreport | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/src/util/dovecot-sysreport b/src/util/dovecot-sysreport new file mode 100755 index 0000000..59afcb9 --- /dev/null +++ b/src/util/dovecot-sysreport @@ -0,0 +1,216 @@ +#!/usr/bin/env bash + +set -eu + +dest="dovecot-sysreport-$(uname -n)-$(date +'%s').tar.gz" +conf_flag="" +binary="" +core="" +copy_files="" +keep_temp=0 + +PARAMS="" +SRTEMP="`mktemp -d`" + +if test "x$SRTEMP" = x; then + echo "Could not create temp directory" + exit 1 +fi + +while (( "$#" )); do + case "$1" in + -d|--destination) + + if [ "$#" -lt "2" ] ; then + echo "Usage: $0 $1 <destination.tar.gz>" + exit 1 + fi + dest=$2 + shift 2 + ;; + + -c|--config) + + if [ "$#" -lt "2" ] ; then + echo "Usage: $0 $1 <config_file>" + exit 1 + fi + conf_flag="-c $2" + shift 2 + ;; + + -o|--core) + + gdb=`which gdb` + if [ "$gdb" = "" ]; then + echo "gdb not found" + exit 1 + fi + + if [[ "$#" -lt 2 ]] ; then + echo "Usage: $0 $1 [<binary>] <core> [...]" + exit 1 + fi + + while [[ "$#" -ge 2 ]]; do + # see if binary parameter is specified + binary=$2 + if ! [ -r "$binary" ]; then + echo "$binary not readable" + exit 1 + fi + binary_info=$(file "$binary") + if echo "$binary_info" | grep "core file.*execfn: '" >/dev/null; then + # no binary specified - detect it + binary=$(echo "$binary_info" | sed "s;^.*execfn: '\([^\']\+\)'.*$;\1;") + if ! [ -r "$binary" ]; then + echo "Detected binary path '$binary' from core file, but it is not readable" + exit 1 + fi + echo "Core file was detected to be generated by $binary" + else + shift + fi + + core=$2 + shift + if ! [ -s "$core" ]; then + echo "$core not found or it is empty" + exit 1 + fi + + echo "gathering core file dependencies..." + core_files=$((echo "info shared"; sleep 1) | $gdb $binary $core | grep '^0x.*/' | sed 's,^[^/]*,,') + copy_files="$copy_files $binary $core_files" + cp $core $SRTEMP + done + shift + ;; + + -k|--keeptemp) + + keep_temp=1 + shift + ;; + + -h|--help) + + echo -e "dovecot-sysreport \t[-h|--help] [-o|--core [binary] core [...]] [-d|--destination dest] + \t\t\t[-k|--keeptemp] -- utility to gather information from the current + \t\t\tsystem to be reported for dovecot bug fixes." + echo "" + echo -e "where:" + echo "" + echo -e "\t-h, --help\t\tShow the contents of this help." + echo -e "\t-d, --destination\tThe file location which the report archive should be put to. + \t\t\t\tThe default value is dovecot-sysreport-<hostname>-<current_timestamp>.tar.gz" + echo -e "\t-c, --config\t\tSpecify the root configuration file of dovecot." + echo -e "\t-o, --core\t\tInclude an specific core file along with its dependencies." + echo -e "\t-k, --keeptemp\t\tDo not remove temp files at the end." + exit 0 + ;; + + --) + + shift + break + ;; + + -*|--*=) + + echo "Error: Unsupported flag $1" >&2 + exit 1 + ;; + + *) + + PARAMS="$PARAMS $1" + shift + ;; + + esac +done + +eval set -- "$PARAMS" + +mkdir $SRTEMP/conf + +doveconf $conf_flag -n > $SRTEMP/conf/dovecot.conf + +unwrap_and_hide_pass () { + files=`grep -zPo 'dict\s*{[^}]*}' $1 | grep -zPo '.*=.*:\K(.*)' | tr '\0' '\n'` + files="$files `grep -zPo 'args\s*=\s*\K(.*)' $1 | tr '\0' '\n'`" + for cf in $files; do + if [ -r "$cf" ]; then + if [[ ! -z `grep -vhIE '^([^:]*:){6}[^:]*$' $cf` ]]; then + unwrap_and_hide_pass $cf + mkdir -p $SRTEMP/conf"$(dirname "$cf")" + if [[ -x "$(command -v python)" ]]; then + python <<HEREDOC +import re +conf = open('$cf', 'r').read() +hidden = re.sub('(?<!no)((?:password|key|nonce|dnpass)\s*=\s*).*?(?=$|\s)', '\g<1>#hidden', conf) +f = open('$SRTEMP/conf$cf', "w") +f.write(hidden) +f.close() +HEREDOC + elif [[ -x "$(command -v perl)" ]]; then + perl -pe 's/(?<!no)((?:password|key|nonce|dnpass)\s*=\s*).*?(?=$|\s)/\1#hidden/g' \ + $cf > $SRTEMP/conf$cf + else + echo "perl or python is required to hide your passwords in dovecot's" + echo "configuration files. Either install at least one of them or" + echo "continue at your own peril. Do you want to continue (N/y)? " + read permit + if [ "$permit" != "Y" ] && [ "$permit" != "y" ]; then + exit 1 + fi + cat $cf > $SRTEMP/conf$cf + fi + fi + fi + done +} + +echo "Gathering configurations ..." +unwrap_and_hide_pass $SRTEMP/conf/dovecot.conf + +echo "Gathering system informations ..." +doveadm $conf_flag log errors > $SRTEMP/log_errors || : +(printf "# Start: "; date) >$SRTEMP/ps_output +ps auxwww | grep '[d]ovecot' >> $SRTEMP/ps_output +(printf "# End: "; date) >>$SRTEMP/ps_output +doveadm $conf_flag service status > $SRTEMP/service_status || : +doveadm $conf_flag process status > $SRTEMP/process_status || : +uptime > $SRTEMP/uptime_output +doveadm $conf_flag stats dump > $SRTEMP/stats_dump || : +sleep 3 +echo -e "\n\n###################### AFTER 3 SECONDS ######################\n\n" | \ + tee -a $SRTEMP/ps_output $SRTEMP/service_status $SRTEMP/process_status \ + $SRTEMP/uptime_output $SRTEMP/stats_dump > /dev/null +(printf "# Start: "; date) >>$SRTEMP/ps_output +ps auxwww | grep '[d]ovecot' >> $SRTEMP/ps_output +(printf "# End: "; date) >>$SRTEMP/ps_output +doveadm $conf_flag service status >> $SRTEMP/service_status || : +doveadm $conf_flag process status >> $SRTEMP/process_status || : +uptime >> $SRTEMP/uptime_output +doveadm $conf_flag stats dump >> $SRTEMP/stats_dump || : + +cf=`pwd` +cd $SRTEMP +echo "Creating archive ..." +tar -czf `if [[ "$dest" = /* ]]; then echo $dest; else echo $cf/$dest; fi` --dereference \ + $copy_files * + +function cleanup { + if [ $keep_temp = 0 ]; then + echo "Removing temp files at $SRTEMP ..." + rm -rf $SRTEMP + else + echo "Temp files remains untouched at $SRTEMP ..." + fi +} + +trap cleanup EXIT + +echo "All done! Please report file $dest" |