iax icon

30-sysinfo

iax | PRO | 10/20/23 05:10:28 AM UTC (Edited) | 0 ⭐ | 1093 👁️ | Never ⏰ | []
Bash |

9.87 KB

|

None

|

0 👍

/

0 👎

#!/bin/bash
#
# Copyright (c) Authors: https://www.armbian.com/authors
#
# This file is licensed under the terms of the GNU General Public
# License version 2. This program is licensed "as is" without any
# warranty of any kind, whether express or implied.
#
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
THIS_SCRIPT="sysinfo"
 
# don't change default values - they are lost on upgrades. Use /etc/default/orangepi-motd for your values
 
MOTD_DISABLE=""
PRIMARY_INTERFACE="eth0"
PRIMARY_DIRECTION="rx"
STORAGE=/dev/sda1
HIDE_IP_PATTERN="^dummy0|^lo"
CPU_TEMP_LIMIT=60
# Temperature offset in Celcius degrees
CPU_TEMP_OFFSET=0
HDD_TEMP_LIMIT=60
AMB_TEMP_LIMIT=40
 
for f in $MOTD_DISABLE; do
    [[ $f == $THIS_SCRIPT ]] && exit 0
done
 
# don't edit below here
 
function display() {
    # $1=name $2=value $3=red_limit $4=minimal_show_limit $5=unit $6=after $7=acs/desc{
    # battery red color is opposite, lower number
    if [[ "$1" == "Battery" ]]; then local great="<"; else local great=">"; fi
    if [[ -n "$2" && "$2" > "0" && (( "${2%.*}" -ge "$4" )) ]]; then
        printf "%-14s" "$1:"
        if awk "BEGIN{exit ! ($2 $great $3)}"; then echo -ne "\e[0;91m $2"; else echo -ne "\e[0;92m $2"; fi
        printf "%-1s\x1B[0m" "$5"
        printf "%-11s\t" "$6"
        return 1
    fi
} # display
 
function getboardtemp() {
    if [ -f /etc/orangepimonitor/datasources/soctemp ]; then
        read raw_temp </etc/orangepimonitor/datasources/soctemp 2>/dev/null
        if [ ! -z $(echo "$raw_temp" | grep -o "^[1-9][0-9]*\.\?[0-9]*$") ] && (( $(echo "${raw_temp} < 200" |bc -l) )); then
            # Allwinner legacy kernels output degree C
            board_temp=${raw_temp}
        else
            board_temp=$(awk '{printf("%d",$1/1000)}' <<<${raw_temp})
        fi
    elif [ -f /etc/orangepimonitor/datasources/pmictemp ]; then
        # fallback to PMIC temperature
        board_temp=$(awk '{printf("%d",$1/1000)}' </etc/orangepimonitor/datasources/pmictemp)
    fi
    # Some boards, such as the Orange Pi Zero LTS, report shifted CPU temperatures
    board_temp=$((board_temp + CPU_TEMP_OFFSET))
} # getboardtemp
 
function batteryinfo() {
    # Battery info for Allwinner
    mainline_dir="/sys/power/axp_pmu"
    legacy_dir="/sys/class/power_supply"
    if [[ -e "$mainline_dir" ]]; then
        read status_battery_connected < $mainline_dir/battery/connected 2>/dev/null
        if [[ "$status_battery_connected" == "1" ]]; then
            read status_battery_charging < $mainline_dir/charger/charging
            read status_ac_connect < $mainline_dir/ac/connected
            read battery_percent< $mainline_dir/battery/capacity
            # dispay charging / percentage
            if [[ "$status_ac_connect" == "1" && "$battery_percent" -lt "100" ]]; then
                status_battery_text=" charging"
            elif [[ "$status_ac_connect" == "1" && "$battery_percent" -eq "100" ]]; then
                status_battery_text=" charged"
            else
                status_battery_text=" discharging"
            fi
        fi
    elif [[ -e "$legacy_dir/axp813-ac" ]]; then
        read status_battery_connected < $legacy_dir/axp20x-battery/present
        if [[ "$status_battery_connected" == "1" ]]; then
            status_battery_text=" "$(awk '{print tolower($0)}' < $legacy_dir/axp20x-battery/status)
            read status_ac_connect < $legacy_dir/axp813-ac/present
            read battery_percent< $legacy_dir/axp20x-battery/capacity
        fi
    elif [[ -e "$legacy_dir/battery" ]]; then
        if [[ (("$(cat $legacy_dir/battery/voltage_now)" -gt "5" )) ]]; then
            status_battery_text=" "$(awk '{print tolower($0)}' < $legacy_dir/battery/status)
            read battery_percent <$legacy_dir/battery/capacity
        fi
    fi
} # batteryinfo
 
function ambienttemp() {
    # define where w1 usually shows up
        W1_DIR="/sys/devices/w1_bus_master1/"
    if [ -f /etc/orangepimonitor/datasources/ambienttemp ]; then
        read raw_temp </etc/orangepimonitor/datasources/ambienttemp 2>/dev/null
        amb_temp=$(awk '{printf("%d",$1/1000)}' <<<${raw_temp})
        echo $amb_temp
    elif [[ -d $W1_DIR && $ONE_WIRE == yes ]]; then
        device=$(ls -1 $W1_DIR | grep -E '^[0-9]{1,4}' | head -1)
        if [[ -n $device ]]; then
            read raw_temp < ${W1_DIR}${device}/hwmon/$(ls -1 ${W1_DIR}${device}/hwmon)/temp1_input 2>/dev/null
            amb_temp=$(awk '{printf("%d",$1/1000)}' <<<${raw_temp})
            echo $amb_temp
        fi
    else
        # read ambient temperature from USB device if available
        if [[ ! -f /usr/bin/temper ]]; then
            echo ""
            return
        fi
        amb_temp=$(temper -c 2>/dev/null)
        case ${amb_temp} in
            *"find the USB device"*)
                echo ""
                ;;
            *)
                amb_temp=$(awk '{print $NF}' <<<$amb_temp |  sed 's/C//g')
                echo -n "scale=1;${amb_temp}/1" | grep -oE "\-?[[:digit:]]+\.[[:digit:]]"
        esac
    fi
} # ambienttemp
 
function get_ip_addresses() {
    local ips=()
    for f in /sys/class/net/*; do
        local intf=$(basename $f)
        # match only interface names "dummy0" and "lo"
        if [[ $intf =~ $HIDE_IP_PATTERN ]]; then
            continue
        else
            local tmp=$(ip -4 addr show dev $intf | grep -v "$intf:avahi" | awk '/inet/ {print $2}' | cut -d'/' -f1)
            # add both name and IP - can be informative but becomes ugly with long persistent/predictable device names
            #[[ -n $tmp ]] && ips+=("$intf: $tmp")
            # add IP only
            [[ -n $tmp ]] && ips+=("$tmp")
        fi
    done
    echo "${ips[@]}"
} # get_ip_addresses
 
function storage_info() {
    # storage info
    RootInfo=$(df -h /)
    root_usage=$(awk '/\// {print $(NF-1)}' <<<${RootInfo} | sed 's/%//g')
    root_total=$(awk '/\// {print $(NF-4)}' <<<${RootInfo})
    StorageInfo=$(df -h $STORAGE 2>/dev/null | grep $STORAGE)
    if [[ -n "${StorageInfo}" && ${RootInfo} != *$STORAGE* ]]; then
        storage_usage=$(awk '/\// {print $(NF-1)}' <<<${StorageInfo} | sed 's/%//g')
        storage_total=$(awk '/\// {print $(NF-4)}' <<<${StorageInfo})
        if [[ -n "$(command -v smartctl)" ]]; then
            DISK="${STORAGE::-1}"
            storage_temp+=$(smartctl -l scttempsts $DISK 2> /dev/null | grep -i 'Current Temperature:' | awk '{print $(NF-1)}')
        fi
    fi
} # storage_info
 
 
 
# query various systems and send some stuff to the background for overall faster execution.
# Works only with ambienttemp and batteryinfo since A20 is slow enough :)
amb_temp=$(ambienttemp &)
ip_address=$(get_ip_addresses &)
batteryinfo
storage_info
getboardtemp
critical_load=80
 
# get uptime, logged in users and load in one take
UPTIME=$(LC_ALL=C uptime)
UPT1=${UPTIME#*'up '}
UPT2=${UPT1%'user'*}
users=${UPT2//*','}
users=${users//' '}
time=${UPT2%','*}
time=${time//','}
time=$(echo $time | xargs)
load=${UPTIME#*'load average: '}
load=${load//','}
load=$(echo $load | cut -d" " -f1)
[[ $load == 0.0* ]] && load=0.10
cpucount=$(grep -c processor /proc/cpuinfo)
 
load=$(awk '{printf("%.0f",($1/$2) * 100)}' <<< "$load $cpucount")
 
# memory and swap
mem_info=$(LC_ALL=C free -w 2>/dev/null | grep "^Mem" || LC_ALL=C free | grep "^Mem")
memory_usage=$(awk '{printf("%.0f",(($2-($4+$6+$7))/$2) * 100)}' <<<${mem_info})
mem_info=$(echo $mem_info | awk '{print $2}')
memory_total=$(( mem_info / 1024 ))
swap_info=$(LC_ALL=C free -m | grep "^Swap")
swap_usage=$( (awk '/Swap/ { printf("%3.0f", $3/$2*100) }' <<<${swap_info} 2>/dev/null || echo 0) | tr -c -d '[:digit:]')
swap_total=$(awk '{print $(2)}' <<<${swap_info})
 
# display info
display "System load" "${load%% *}" "${critical_load}" "0" "%" ""
 
printf "Up time:       \x1B[92m%s\x1B[0m\t" "$time"
display "Local users" "${users##* }" "3" "2" ""
echo "" # fixed newline
if [[ ${memory_total} -gt 1000 ]]; then
    memory_total=$(awk '{printf("%.2f",$1/1024)}' <<<${memory_total})"G"
else
    memory_total+="M"
fi
 
if [[ ${swap_total} -gt 500 ]]; then
    swap_total=$(awk '{printf("%.2f",$1/1024)}' <<<${swap_total})"G"
else
    swap_total+="M"
fi
 
display "Memory usage" "$memory_usage" "70" "0" "%" " of ${memory_total}"
display "Zram usage" "$swap_usage" "75" "0" "%" " of ${swap_total}"
printf "IP:        "
printf "\x1B[92m%s\x1B[0m" "$ip_address"
echo "" # fixed newline
display "CPU temp" "$board_temp" $CPU_TEMP_LIMIT "0" "°C" ""
display "Ambient temp" "$amb_temp" $AMB_TEMP_LIMIT "0" "°C" ""
display "Usage of /" "$root_usage" "90" "1" "%" " of $root_total"
echo "" # fixed newline
a=0
display "storage/" "$storage_usage" "90" "1" "%" " of $storage_total" ; a=$((a+$?))
display "storage temp" "$storage_temp" $HDD_TEMP_LIMIT "0" "°C" "" ; a=$((a+$?))
display "Battery" "$battery_percent" "20" "1" "%" "$status_battery_text" ; a=$((a+$?))
(( $a > 0 )) && echo "" # new line only if some value is displayed
 
# Check whether PRIMARY_INTERFACE exist in /var/lib/vnstat/
PRIMARY_INTERFACE=$(comm -12 <(ls -1 /var/lib/vnstat/ 2> /dev/null) <(echo "$PRIMARY_INTERFACE" | sed 's/+/\n/g') | sed -n -e 'H;${x;s/\n/+/g;s/^+//;p;}')
 
line=0
if [[ $(command -v vnstat) && -n $PRIMARY_INTERFACE ]]; then
    traffic=$(vnstat -i $PRIMARY_INTERFACE --oneline | cut -d";" -f4,5)
    traffic_rx=$(echo $traffic | cut -d";" -f1,1 | sed -r 's/([0-9]+\.[0-9]{1})[0-9]*/\1/')
    traffic_tx=$(echo $traffic | cut -d";" -f2,2 | sed -r 's/([0-9]+\.[0-9]{1})[0-9]*/\1/')
    [[ "$traffic" == *"Not enough"* ]] && { traffic_tx="n/a "; traffic_rx="n/a  "; }
    case $PRIMARY_DIRECTION in
        tx)
            printf "TX today:      \x1B[92m%s\x1B[0m  \t"  "$traffic_tx"
            line=$((line+1))
        ;;
        rx)
            printf "RX today:      \x1B[92m%s\x1B[0m  \t"  "$traffic_rx"
            line=$((line+1))
        ;;
        both)
            printf "TX today:      \x1B[92m%s\x1B[0m  \t"  "$traffic_tx"
            printf "RX today:      \x1B[92m%s\x1B[0m  \t"  "$traffic_rx"
            line=$((line+1))
        ;;
        *) #off or whatever
        ;;
    esac
fi
 
if [[ $(command -v zpool) ]]; then
    zpoolstatus="$(zpool status </dev/stdin 2>&1 )"
    if [[ -n $(echo $zpoolstatus | grep 'not loaded') ]]; then
    :
    elif [[ -n $(echo $zpoolstatus | grep 'degraded\|OFFLINE') ]]; then
        printf "ZFS pool:      "
        echo -ne "\e[0;91mDegraded\x1B[0m"
        line=$((line+1))
    elif [[ -n $(echo $zpoolstatus | grep 'no pools available') ]]; then
        printf "ZFS pool:      "
        echo -ne "n/a"
        line=$((line+1))
    else
        printf "ZFS pool:      "
        echo -ne "\e[0;92mOnline\x1B[0m"
        line=$((line+1))
    fi
fi
[[ $line -ne 0 ]] && echo ""
echo ""
 

Comments