#!/bin/bash # # Copyright (c) Authors: http://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. # # DO NOT EDIT THIS FILE but add config options to /etc/default/armbian-motd # generate system information export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin THIS_SCRIPT="sysinfo" MOTD_DISABLE="" STORAGE=/dev/sda1 #SHOW_IP_PATTERN="^[ewr].*|^br.*|^lt.*|^umts.*" # myNode Customization SHOW_IP_PATTERN="^[ew].*|^lt.*|^umts.*" [[ -f /etc/default/armbian-motd ]] && . /etc/default/armbian-motd 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%s" "$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%s\x1B[0m" "$5" printf "%-11s%s\t" "$6" return 1 fi } # display function getboardtemp() { if [ -f /etc/armbianmonitor/datasources/soctemp ]; then read raw_temp /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/armbianmonitor/datasources/pmictemp ]; then # fallback to PMIC temperature board_temp=$(awk '{printf("%d",$1/1000)}' /dev/null amb_temp=$(awk '{printf("%d",$1/1000)}' <<<${raw_temp}) echo $amb_temp 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() { # # return up to 2 IPv4 address(es) comma separated # hostname -I | tr " " "\n" | \ # grep -E "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$" | \ # tail -n2 | sed ':a;N;$!ba;s/\n/,/g' #} # get_ip_addresses function get_ip_addresses() { local ips=() for f in /sys/class/net/*; do local intf=$(basename $f) # match only interface names starting with e (Ethernet), br (bridge), w (wireless), r (some Ralink drivers use ra format) if [[ $intf =~ $SHOW_IP_PATTERN ]]; then local tmp=$(ip -4 addr show dev $intf | 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}) 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=$(( 1 + $(grep -c processor /proc/cpuinfo) / 2 )) # get uptime, logged in users and load in one take UptimeString=$(uptime | tr -d ',') time=$(awk -F" " '{print $3" "$4}' <<<"${UptimeString}") load="$(awk -F"average: " '{print $2}'<<<"${UptimeString}")" users="$(awk -F" user" '{print $1}'<<<"${UptimeString}")" case ${time} in 1:*) # 1-2 hours time=$(awk -F" " '{print $3" hour"}' <<<"${UptimeString}") ;; *:*) # 2-24 hours time=$(awk -F" " '{print $3" hours"}' <<<"${UptimeString}") ;; esac # 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}) memory_total=$(awk '{printf("%d",$2/1024)}' <<<${mem_info}) 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" "" "${load#* }" printf "Up time: \x1B[92m%s\x1B[0m\t\t" "$time" display "Local users" "${users##* }" "3" "2" "" echo "" # fixed newline display "Memory usage" "$memory_usage" "70" "0" " %" " of ${memory_total}MB" display "Zram usage" "$swap_usage" "75" "0" " %" " of $swap_total""Mb" printf "IP: " printf "\x1B[92m%s\x1B[0m" "$ip_address" echo "" # fixed newline a=0;b=0;c=0 display "CPU temp" "$board_temp" "45" "0" "°C" "" ; a=$? display "Ambient temp" "$amb_temp" "40" "0" "°C" "" ; b=$? (( ($a+$b) >0 )) && echo "" # new line only if some value is displayed display "Usage of /" "$root_usage" "90" "1" "%" " of $root_total" display "storage/" "$storage_usage" "90" "1" "%" " of $storage_total" display "Battery" "$battery_percent" "20" "1" "%" "$status_battery_text" echo "" echo "" echo "" echo "=======================================================" echo "=== Visit the myNode Web GUI " echo "=== http://mynode.local/ " echo "=== OR " printf "=== http://%s/ \n" "$ip_address" echo "=======================================================" echo "" echo ""