hc
2024-03-22 a0752693d998599af469473b8dc239ef973a012f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
#!/bin/bash
 
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
 
[[ -f /etc/default/orangepi-motd ]] && . /etc/default/orangepi-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" "$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() {
   read raw_temp </sys/class/hwmon/hwmon2/temp1_input 2>/dev/null
   board_temp=$(awk '{printf("%d",$1/1000)}' <<<${raw_temp})
   # Some boards, such as the Orange Pi Zero LTS, report shifted CPU temperatures
   board_temp=$((board_temp + CPU_TEMP_OFFSET))
} # getboardtemp
 
 
 
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.
ip_address=$(get_ip_addresses &)
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}"
printf "IP:           "
printf "\x1B[92m%s\x1B[0m" "$ip_address"
echo "" # fixed newline
display "CPU temp" "$board_temp" $CPU_TEMP_LIMIT "0" "°C" ""
display "Usage of /" "$root_usage" "90" "1" "%" " of $root_total"
echo "" # fixed newline
a=0
(( $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 ""