apolloapi-v2/backend/os_stats
2024-05-24 09:51:13 +02:00

171 lines
4.7 KiB
Bash
Executable File

#!/bin/bash
# Collects system performance statistics such as CPU, memory, and disk
# usage as well as top processes ran by users.
#
# All size values are in KiB (memory, disk, etc).
# EXAMPLE USAGE:
# ./os_stats.sh
# Debugging and error handling
# Stop this script on any error. Unless you want to get data by any means
# this is a good option.
set -e
# Debugging options:
# set -x
# set -v
# Validate command line arguments
if [[ "$#" == 1 || "$#" > 2 ]]; then
echo "Wrong number of arguments supplied. Expects 2 arguments: <cpu>, <mem>, or none."
exit 1
fi
# General OS props
HOST=$HOSTNAME
#OS=$(uname -a)
OS=$(lsb_release -s -i -c -r | sed ':a;N;$!ba;s/\n/ /g')
UPTIME=$(uptime -s)
LOADAVG=$(cat /proc/loadavg)
ARCHITECTURE=$(uname -m)
if [ -f "/sys/devices/virtual/thermal/thermal_zone0/temp" ]; then
TEMP=$(cat /sys/devices/virtual/thermal/thermal_zone0/temp)
else
TEMP="0"
fi
ACTIVE_WIFI=$(nmcli -t -f name c show --active | sed -z 's/\n/,/g;s/,$/\n/')
MINER_TEMP="0"
if [ -e "/var/local/apollo/hwmon/pcb_temp" ]
then
MINER_TEMP=$(cat /var/local/apollo/hwmon/pcb_temp)
fi
MINER_FAN_SPEED="0"
if [ -e "/var/local/apollo/hwmon/fan_speed" ]
then
MINER_FAN_SPEED=$(cat /var/local/apollo/hwmon/fan_rpm)
fi
# Function to check if an interface is up or down
get_interface_status() {
local interface=$1
ip link show "$interface" | grep -q "state UP"
if [ $? -eq 0 ]; then
echo "true"
else
echo "false"
fi
}
# Retrieve IP, MAC and status of eth0 and wlan0 interfaces
ETH_IP=$(ip addr show eth0 | awk '/inet / {print $2}' | cut -d/ -f 1)
ETH_MAC=$(ip link show eth0 | awk '/ether/ {print $2}')
ETH_STATUS=$(get_interface_status eth0)
WLAN_IP=$(ip addr show wlan0 | awk '/inet / {print $2}' | cut -d/ -f 1)
WLAN_MAC=$(ip link show wlan0 | awk '/ether/ {print $2}')
WLAN_STATUS=$(get_interface_status wlan0)
# Variable to track the first IP of wlx interfaces
FIRST_WLX_IP=""
FIRST_WLX_MAC=""
FIRST_WLX_STATUS=""
# Retrieve IP, MAC and status of WiFi interfaces starting with wlx
for interface in $(ip -o link show | awk -F': ' '{print $2}' | grep ^wlx); do
WLX_IP=$(ip addr show "$interface" | awk '/inet / {print $2}' | cut -d/ -f 1)
WLX_MAC=$(ip link show "$interface" | awk '/ether/ {print $2}')
WLX_STATUS=$(get_interface_status "$interface")
# If WLAN_IP is empty and FIRST_WLX_IP is not yet assigned, use WLX_IP
if [ -z "$WLAN_IP" ] && [ -z "$FIRST_WLX_IP" ] && [ -n "$WLX_IP" ]; then
FIRST_WLX_IP=$WLX_IP
FIRST_WLX_MAC=$WLX_MAC
FIRST_WLX_STATUS=$WLX_STATUS
WLAN_IP=$WLX_IP
WLAN_MAC=$WLX_MAC
WLAN_STATUS=$WLX_STATUS
fi
done
# Memory
memTotal=$(egrep '^MemTotal:' /proc/meminfo | awk '{print $2}')
memFree=$(egrep '^MemAvailable:' /proc/meminfo | awk '{print $2}')
memCached=$(egrep '^Cached:' /proc/meminfo | awk '{print $2}')
memAvailable=$(expr "$memFree" + "$memCached")
memUsed=$(($memTotal - $memFree))
swapTotal=$(egrep '^SwapTotal:' /proc/meminfo | awk '{print $2}')
swapFree=$(egrep '^SwapFree:' /proc/meminfo | awk '{print $2}')
swapUsed=$(($swapTotal - $swapFree))
# CPU
cpuThreads=$(grep processor /proc/cpuinfo | wc -l)
#cpuUtilization=$(top -bn3 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}' | tail -1)
cpuUtilization=$((100 - $(vmstat 1 2 | tail -1 | awk '{print $15}' | sed 's/%//')))
# Disk
disksJson=$(for d in $(df -P -x tmpfs -x devtmpfs -x ecryptfs -x nfs -x cifs -T | tail -n+2 | awk '{print "{" "\"total\":" $3 ", \"used\":" $4 ", \"mountPoint\":" "\""$7"\"" "},"}'); do echo $d; done | sed '$s/.$//')
# Bfgminer log
bfgminerLog=""
if [ -e "/tmp/bfgminer.log" ]
then
bfgminerLog=`sudo tail -10 /tmp/bfgminer.log | tr '\n' '|'`
fi
# Processes
# Final result in JSON
JSON="{
\"hostname\": \"$HOST\",
\"operatingSystem\": \"$OS\",
\"uptime\": \"$UPTIME\",
\"loadAverage\": \"$LOADAVG\",
\"architecture\": \"$ARCHITECTURE\",
\"temperature\": \"$TEMP\",
\"minerTemperature\": \"$MINER_TEMP\",
\"minerFanSpeed\": \"$MINER_FAN_SPEED\",
\"activeWifi\": \"$ACTIVE_WIFI\",
\"network\": [{
\"name\": \"eth0\",
\"address\": \"$ETH_IP\",
\"mac\": \"$ETH_MAC\",
\"status\": \"$ETH_STATUS\"
}, {
\"name\": \"wlan0\",
\"address\": \"$WLAN_IP\",
\"mac\": \"$WLAN_MAC\",
\"status\": \"$WLAN_STATUS\"
}],
\"memory\":
{
\"total\": $memTotal,
\"available\": $memAvailable,
\"used\": $memUsed,
\"cache\": $memCached,
\"swap\": $swapUsed
},
\"cpu\":
{
\"threads\": $cpuThreads,
\"usedPercent\": $cpuUtilization
},
\"disks\": [
$disksJson
],
\"bfgminerLog\": \"$bfgminerLog\"
}"
echo "$JSON"
# Result output: STDOUT or HTTP
#if [ -z "$3" ]; then
# echo "$JSON"
#else
# curl -X POST -H "Content-Type: application/json" -d "$JSON" "$3"
#fi