Reworked the output of the devices.
Still, I haven't figured out how the spare devices work
This commit is contained in:
		
							parent
							
								
									d97b8623eb
								
							
						
					
					
						commit
						e0970fb5ec
					
				
					 7 changed files with 67 additions and 28 deletions
				
			
		| 
						 | 
					@ -46,6 +46,7 @@ function logLine {
 | 
				
			||||||
		echo "  : $@"
 | 
							echo "  : $@"
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					NL=$'\n'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CURRENT_RAID=	# string
 | 
					CURRENT_RAID=	# string
 | 
				
			||||||
function setCurrentRaid {
 | 
					function setCurrentRaid {
 | 
				
			||||||
| 
						 | 
					@ -64,7 +65,8 @@ function setCurrentRaid {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
STATE=		# "active", "started", "inactive"
 | 
					STATE=		# "active", "started", "inactive"
 | 
				
			||||||
LEVEL=		# int
 | 
					LEVEL=		# int
 | 
				
			||||||
DEVICES=	# strings separated by whitespace
 | 
					declare -A DEVICES	# dict of strings. key = index, value = dev name
 | 
				
			||||||
 | 
					declare -A FAILED_DEVICES
 | 
				
			||||||
function setStateAndDevicesAndLevel {
 | 
					function setStateAndDevicesAndLevel {
 | 
				
			||||||
	# This functions is called for the line that starts a new RAID device by setCurrentRaid, with the complete line in $1
 | 
						# This functions is called for the line that starts a new RAID device by setCurrentRaid, with the complete line in $1
 | 
				
			||||||
	# It parses the STATE, the LEVEL and the DEVICES
 | 
						# It parses the STATE, the LEVEL and the DEVICES
 | 
				
			||||||
| 
						 | 
					@ -78,19 +80,26 @@ function setStateAndDevicesAndLevel {
 | 
				
			||||||
	LEVEL="${LEVEL:4}"					# Remove the raid prefix
 | 
						LEVEL="${LEVEL:4}"					# Remove the raid prefix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for dev1 in $x3; do
 | 
						for dev1 in $x3; do
 | 
				
			||||||
		local dev2="${dev1%[*}"
 | 
							local devName="${dev1%[*}"		# device name
 | 
				
			||||||
		if [ -n "$DEVICES" ]; then DEVICES="$DEVICES "; fi
 | 
							local dev2="${dev1#*[}"			# all after device name
 | 
				
			||||||
		DEVICES="${DEVICES}$dev2"
 | 
							local devIndex="${dev2%]*}"		# device index
 | 
				
			||||||
 | 
							local dev3="${dev2#*]}"			# all after device index
 | 
				
			||||||
 | 
							local devFailed=false
 | 
				
			||||||
 | 
							DEVICES[$devIndex]="$devName"
 | 
				
			||||||
 | 
							FAILED_DEVICES[$devIndex]=false
 | 
				
			||||||
 | 
							if [ -n "$dev3" ]; then
 | 
				
			||||||
 | 
								FAILED_DEVICES[$devIndex]=true
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
	done
 | 
						done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	log "STATE = $STATE"
 | 
						log "STATE = $STATE"
 | 
				
			||||||
	log "LEVEL = $LEVEL"
 | 
						log "LEVEL = $LEVEL"
 | 
				
			||||||
	log "DEVICES = $DEVICES"
 | 
						log "DEVICES = ${DEVICES[@]}"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SIZE_IN_BLOCKS="!"			# int
 | 
					SIZE_IN_BLOCKS="!"			# int
 | 
				
			||||||
NUM_DEVICES=0		# int with number of devices in raid
 | 
					NUM_DEVICES=0				# int with total number of devices in raid
 | 
				
			||||||
BAD_DEVICES=0		# int with number of "_" in "[UUU_UU]"
 | 
					NUM_ACTIVE_DEVICES=0		# int with number of active devices in raid
 | 
				
			||||||
function parseConfigStatusLine {
 | 
					function parseConfigStatusLine {
 | 
				
			||||||
	# This function is called for 1st line after the raid definition line
 | 
						# This function is called for 1st line after the raid definition line
 | 
				
			||||||
	# It parses the SIZE_IN_BLOCKS
 | 
						# It parses the SIZE_IN_BLOCKS
 | 
				
			||||||
| 
						 | 
					@ -98,16 +107,17 @@ function parseConfigStatusLine {
 | 
				
			||||||
	line=$(echo $line)	# trim left
 | 
						line=$(echo $line)	# trim left
 | 
				
			||||||
	SIZE_IN_BLOCKS=${line%% *}
 | 
						SIZE_IN_BLOCKS=${line%% *}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local lastWord=${line##* }	# Get the last word
 | 
						local x1=${line##* }		# Get the last word [UU_]
 | 
				
			||||||
	lastWord=${lastWord:1:-1}	# Remove first and last char
 | 
						local x2=${line% *}			# Remove the last word
 | 
				
			||||||
	NUM_DEVICES=${#lastWord}	# str length = num devices
 | 
						local x3=${x2##* }			# Get the last word [3/2]
 | 
				
			||||||
	lastWord=${lastWord//U/}	# Remove all U, so only _ remain
 | 
						x3=${x3:1:-1}
 | 
				
			||||||
	BAD_DEVICES=${#lastWord}	# str length = num bad devices
 | 
						NUM_DEVICES=${x3%/*}
 | 
				
			||||||
 | 
						NUM_ACTIVE_DEVICES=${x3#*/}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	log "SIZE_IN_BLOCKS = $SIZE_IN_BLOCKS"
 | 
						log "SIZE_IN_BLOCKS = $SIZE_IN_BLOCKS"
 | 
				
			||||||
	log "NUM_DEVICES = $NUM_DEVICES"
 | 
						log "NUM_DEVICES = $NUM_DEVICES"
 | 
				
			||||||
	log "BAD_DEVICES = $BAD_DEVICES"
 | 
						log "NUM_ACTIVE_DEVICES = $NUM_ACTIVE_DEVICES"
 | 
				
			||||||
	# TODO
 | 
						# TODO
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -150,6 +160,14 @@ function printOutputAndExit {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local result="OK"
 | 
						local result="OK"
 | 
				
			||||||
	local info=""
 | 
						local info=""
 | 
				
			||||||
 | 
						local numFailedDevices=0
 | 
				
			||||||
 | 
						local numSpareDevices=0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if [ $NUM_ACTIVE_DEVICES -lt $NUM_DEVICES ]; then
 | 
				
			||||||
 | 
							result="CRITICAL"
 | 
				
			||||||
 | 
							if [ -n "$info" ]; then info="$info. "; fi
 | 
				
			||||||
 | 
							info="${info}Missing $(($NUM_DEVICES - $NUM_ACTIVE_DEVICES)) of $NUM_DEVICES devices"
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if [ -n "$RECOVERY_PROGRESS" ]; then
 | 
						if [ -n "$RECOVERY_PROGRESS" ]; then
 | 
				
			||||||
		result="WARNING"
 | 
							result="WARNING"
 | 
				
			||||||
| 
						 | 
					@ -157,18 +175,26 @@ function printOutputAndExit {
 | 
				
			||||||
		info="${info}Recovering: progress=$RECOVERY_PROGRESS% $RECOVERY_INFO"
 | 
							info="${info}Recovering: progress=$RECOVERY_PROGRESS% $RECOVERY_INFO"
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local devIndices="$(printf "%s\n" "${!DEVICES[@]}" | sort -n)"
 | 
				
			||||||
 | 
						for devIndex in $devIndices; do
 | 
				
			||||||
 | 
							if [ -z "${DEVICES[$devIndex]}" ]; then
 | 
				
			||||||
 | 
								((numSpareDevies++))
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
							if ${FAILED_DEVICES[$devIndex]}; then
 | 
				
			||||||
 | 
								result="CRITICAL"
 | 
				
			||||||
 | 
								((numFailedDevices++))
 | 
				
			||||||
 | 
								if [ -n "$info" ]; then info="$info. "; fi
 | 
				
			||||||
 | 
								info="${info}Device ${DEVICES[$devIndex]} failed"
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if [ "$STATE" != "active" -a "$STATE" != "started" ]; then
 | 
						if [ "$STATE" != "active" -a "$STATE" != "started" ]; then
 | 
				
			||||||
		result="CRITICAL"
 | 
							result="CRITICAL"
 | 
				
			||||||
		if [ -n "$info" ]; then info="$info. "; fi
 | 
							if [ -n "$info" ]; then info="$info. "; fi
 | 
				
			||||||
		info="${info}State is $STATE"
 | 
							info="${info}State is $STATE"
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if [ $BAD_DEVICES -gt 0 ]; then
 | 
					 | 
				
			||||||
		result="CRITICAL"
 | 
					 | 
				
			||||||
		if [ -n "$info" ]; then info="$info. "; fi
 | 
					 | 
				
			||||||
		info="${info}Missing $BAD_DEVICES of $NUM_DEVICES devices"
 | 
					 | 
				
			||||||
	fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	echo -n "$result"
 | 
						echo -n "$result"
 | 
				
			||||||
	if [ -n "$info" ]; then
 | 
						if [ -n "$info" ]; then
 | 
				
			||||||
		echo -n ": $info"
 | 
							echo -n ": $info"
 | 
				
			||||||
| 
						 | 
					@ -178,10 +204,23 @@ function printOutputAndExit {
 | 
				
			||||||
	echo -n " 'raid level'=$LEVEL"
 | 
						echo -n " 'raid level'=$LEVEL"
 | 
				
			||||||
	echo -n " 'size in blocks'=$SIZE_IN_BLOCKS"
 | 
						echo -n " 'size in blocks'=$SIZE_IN_BLOCKS"
 | 
				
			||||||
	echo -n " 'num devices'=$NUM_DEVICES"
 | 
						echo -n " 'num devices'=$NUM_DEVICES"
 | 
				
			||||||
	echo -n " 'num bad devices'=$BAD_DEVICES;;1;0;$NUM_DEVICES"
 | 
						echo -n " 'num failed devices'=$numFailedDevices;;1;0;$NUM_DEVICES"
 | 
				
			||||||
 | 
						echo -n " 'num spare devices'=$numSpareDevices;;;0;$NUM_DEVICES"
 | 
				
			||||||
	if [ -n "$RECOVERY_PROGRESS" ]; then
 | 
						if [ -n "$RECOVERY_PROGRESS" ]; then
 | 
				
			||||||
		echo -n " 'recovery progress'=$RECOVERY_PROGRESS%;0;;0;100"
 | 
							echo -n " 'recovery progress'=$RECOVERY_PROGRESS%;0;;0;100"
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
 | 
						for devIndex in $devIndices; do
 | 
				
			||||||
 | 
							if [ -z "${DEVICES[$devIndex]}" ]; then
 | 
				
			||||||
 | 
								echo -n " 'device $devIndex: spare'=$devIndex"
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
							if ${FAILED_DEVICES[$devIndex]}; then
 | 
				
			||||||
 | 
								echo -n " 'device $devIndex: ${DEVICES[$devIndex]} failed'=$devIndex;;$devIndex'"
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
							echo -n " 'device $devIndex: ${DEVICES[$devIndex]}'=$devIndex"
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	echo
 | 
						echo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case $result in
 | 
						case $result in
 | 
				
			||||||
| 
						 | 
					@ -205,7 +244,7 @@ while IFS= read -r line; do
 | 
				
			||||||
			1) parseConfigStatusLine "$line";;
 | 
								1) parseConfigStatusLine "$line";;
 | 
				
			||||||
			*) parseBitmapOrRecoveryLine "$line";;
 | 
								*) parseBitmapOrRecoveryLine "$line";;
 | 
				
			||||||
		esac
 | 
							esac
 | 
				
			||||||
		HAD_TARGET_RAID=$(($HAD_TARGET_RAID+1))
 | 
							((HAD_TARGET_RAID++))
 | 
				
			||||||
	elif [ $HAD_TARGET_RAID -gt 0 ]; then
 | 
						elif [ $HAD_TARGET_RAID -gt 0 ]; then
 | 
				
			||||||
		printOutputAndExit
 | 
							printOutputAndExit
 | 
				
			||||||
	fi
 | 
						fi
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1 +1 @@
 | 
				
			||||||
CRITICAL: Missing 1 of 4 devices | 'raid level'=5 'size in blocks'=1465151808 'num devices'=4 'num bad devices'=1;;1;0;4
 | 
					CRITICAL: Missing 1 of 4 devices | 'raid level'=5 'size in blocks'=1465151808 'num devices'=4 'num failed devices'=0;;1;0;4 'num spare devices'=0;;;0;4 'device 0: sda1'=0 'device 1: sdb1'=1 'device 2: sdd1'=2
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1 +1 @@
 | 
				
			||||||
OK | 'raid level'=1 'size in blocks'=976430080 'num devices'=2 'num bad devices'=0;;1;0;2
 | 
					OK | 'raid level'=1 'size in blocks'=976430080 'num devices'=2 'num failed devices'=0;;1;0;2 'num spare devices'=0;;;0;2 'device 0: sda1'=0 'device 1: sdb1'=1
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1 +1 @@
 | 
				
			||||||
OK | 'raid level'=5 'size in blocks'=1250241792 'num devices'=5 'num bad devices'=0;;1;0;5
 | 
					OK | 'raid level'=5 'size in blocks'=1250241792 'num devices'=5 'num failed devices'=0;;1;0;5 'num spare devices'=0;;;0;5 'device 0: sde1'=0 'device 1: sdc1'=1 'device 2: sdd1'=2 'device 4: sdf1'=4 'device 5: sdb1'=5
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1 +1 @@
 | 
				
			||||||
OK | 'raid level'=5 'size in blocks'=1318680576 'num devices'=10 'num bad devices'=0;;1;0;10
 | 
					OK | 'raid level'=5 'size in blocks'=1318680576 'num devices'=10 'num failed devices'=0;;1;0;10 'num spare devices'=0;;;0;10 'device 0: sdc1'=0 'device 1: sdd1'=1 'device 2: sde1'=2 'device 3: sdf1'=3 'device 4: sdg1'=4 'device 5: sdh1'=5 'device 6: sdi1'=6 'device 7: sdj1'=7 'device 8: sdk1'=8 'device 9: sdl1'=9
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1 +1 @@
 | 
				
			||||||
OK | 'raid level'=6 'size in blocks'=1225557760 'num devices'=7 'num bad devices'=0;;1;0;7
 | 
					OK | 'raid level'=6 'size in blocks'=1225557760 'num devices'=7 'num failed devices'=0;;1;0;7 'num spare devices'=0;;;0;7 'device 0: sdf1'=0 'device 1: sde1'=1 'device 2: sdd1'=2 'device 3: sdc1'=3 'device 4: sdb1'=4 'device 5: sda1'=5 'device 6: hdb1'=6
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1 +1 @@
 | 
				
			||||||
WARNING: Recovering: progress=12.6% finish=127.5min speed=33440K/sec | 'raid level'=5 'size in blocks'=1464725760 'num devices'=6 'num bad devices'=0;;1;0;6 'recovery progress'=12.6%;0;;0;100
 | 
					WARNING: Missing 1 of 6 devices. Recovering: progress=12.6% finish=127.5min speed=33440K/sec | 'raid level'=5 'size in blocks'=1464725760 'num devices'=6 'num failed devices'=0;;1;0;6 'num spare devices'=0;;;0;6 'recovery progress'=12.6%;0;;0;100 'device 0: sdc1'=0 'device 1: sdd1'=1 'device 2: sde1'=2 'device 3: sdf1'=3 'device 4: sdg1'=4 'device 6: sdh1'=6
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue