Added newer script-logging features & implemented them
This commit is contained in:
		
							
								
								
									
										174
									
								
								log-search
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										174
									
								
								log-search
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							| @@ -32,6 +32,16 @@ CONFIG[hour_filter]=0 | ||||
| CONFIG[remote_host]="N/A" | ||||
| CONFIG[local_file]="N/A" | ||||
|  | ||||
| ########################## | ||||
| # An associative array containing varnames that the user want's to keep track of in log output (specific to each function log is being called from) | ||||
| # | ||||
| # [$FUNCNAME]="string of varnames" | ||||
| # | ||||
| # It will keep track of vars seperately of each function that log will be used with | ||||
| ########################## | ||||
| declare -A LOG_WATCH_VARS | ||||
|  | ||||
|  | ||||
| declare -A SEARCH_MODES=( | ||||
|   ['CLUSTER']='(crmd|stonith-ng|cib|stonith|pengine|lrmd|pacemakerd|corosync|drbd|ethmonitor)\S*\[' | ||||
|   ['ISSUES']='warn|crit|fail|err|' | ||||
| @@ -42,25 +52,95 @@ FLAG_REGEX='[\-]+\S+' | ||||
|  | ||||
| # END: Variables | ||||
|  | ||||
| log_import () { | ||||
|         declare -f log_watch_vars log_unwatch_vars log | ||||
|         declare -p LOG_WATCH_VARS | ||||
| } | ||||
|  | ||||
|  | ||||
| # BEGIN: Helper Functions | ||||
| ##################### | ||||
| # Function: log_watch_vars | ||||
| # Usage: Provide a list of variable names to add to the watchlist for the calling function | ||||
| log_watch_vars () { | ||||
| 	local -a REQUESTED_WATCH_VARS=( $* ) | ||||
| 	local CALLING_FUNCTION=${FUNCNAME[1]} | ||||
| 	local FUNC_VARS=${LOG_WATCH_VARS[$CALLING_FUNCTION]} | ||||
| 	local MATCH_REGEX=${FUNC_VARS//[[:space:]]/|} | ||||
|  | ||||
| log () { | ||||
| 	if [[ ${CONFIG[debug]} -eq 1 ]]; then | ||||
| 		local MESSAGE=${1:?"$FUNCNAME: No message provided"} | ||||
| 		local LEVEL_NUM=${2:-0} | ||||
|  | ||||
| 		case $LEVEL_NUM in | ||||
| 			0) LEVEL=INFO;; | ||||
| 			1) LEVEL=WARN;; | ||||
| 			2) LEVEL=CRIT;; | ||||
| 			*) LEVEL=UNDEF;; | ||||
| 		esac | ||||
| 		echo "$(date) : $HOSTNAME : $LEVEL : ${FUNCNAME[1]} : $MESSAGE" | ||||
| 	for VARNAME in ${REQUESTED_WATCH_VARS[@]}; do | ||||
| 		if [[ ! "$VARNAME" =~ ^$MATCH_REGEX$ ]]; then | ||||
| 			FUNC_VARS+=" $VARNAME" | ||||
| 		else | ||||
| 			log "$VARNAME was provided to add to the list, but already existed there" | ||||
| 		fi | ||||
| 	done | ||||
|  | ||||
| 	LOG_WATCH_VARS[$CALLING_FUNCTION]=$FUNC_VARS | ||||
| } | ||||
|  | ||||
| ##################### | ||||
| # Function: log_unwatch_vars | ||||
| # Usage: Provide a list of variable names to remove from the watchlist | ||||
| log_unwatch_vars () { | ||||
| 	## Serialize the variable names provided by user into REGEX filter "(var1|var2|var3|var4|var_n)" | ||||
| 	local MATCH_REGEX="(${@// /|})" | ||||
| 	local CALLING_FUNCTION=${FUNCNAME[1]} | ||||
| 	local FUNC_VARS=${LOG_WATCH_VARS[$CALLING_FUNCTION]} | ||||
| 	local -a TEMP_ARRAY | ||||
|  | ||||
| 	for VARNAME in $FUNC_VARS; do | ||||
| 		if [[ ! "$VARNAME" =~ ^$MATCH_REGEX$ ]]; then | ||||
| 			TEMP_ARRAY+=( $VARNAME ) | ||||
| 		fi | ||||
| 	done | ||||
| 	LOG_WATCH_VARS[$CALLING_FUNCTION]="${TEMP_ARRAY[@]}" | ||||
| } | ||||
|  | ||||
| ########### | ||||
| # Function: log | ||||
| # Usage: Use to print out debug statements for the developer (or user) to display a log output  | ||||
| #        including variable values & names | ||||
| log () { | ||||
|         local MESSAGE=${1:?"$FUNCNAME: No message provided"} | ||||
|         local CALLING_FUNCTION=${FUNCNAME[1]} | ||||
|         local FUNC_VARS=( ${LOG_WATCH_VARS[$CALLING_FUNCTION]} ) | ||||
|         local LEVEL=${2:-0} | ||||
|         local DATE=$(date) | ||||
|         local VAR_WATCH_STRING="" OUTPUT_MESSAGE="" | ||||
|  | ||||
|         if [[ ${CONFIG[debug]} -eq 1 ]]; then | ||||
|           case $LEVEL in | ||||
|             0) LEVEL="INFO";; | ||||
|             1) LEVEL="WARN";; | ||||
|             2) LEVEL="CRIT";; | ||||
|             *) LEVEL="UNDEF";; | ||||
|           esac | ||||
|  | ||||
|           local VARNAME VALUE | ||||
|           if [[ ${#FUNC_VARS[@]} -gt 0 ]]; then | ||||
|                   for VARNAME in ${FUNC_VARS[@]}; do | ||||
|                           local -n VARVALUE=$VARNAME | ||||
|                           if [[ $VARVALUE == "" ]]; then | ||||
|                                   VALUE='N/A' | ||||
|                           else | ||||
|                                   VALUE=$VARVALUE | ||||
|                           fi | ||||
|                           if [[ $VAR_WATCH_STRING == "" ]]; then | ||||
|                                   VAR_WATCH_STRING+="$VARNAME=$VALUE " | ||||
|                           else | ||||
|                                   VAR_WATCH_STRING+=": $VARNAME=$VALUE " | ||||
|                           fi | ||||
|                   done | ||||
|  | ||||
|                   OUTPUT_MESSAGE="$DATE : $HOSTNAME : $LEVEL : $VAR_WATCH_STRING : $MESSAGE" | ||||
|           else | ||||
|                   OUTPUT_MESSAGE="$DATE : $HOSTNAME : $LEVEL : $MESSAGE" | ||||
|           fi | ||||
|  | ||||
|           echo -e "$OUTPUT_MESSAGE" | ||||
|         fi | ||||
| } >&2 | ||||
|  | ||||
| usage () { | ||||
|   cat <<EOF | ||||
| @@ -108,7 +188,7 @@ if [[ $# -eq 0 ]]; then | ||||
| 	exit | ||||
| fi | ||||
|  | ||||
| if grep -E ' (-d|--debug) ' <<< "$@" ; then | ||||
| if [[ "$@" =~ ^.*(-d|--debug).*$ ]]; then | ||||
| 	CONFIG[debug]=1 | ||||
| 	log "user set debug mode" | ||||
| fi | ||||
| @@ -124,6 +204,8 @@ while [[ $# -ne 0 ]]; do | ||||
| 		  if [[ "$2" != "" ]] & [[ $2 -gt 0 ]]; then | ||||
| 			  if [[ ${CONFIG[day_filter]} -eq 0 ]]; then | ||||
| 				  CONFIG[hour_filter]=$2 | ||||
| 				  shift 2 | ||||
| 				  continue | ||||
| 			  else | ||||
| 				  echo "$1 cannot be used with --days" | ||||
| 				  usage  | ||||
| @@ -131,10 +213,13 @@ while [[ $# -ne 0 ]]; do | ||||
| 			  fi | ||||
| 		  fi | ||||
| 		  ;; | ||||
|  | ||||
| 	  --days) | ||||
| 		  if [[ "$2" != "" ]] & [[ $2 -gt 0 ]]; then | ||||
| 			  if [[ ${CONFIG[hour_filter]} -eq 0 ]]; then | ||||
| 				  CONFIG[day_filter]=$2 | ||||
| 				  shift 2 | ||||
| 				  continue | ||||
| 			  else | ||||
| 				  echo "$1 cannot be used with --hours" | ||||
| 				  usage  | ||||
| @@ -142,16 +227,12 @@ while [[ $# -ne 0 ]]; do | ||||
| 			  fi | ||||
| 		  fi | ||||
| 		  ;; | ||||
|  | ||||
| 	  -s | --source ) | ||||
| 		  if [[ "$2" != "" ]] && [[ "${2,,}" =~ ^(log|journal|ilog|file)$ ]]; then | ||||
| 			  case ${2,,} in | ||||
| 				  log) CONFIG[source]="log";; | ||||
| 				  journal) CONFIG[source]='journal';; | ||||
| 				  ilog) CONFIG[source]="ilog";; | ||||
| 				  file) CONFIG[source]="file";; | ||||
| 			  esac | ||||
| 			  CONFIG[source]=${2,,} | ||||
| 			  log "user set the source to ${CONFIG[source]}" | ||||
| 			  shift | ||||
| 			  shift 2 | ||||
| 			  continue | ||||
| 		  else | ||||
| 			  echo "$2 is not a valid option for $1" | ||||
| @@ -161,28 +242,22 @@ while [[ $# -ne 0 ]]; do | ||||
| 	  ;; | ||||
|  | ||||
| 	  -m | --mode) | ||||
| 		  if [[ "$2" != "" ]] && [[ "${2,,}" =~ ^(issues|cluster|custom)$ ]]; then | ||||
| 		  if [[ "$2" != "" ]] && [[ "${2,,}" =~ ^(issues|cluster|custom|all)$ ]]; then | ||||
| 		    case ${2,,} in | ||||
| 		      issues)  | ||||
| 			      CONFIG[mode]="issues" | ||||
| 			      CONFIG[regex]=${SEARCH_MODES[${2^^}]} | ||||
| 			      ;; | ||||
| 		      cluster)  | ||||
| 			      CONFIG[mode]='cluster' | ||||
| 		      issues | cluster | all ) | ||||
| 			      CONFIG[mode]=$2 | ||||
| 			      CONFIG[regex]=${SEARCH_MODES[${2^^}]} | ||||
| 			      TOTAL=2 | ||||
| 			      ;; | ||||
| 		      custom ) | ||||
| 			      CONFIG[mode]='custom' | ||||
| 			      CONFIG[regex]="$3" | ||||
| 			      ;; | ||||
| 		      all ) | ||||
| 			      CONFIG[mode]='all' | ||||
| 			      CONFIG[regex]=${SEARCH_MODES[${2^^}]} | ||||
| 			      ;; | ||||
| 			      TOTAL=3 | ||||
| 	  	    esac | ||||
| 		    log "user set search mode and regex to ${CONFIG[mode]}, ${CONFIG[regex]}" | ||||
| 		    shift | ||||
| 		    shift $TOTAL | ||||
| 		    continue | ||||
|  | ||||
| 		  else | ||||
| 			  echo "$2 is not a valid option for $1" | ||||
| 			  usage | ||||
| @@ -194,24 +269,30 @@ while [[ $# -ne 0 ]]; do | ||||
| 		  if [[ $2 != "" ]]; then | ||||
| 			  log "user set output file to be ${CONFIG[output_file]}" | ||||
| 			  CONFIG[output_file]=$2 | ||||
| 			  shift | ||||
| 			  shift 2 | ||||
| 			  continue | ||||
| 		  fi | ||||
| 	  ;; | ||||
|  | ||||
| 	  --services) | ||||
| 		  log "user is searching for service names" | ||||
| 		  CONFIG[service_search]=1 | ||||
| 		  shift | ||||
| 		  continue | ||||
| 	  ;; | ||||
|  | ||||
| 	  --filename) | ||||
| 		  if [[ "$2" != "" ]]; then | ||||
| 			  CONFIG[local_file]=$2 | ||||
| 			  shift 2 | ||||
| 			  continue | ||||
| 		  fi | ||||
|           ;; | ||||
| 	  -f | --filter-regex) | ||||
| 		  if [[ "$2" != "" ]]; then | ||||
| 			  CONFIG[service_filter]=$2 | ||||
| 			  log "user provided a search term/regex ${CONFIG[service_filter]}" | ||||
| 			  shift | ||||
| 			  shift 2 | ||||
| 			  continue | ||||
| 		  fi | ||||
| 	  ;; | ||||
| @@ -219,6 +300,8 @@ while [[ $# -ne 0 ]]; do | ||||
| 	  --remote ) | ||||
| 		  if [[ $2 != "" ]] && [[ ! $2 =~ ^$FLAG_REGEX$ ]]; then | ||||
| 			  CONFIG[remote_host]=$2 | ||||
| 			  shift 2 | ||||
| 			  continue | ||||
| 		  fi | ||||
| 	  ;; | ||||
|  | ||||
| @@ -226,6 +309,8 @@ while [[ $# -ne 0 ]]; do | ||||
| 		  if [[ "$2" != "" ]] ; then | ||||
| 			  log "user set hostname to $2" | ||||
| 			  CONFIG[hostname]=$2 | ||||
| 			  shift 2 | ||||
| 			  continue | ||||
| 		  fi | ||||
| 	  ;; | ||||
|  | ||||
| @@ -273,12 +358,14 @@ esac | ||||
| # BEGIN: Work Functions | ||||
|  | ||||
| import () { | ||||
| 	log_import | ||||
| 	declare -f gather_logs_from_journal gather_logs_from_files gather_logs_from_files_interactive log gather_logs_from_local_file  | ||||
| 	CONFIG[remote_host]="" | ||||
| 	declare -p CONFIG | ||||
| } | ||||
|  | ||||
| gather_logs_from_journal () { | ||||
| 	log_watch_vars CONFIG[day_filter] CONFIG[hour_filter] CONFIG[regex] | ||||
| 	log "About to load logs from journal" | ||||
| 	if [[ ${CONFIG[day_filter]} -gt 0 ]]; then | ||||
| 		sudo journalctl --since "${CONFIG[day_filter]} days ago"  --no-pager | grep -E ${CONFIG[regex]} | ||||
|  | ||||
| @@ -286,15 +373,16 @@ gather_logs_from_journal () { | ||||
| 		sudo journalctl --since "${CONFIG[hour_filter]} hours ago"  --no-pager | grep -E ${CONFIG[regex]} | ||||
|  | ||||
| 	else | ||||
| 		sudo journalctl --no-pager | grep -E ${CONFIG[regex]} | ||||
| 		sudo journalctl --no-pager | grep -E "${CONFIG[regex]}" | ||||
| 	fi | ||||
| } | ||||
|  | ||||
| gather_logs_from_files () { | ||||
| 	log_watch_vars CONFIG[hostname] CONFIG[regex] CONFIG[last_nth_days] | ||||
| 	if [[ ! -d /var/log/hosts/${CONFIG[hostname]} ]]; then | ||||
| 		echo "Hosts log directory for ${CONFIG[hostname]} does not exist" | ||||
| 		exit | ||||
| 	fi | ||||
| 	i | ||||
|  | ||||
| 	log "User is getting logs from the last ${CONFIG[last_nth_days]} files" | ||||
| 	local -a FILES=( $( sudo ls -1r /var/log/hosts/${CONFIG[hostname]}/*/*/*/messages* ) ) | ||||
| @@ -305,6 +393,7 @@ for FILE in ${FILES[@]}; do | ||||
| done | ||||
| )" | ||||
|  | ||||
| 	log_watch_vars FILE EXT GREP | ||||
| 	local FILE EXT | ||||
| 	for FILE in ${FILES[@]::${CONFIG[last_nth_days]}}; do  | ||||
| 		log "$FILE being checked" | ||||
| @@ -321,6 +410,8 @@ done | ||||
| } | ||||
|  | ||||
| gather_logs_from_files_interactive () { | ||||
| 	log_watch_vars CONFIG[hostname] CONFIG[regex] | ||||
| 	log "Preparing to obtain logs from messages files" | ||||
| 	if [[ ! -d /var/log/hosts/${CONFIG[hostname]} ]]; then | ||||
| 		echo "Hosts log directory for ${CONFIG[hostname]} does not exist" | ||||
| 		exit | ||||
| @@ -355,6 +446,7 @@ gather_logs_from_files_interactive () { | ||||
|  | ||||
|  | ||||
|  | ||||
| 	log_watch_vars FILE EXT GREP | ||||
| 	local FILE EXT | ||||
| 	for FILE in ${FILE_CHOICES[@]}; do  | ||||
| 		log "$FILE being checked" | ||||
| @@ -372,10 +464,12 @@ gather_logs_from_files_interactive () { | ||||
| } | ||||
|  | ||||
| gather_logs_from_local_file () { | ||||
| 	log_watch_vars CONFIG[local_file] CONFIG[regex] | ||||
| 	if [[ ! -f ${CONFIG[local_file]} ]]; then | ||||
| 		echo "$HOSTNAME : ${CONFIG[local_file]} does not exist" | ||||
| 		exit | ||||
| 	fi | ||||
| 	log_watch_vars FILE EXT GREP | ||||
| 	FILE=${CONFIG[local_file]} | ||||
| 	log "$FILE being checked" | ||||
| 	EXT=$( basename $FILE | cut -d '.' -f 2 ) | ||||
| @@ -402,7 +496,9 @@ case ${CONFIG[source]} in | ||||
| 	file) COMMAND=gather_logs_from_local_file;; | ||||
| esac | ||||
|  | ||||
| log_watch_vars COMMAND  | ||||
| if [[ ${CONFIG[remote_host]} != "" ]]; then | ||||
| 	log "CONFIG[remote_host] was specified as ${CONFIG[remote_host]}. Going to be running search remotely" | ||||
| 	if [[ ${CONFIG[service_search]} -eq 1 ]]; then | ||||
| 		ssh ${CONFIG[remote_host]} "$( import ); $COMMAND" | awk '{ print $5 }' | cut -d '[' -f 1 | sort -u | tr -d ':' | ||||
|  | ||||
| @@ -430,6 +526,6 @@ else | ||||
| 	else | ||||
| 		$COMMAND | ||||
| 	fi | ||||
| fi | ||||
| fi | sort  | ||||
|  | ||||
| # END: Work | ||||
|   | ||||
		Reference in New Issue
	
	Block a user