mirror of
				https://github.com/librenms/librenms-agent.git
				synced 2024-05-09 09:54:52 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			98 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env bash
 | |
| # MDADM SNMP extension for LibreNMS
 | |
| # Version
 | |
| extendVer='2.0.0'
 | |
| # Initial portion of json
 | |
| mdadmSNMPOutput='{ "data": ['
 | |
| 
 | |
| # Outputs a list of devices
 | |
| list_devices() {
 | |
|     for device in "${1}/slaves/"*; do
 | |
|         if [ "${2,,}" == 'count' ]; then
 | |
|             ((devCount++))
 | |
|         elif [ "${2,,}" != 'missing' ] || [ ! -e "${device}" ]; then
 | |
|             printf '%b\t    "%s"' "${multiDisk}" "$(basename "${device}")"
 | |
|             multiDisk=',\n'
 | |
|         fi
 | |
|     done
 | |
|     [ "${devCount}" ] && echo "${devCount}"
 | |
| }
 | |
| 
 | |
| # Outputs either 0, 100, or the value of the file referenced
 | |
| maybe_get() {
 | |
|     if [[ $(cat "${1}") =~ " / " ]]; then
 | |
|         echo "100 * $(cat ${1})" | bc
 | |
|     elif [ -f "${1}" ] && [ "$(cat "${1}")" != 'none' ]; then
 | |
|         cat "${1}"
 | |
|     else
 | |
|         echo 0
 | |
|     fi
 | |
| }
 | |
| 
 | |
| main() {
 | |
|     if ! which 'jq' > /dev/null 2>&1; then
 | |
|         errorCode=1
 | |
|         # The underscore here is a hack since we have to strip spaces without jq
 | |
|         errorString='jq_missing!'
 | |
|     elif stat "/dev/md"[[:digit:]]* > /dev/null 2>&1; then
 | |
|         for mdadmArray in "/dev/md"[[:digit:]]*; do
 | |
|             # Ignore partitions
 | |
|             [[ "${mdadmArray}" =~ '/dev/md'[[:digit:]]+'p' ]] && continue
 | |
| 
 | |
|             mdadmName="$(basename "$(realpath "${mdadmArray}")")"
 | |
|             mdadmSysDev="/sys/block/${mdadmName}"
 | |
| 
 | |
|             degraded=$(maybe_get "${mdadmSysDev}/md/degraded")
 | |
|             syncSpeed=$(($(maybe_get "${mdadmSysDev}/md/sync_speed") * 1024))
 | |
| 
 | |
|             syncCompleted=$(maybe_get "${mdadmSysDev}/md/sync_completed")
 | |
|             if [ $syncCompleted -eq 0 ] && [ $degraded -eq 0 ] && [ $syncSpeed -eq 0 ]; then
 | |
|                 syncCompleted="100"
 | |
|             fi
 | |
| 
 | |
|             read -r -d '' mdadmOutput <<MDADMJSON
 | |
| 
 | |
|     ${multiArray}{
 | |
|         "name": "${mdadmName}",
 | |
|         "level": "$(maybe_get "${mdadmSysDev}/md/level")",
 | |
|         "size": $((($(maybe_get "${mdadmSysDev}/size") * 1024) / 2)),
 | |
|         "disc_count": $(maybe_get "${mdadmSysDev}/md/raid_disks"),
 | |
|         "hotspare_count": $((($(list_devices "${mdadmSysDev}" count "${mdadmSysDev}") - $(maybe_get "${mdadmSysDev}/md/raid_disks")))),
 | |
|         "device_list": [
 | |
| $(list_devices "${mdadmSysDev}")
 | |
|         ],
 | |
|         "missing_devices_list": [
 | |
| $(list_devices "${mdadmSysDev}" missing)
 | |
|         ],
 | |
|         "state": "$(maybe_get "${mdadmSysDev}/md/array_state")",
 | |
|         "action": "$(maybe_get "${mdadmSysDev}/md/sync_action")",
 | |
|         "degraded": $degraded,
 | |
|         "sync_speed": $syncSpeed,
 | |
|         "sync_completed": $syncCompleted
 | |
|     }
 | |
| MDADMJSON
 | |
|             # Add a comma only after the first item
 | |
|             multiArray=','
 | |
|             mdadmSNMPOutput+="${mdadmOutput}"
 | |
|         done
 | |
|     else
 | |
|         errorCode=2
 | |
|         errorString='mdadm array not found!'
 | |
|     fi
 | |
| 
 | |
|     read -r -d '' metadataOutput <<METADATA
 | |
| ],
 | |
|     "error": ${errorCode:-0},
 | |
|     "errorString": "${errorString}",
 | |
|     "version": "${extendVer}"
 | |
| }
 | |
| METADATA
 | |
| 
 | |
|     # If JQ is missing we need to echo this manually and strip whitespace
 | |
|     # SC2001 is not applicable because we already use parameter expansion search/replace
 | |
|     # shellcheck disable=SC2001
 | |
|     jq -c '.' <<< "${mdadmSNMPOutput}${metadataOutput}" 2> /dev/null || sed 's/\s//g' <<< "${mdadmSNMPOutput//$'\n'/}${metadataOutput//$'\n'/}"
 | |
| }
 | |
| 
 | |
| main "${@}"
 |