From 6a387a3a9d150ff972e6842e07a96a288eda4471 Mon Sep 17 00:00:00 2001 From: Ken Gaillot Date: Wed, 16 Aug 2017 20:37:36 -0500 Subject: [PATCH] Fix: tools: allow crm_report to work with no log files specified 582e886d broke crm_report --sos-mode Specifying no log files is a valid use case: someone might want to collect only the other information (cluster configuration, policy engine inputs, etc.); or someone might use only the systemd journal and no log files. --- tools/report.collector | 143 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 93 insertions(+), 50 deletions(-) diff --git a/tools/report.collector b/tools/report.collector index 0130a2b..d7c7c51 100644 --- a/tools/report.collector +++ b/tools/report.collector @@ -693,6 +693,85 @@ EOF esac } +# Trim leading and ending whitespace (using only POSIX expressions) +trim() { + TRIM_S="$1" + + TRIM_S="${TRIM_S#"${TRIM_S%%[![:space:]]*}"}" + TRIM_S="${TRIM_S%"${TRIM_S##*[![:space:]]}"}" + echo -n "$TRIM_S" +} + +collect_logs() { + CL_START="$1" + shift + CL_END="$1" + shift + CL_LOGFILES="$@" + + which journalctl > /dev/null 2>&1 + if [ $? -eq 0 ]; then + cl_have_journald=1 + else + cl_have_journald=0 + fi + + cl_lognames="$CL_LOGFILES" + if [ $cl_have_journald -eq 1 ]; then + cl_lognames="$cl_lognames journalctl" + fi + cl_lognames=$(trim "$cl_lognames") + if [ -z "$cl_lognames" ]; then + return + fi + + # YYYY-MM-DD HH:MM:SS + cl_start_ymd=$(date -d @${CL_START} +"%F %T") + cl_end_ymd=$(date -d @${CL_END} +"%F %T") + + debug "Gathering logs from $cl_start_ymd to $cl_end_ymd:" + debug " $cl_lognames" + + # Remove our temporary file if we get interrupted here + trap '[ -z "$cl_pattfile" ] || rm -f "$cl_pattfile"' 0 + + # Create a temporary file with patterns to grep for + cl_pattfile=$(mktemp) || fatal "cannot create temporary files" + for cl_pattern in $LOG_PATTERNS; do + echo "$cl_pattern" + done > $cl_pattfile + + echo "Log pattern matches from $REPORT_TARGET:" > $ANALYSIS_F + if [ -n "$CL_LOGFILES" ]; then + for cl_logfile in $CL_LOGFILES; do + cl_extract="$(basename $cl_logfile).extract.txt" + + if [ ! -f "$cl_logfile" ]; then + # Not a file + continue + + elif [ -f "$cl_extract" ]; then + # We already have it + continue + fi + + dumplogset "$cl_logfile" $LOG_START $LOG_END > "$cl_extract" + sanitize "$cl_extract" + + grep -f "$cl_pattfile" "$cl_extract" >> $ANALYSIS_F + done + fi + + # Collect systemd logs if present + if [ $cl_have_journald -eq 1 ]; then + journalctl --since "$cl_start_ymd" --until "$cl_end_ymd" > journal.log + grep -f "$cl_pattfile" journal.log >> $ANALYSIS_F + fi + + rm -f $cl_pattfile + trap "" 0 +} + debug "Initializing $REPORT_TARGET subdir" if [ "$REPORT_MASTER" != "$REPORT_TARGET" ]; then if [ -e $REPORT_HOME/$REPORT_TARGET ]; then @@ -718,17 +797,19 @@ if [ -z "$cluster_cf" ] && [ $cluster != "any" ]; then warning "Could not determine the location of your cluster configuration" fi -if [ $SEARCH_LOGS = 1 ]; then - logfiles=`get_logfiles $cluster "$cluster_cf" "$logd_cf" | sort -u` - if [ -z "$logfiles" ]; then - fatal "Logfile discovery disabled, try specifying --logfile /some/path" - fi - -elif [ -z "$EXTRA_LOGS" ]; then - fatal "Could not determine the location of your cluster logs, try specifying --logfile /some/path" +if [ "$SEARCH_LOGS" = "1" ]; then + logfiles=$(get_logfiles "$cluster" "$cluster_cf" "$logd_cf" | sort -u) +fi +logfiles="$(trim "$logfiles $EXTRA_LOGS")" -else - logfiles="$EXTRA_LOGS" +if [ -z "$logfiles" ]; then + which journalctl > /dev/null 2>&1 + if [ $? -eq 0 ]; then + info "Systemd journal will be only log collected" + else + info "No logs will be collected" + fi + info "No log files found or specified with --logfile /some/path" fi debug "Config: $cluster ($cluster_cf $logd_cf) $logfiles" @@ -783,45 +864,7 @@ done # in it (AFTER sanitizing, so we don't need to sanitize this output) get_readable_cib "$REPORT_HOME/$REPORT_TARGET" -# Grab logs -start=`date -d @${LOG_START} +"%F %T"` -end=`date -d @${LOG_END} +"%F %T"` - -debug "Gathering logs from $start to $end: $logfiles $EXTRA_LOGS" -trap '[ -z "$pattfile" ] || rm -f "$pattfile"' 0 -pattfile=`mktemp` || fatal "cannot create temporary files" -for p in $LOG_PATTERNS; do - echo "$p" -done > $pattfile - -for l in $logfiles $EXTRA_LOGS; do - b="$(basename $l).extract.txt" - - if [ ! -f "$l" ]; then - # Not a file - continue - - elif [ -f "$b" ]; then - # We already have it - continue - fi - - dumplogset "$l" $LOG_START $LOG_END > "$b" - sanitize "$b" - - echo "Log patterns $REPORT_TARGET:" > $ANALYSIS_F - grep -f "$pattfile" "$b" >> $ANALYSIS_F -done - -which journalctl > /dev/null 2>&1 -if [ $? = 0 ]; then - log "Including segment [$LOG_START-$LOG_END] from journald" - journalctl --since "$start" --until "$end" > journal.log - cat journal.log | grep -f $pattfile >> $ANALYSIS_F -fi - -rm -f $pattfile -trap "" 0 +collect_logs "$LOG_START" "$LOG_END" $logfiles # Purge files containing no information for f in `ls -1`; do @@ -838,7 +881,7 @@ for f in `ls -1`; do done # Parse for events -for l in $logfiles $EXTRA_LOGS; do +for l in $logfiles; do b="$(basename $l).extract.txt" node_events "$b" > $EVENTS_F -- 1.8.3.1