176

(206 odpowiedzi, napisanych Oprogramowanie / Software)

Witam,
zrobiłem drobną korektę wyświetlania.

#!/bin/sh
#
# sysinfo.sh dla OpenWRT AA Cezary Jackiewicz 2013
# 
#    1.00    CJ    Pierwsza wersja kodu
#    1.01    RD    Drobna przebudowa
#    1.02    RD    Korekta bledu wysw. zajetosci Flash-a, dodanie kolorow
#    1.03    RD    Dodanie nazwy routera, zmiana formatowania
#    1.04    RD    Kosmetyka, sugestie mikhnal. Zmiana przetwarzania info. o wan.
#    1.05    RD    Zmiana algorytmu pobierania danych dla wan i lan
#    1.06    RD    Parametryzacja kolorów i pojawiania się podkre¶leń
#    1.07    RD    Modyfikacja zwi±zana z poprawnym wy¶wietlaniem interfejsu dla prot.3g
#    1.08    RD    Modyfikacja wy¶wietlania DNS-ów dla wan, dodanie uptime dla interfejsów
#    1.09    RD    Dodanie statusu "Down" dla wył±czonego wifi, zmiana wy¶wietlania dla WLAN(sta)
#    1.10    RD    Korekta wy¶wietlania dla WLAN(sta)
#
# Destination /sbin/sysinfo.sh
#
. /usr/share/libubox/jshn.sh

local Width=60
local StartRuler="1"
local EndRuler="1"
local Rouler
local NormalColor
local MachineColor
local ValueColor
local AddrColor
local RXTXColor

initialize() {
    local ColorMode="1"
    for Parameter in $@; do
        case  $Parameter  in
        -m) ColorMode="0";;
        -sr) StartRuler="0";;
        -er) EndRuler="0";;
        -w1) Width=80;;
        -w2) Width=100;;
        -w3) Width=120;;
        -h|*)    
            echo "Usage: $0 - [parameter]"
            echo "    -h    : This help."
            echo "    -m    : Display mono version."
            echo "    -sr    : Without start horizontal ruler."    
            echo "    -er    : Without end horizontal ruler."    
            exit 1;;
        esac
    done
    if [ "$ColorMode" == "1" ]; then
        NormalColor="\e[0m"
        MachineColor="\e[0;33m"
        ValueColor="\e[1;36m"
        AddrColor="\e[1;31m"
        RXTXColor="\e[2;32m"
    else
        NormalColor="\e[0m"
        MachineColor="\e[7m"
        ValueColor="\e[1m"
        AddrColor="\e[4m"
        RXTXColor="\e[1m"
    fi
    local i
    for i in $(seq $(expr $Width + 4 )); do 
        Rouler="$Rouler-";
    done
}

human_readable() {
    if [ $1 -gt 0 ]; then
        printf "$(awk -v n=$1 'BEGIN{for(i=split("B KB MB GB TB PB",suffix);s<1;i--)s=n/(2**(10*i));printf (int(s)==s)?"%.0f%s":"%.1f%s",s,suffix[i+2]}')"
    else
        printf "0B"
    fi
}

device_rx_tx() {
    local RXTX=$(awk -v Device=$1 '$1==Device ":"{printf "%d\t%d",$2,$10}' /proc/net/dev)
    [ "$RXTX" != "" ] && printf ", rx/tx: $RXTXColor$(human_readable $(echo "$RXTX" | cut -f 1))$NormalColor/$RXTXColor$(human_readable $(echo "$RXTX" | cut -f 2))$NormalColor"
}

uptime_str() {
    local Uptime=$1
    if [ $Uptime -gt 0 ]; then
        local Days=$(expr $Uptime / 60 / 60 / 24)
        local Hours=$(expr $Uptime / 60 / 60 % 24)
        local Minutes=$(expr $Uptime / 60 % 60)
        local Seconds=$(expr $Uptime % 60)
        if [ $Days -gt 0 ]; then
            Days=$(printf "%dd " $Days)
        else
            Days=""
        fi
        printf "$Days%02d:%02d:%02d" $Hours $Minutes $Seconds
    fi
}

print_line() {
    printf " | %-${Width}s |\r | $1\n"
}

print_horizontal_ruler() {
    printf " $Rouler\n"
}

print_machine() {
    local Machine=""
    local HostName=$(uci -q get system.@system[0].hostname)
    [ -e /tmp/sysinfo/model ] && Machine=$(cat /tmp/sysinfo/model)
    print_line "Machine: $MachineColor$Machine$NormalColor, Name: $MachineColor$HostName$NormalColor"
}

print_uptime() {
    local SysUptime=$(cut -d. -f1 /proc/uptime)
    local Uptime=$(uptime_str $SysUptime)
    local Now=$(date +'%Y-%m-%d %H:%M:%S')
    print_line "Uptime: $ValueColor$Uptime$NormalColor, Now: $ValueColor$Now$NormalColor"
}

print_loadavg() {
    local LoadAvg=$(awk '{printf"%s, %s, %s",$1,$2,$3}' /proc/loadavg)
    print_line "Load: $ValueColor$LoadAvg$NormalColor"
}

print_flash() {
    local Flash=$(df -k /overlay | awk '/overlay/{printf "%d\t%d\t%.1f",$4*1024,$2*1024,($2>0)?$3/$2*100:0}')
    local Free=$(echo "$Flash" | cut -f 1)
    local Total=$(echo "$Flash" | cut -f 2)
    local Used=$(echo "$Flash" | cut -f 3)
    print_line "Flash: free: $ValueColor$(human_readable $Free)$NormalColor, total: $ValueColor$(human_readable $Total)$NormalColor, used: $ValueColor$Used$NormalColor%%"
}

print_memory() {
    local Memory=$(awk 'BEGIN{Total=0;Free=0}$1~/^MemTotal:/{Total=$2}$1~/^MemFree:|^Buffers:|^Cached:/{Free+=$2}END{printf"%d\t%d\t%.1f",Free*1024,Total*1024,(Total>0)?(((Total-Free)/Total)*100):0}' /proc/meminfo)
    local Free=$(echo "$Memory" | cut -f 1)
    local Total=$(echo "$Memory" | cut -f 2)
    local Used=$(echo "$Memory" | cut -f 3)
    print_line "Memory: free: $ValueColor$(human_readable $Free)$NormalColor, total: $ValueColor$(human_readable $Total)$NormalColor, used: $ValueColor$Used$NormalColor%%"
}

print_wan() {
    local Zone
    local Device
    for Zone in $(uci -q show firewall | grep .masq= | cut -f2 -d.); do
        for Device in $(uci -q get firewall.$Zone.network); do
            local Status="$(ubus call network.interface.$Device status 2>/dev/null)"
            if [ "$Status" != "" ]; then
                local State=""
                local Iface=""
                local Uptime=""
                local IP4=""
                local IP6=""
                local Subnet4=""
                local Subnet6=""
                local Gateway4="n/a"
                local Gateway6="n/a"
                local DNS=""
                local Protocol=""
                json_load "${Status:-{}}"
                json_get_var State up
                json_get_var Uptime uptime
                json_get_var Iface l3_device
                json_get_var Protocol proto
                if json_get_type Status ipv4_address && [ "$Status" = array ]; then
                    json_select ipv4_address
                    json_get_type Status 1
                    if [ "$Status" = object ]; then
                        json_select 1
                        json_get_var IP4 address
                        json_get_var Subnet4 mask
                        [ "$IP4" != "" ] && [ "$Subnet4" != "" ] && IP4="$IP4/$Subnet4"
                    fi
                fi
                json_select
                if json_get_type Status ipv6_address && [ "$Status" = array ]; then
                    json_select ipv6_address
                    json_get_type Status 1
                    if [ "$Status" = object ]; then
                        json_select 1
                        json_get_var IP6 address
                        json_get_var Subnet6 mask
                        [ "$IP6" != "" ] && [ "$Subnet6" != "" ] && IP6="$IP6/$Subnet6"
                    fi
                fi
                json_select
                if json_get_type Status route && [ "$Status" = array ]; then
                    json_select route
                    local Index="1"
                    while json_get_type Status $Index && [ "$Status" = object ]; do
                        json_select "$((Index++))"
                        json_get_var Status target
                        case "$Status" in
                            0.0.0.0)
                                json_get_var Gateway4 nexthop;;
                            ::)
                                json_get_var Gateway6 nexthop;;
                        esac
                        json_select ".."
                    done    
                fi
                json_select
                if json_get_type Status dns_server && [ "$Status" = array ]; then
                    json_select dns_server
                    local Index="1"
                    while json_get_type Status $Index && [ "$Status" = string ]; do
                        json_get_var Status "$((Index++))"
                        DNS="${DNS:+$DNS }$Status"
                    done
                fi
                if [ "$State" == "1" ]; then
                    [ "$IP4" != "" ] && print_line "WAN: $AddrColor$IP4$NormalColor($Iface), gateway: $AddrColor$Gateway4$NormalColor"
                    [ "$IP6" != "" ] && print_line "WAN: $AddrColor$IP6$NormalColor($Iface), gateway: $AddrColor$Gateway6$NormalColor"
                    print_line "proto: $ValueColor$Protocol$NormalColor, uptime: $ValueColor$(uptime_str $Uptime)$NormalColor$(device_rx_tx $Iface)"
                    [ "$DNS" != "" ] && print_line "dns: $AddrColor$DNS$NormalColor"
                fi
            fi
        done
    done
}

print_lan() {
    local Device="lan"
    local State
    local Iface
    local IP4
    local IP6
    local Subnet4
    local Subnet6
    local Status="$(ubus call network.interface.$Device status 2>/dev/null)"
    if [ "$Status" != "" ]; then
        json_load "${Status:-{}}"
        json_get_var State up
        json_get_var Iface device
        if json_get_type Status ipv4_address && [ "$Status" = array ]; then
            json_select ipv4_address
            json_get_type Status 1
            if [ "$Status" = object ]; then
                json_select 1
                json_get_var IP4 address
                json_get_var Subnet4 mask
                [ "$IP4" != "" ] && [ "$Subnet4" != "" ] && IP4="$IP4/$Subnet4"
            fi
        fi
        json_select
        if json_get_type Status ipv6_address && [ "$Status" = array ]; then
            json_select ipv6_address
            json_get_type Status 1
            if [ "$Status" = object ]; then
                json_select 1
                json_get_var IP6 address
                json_get_var Subnet6 mask
                [ "$IP6" != "" ] && [ "$Subnet6" != "" ] && IP6="$IP6/$Subnet6"
            fi
        fi
        [ "$IP4" != "" ] && print_line "LAN: $AddrColor$IP4$NormalColor"
        [ "$IP6" != "" ] && print_line "LAN: $AddrColor$IP6$NormalColor"
    fi
}

print_wlan() {
    local Iface
    for Iface in $(uci -q show wireless | grep device=radio | cut -f2 -d.); do
        local Device=$(uci -q get wireless.$Iface.device)
        local SSID=$(uci -q get wireless.$Iface.ssid)
        local IfaceDisabled=$(uci -q get wireless.$Iface.disabled)
        local DeviceDisabled=$(uci -q get wireless.$Device.disabled)
        if [ -n "$SSID" ] && [ "$IfaceDisabled" != "1" ] && [ "$DeviceDisabled" != "1" ]; then
            local Mode=$(uci -q -P /var/state get wireless.$Iface.mode)
            local Channel=$(uci -q get wireless.$Device.channel)
            local RadioIface=$(uci -q -P /var/state get wireless.$Iface.ifname)
            local Connection="Down"
            if [ -n "$RadioIface" ]; then
                if [ "$Mode" == "ap" ]; then
                    Connection="$(iw dev $RadioIface station dump | grep Station | wc -l)"
                else
                    Connection="$(iw dev $RadioIface link | awk 'BEGIN{FS=": ";Signal="";Bitrate=""} $1~/signal/ {Signal=$2} $1~/tx bitrate/ {Bitrate=$2}END{print Signal" "Bitrate}')"
                fi
            fi
            if [ "$Mode" == "ap" ]; then
                print_line "WLAN: $ValueColor$SSID$NormalColor($Mode), ch: $ValueColor$Channel$NormalColor, conn: $ValueColor$Connection$NormalColor$(device_rx_tx $RadioIface)"
            else
                print_line "WLAN: $ValueColor$SSID$NormalColor($Mode), ch: $ValueColor$Channel$NormalColor"
                print_line "conn: $ValueColor$Connection$NormalColor$(device_rx_tx $RadioIface)"
            fi
        fi
    done
}

print_vpn() {
    local VPN
    for VPN in $(uci -q show openvpn | grep .ca= | cut -f2 -d.); do
        local Device=$(uci -q get openvpn.$VPN.dev)
        local Enabled=$(uci -q get openvpn.$VPN.enabled)
        if [ "$Enabled" == "1" ] || [ "$Enabled" == "" ]; then
            local Mode=$(uci -q get openvpn.$VPN.mode)
            local Connection="n/a"
            if [ "$Mode" == "server" ]; then
                Mode="$ValueColor$VPN$NormalColor(svr):$(uci -q get openvpn.$VPN.port)"
                Status=$(uci -q get openvpn.$VPN.status)
                Connection=$(awk 'BEGIN{FS=",";c=0;l=0}{if($1=="Common Name")l=1;else if($1=="ROUTING TABLE")exit;else if (l==1) c=c+1}END{print c}' $Status)
            else
                Mode="$ValueColor$VPN$NormalColor(cli)"
                Connection="Down"
                ifconfig $Device &>/dev/null && Connection="Up"
            fi
            print_line "VPN: $Mode, conn: $ValueColor$Connection$NormalColor$(device_rx_tx $Device)"
        fi
    done
}

initialize $@
[ "$StartRuler" == "1" ] && print_horizontal_ruler
print_machine
print_uptime
print_loadavg
print_flash
print_memory
print_wan
print_lan
print_wlan
print_vpn
[ "$EndRuler" == "1" ] && print_horizontal_ruler
exit 0
# Done.

177

(206 odpowiedzi, napisanych Oprogramowanie / Software)

Cezary napisał/a:

A mam. Jak jest jako klient to wyświetlają się dodatkowe informacje i linia te 60 znaków przekracza. Chyba dla sta warto z tego nową linię zrobić po prostu.

Witam,
zrobiłem zmianę, ale nie mam obecnie takiej konfiguracji żeby sprawdzić.

#!/bin/sh
#
# sysinfo.sh dla OpenWRT AA Cezary Jackiewicz 2013
# 
#    1.00    CJ    Pierwsza wersja kodu
#    1.01    RD    Drobna przebudowa
#    1.02    RD    Korekta bledu wysw. zajetosci Flash-a, dodanie kolorow
#    1.03    RD    Dodanie nazwy routera, zmiana formatowania
#    1.04    RD    Kosmetyka, sugestie mikhnal. Zmiana przetwarzania info. o wan.
#    1.05    RD    Zmiana algorytmu pobierania danych dla wan i lan
#    1.06    RD    Parametryzacja kolorów i pojawiania się podkreśleń
#    1.07    RD    Modyfikacja związana z poprawnym wyświetlaniem interfejsu dla prot.3g
#    1.08    RD    Modyfikacja wyświetlania DNS-ów dla wan, dodanie uptime dla interfejsów
#    1.09    RD    Dodanie statusu "Down" dla wyłączonego wifi, zmiana wyświetlania dla WLAN(sta)
#
# Destination /sbin/sysinfo.sh
#
. /usr/share/libubox/jshn.sh

local Width=60
local StartRuler="1"
local EndRuler="1"
local Rouler
local NormalColor
local MachineColor
local ValueColor
local AddrColor
local RXTXColor

initialize() {
    local ColorMode="1"
    for Parameter in $@; do
        case  $Parameter  in
        -m) ColorMode="0";;
        -sr) StartRuler="0";;
        -er) EndRuler="0";;
        -w1) Width=80;;
        -w2) Width=100;;
        -w3) Width=120;;
        -h|*)    
            echo "Usage: $0 - [parameter]"
            echo "    -h    : This help."
            echo "    -m    : Display mono version."
            echo "    -sr    : Without start horizontal ruler."    
            echo "    -er    : Without end horizontal ruler."    
            exit 1;;
        esac
    done
    if [ "$ColorMode" == "1" ]; then
        NormalColor="\e[0m"
        MachineColor="\e[0;33m"
        ValueColor="\e[1;36m"
        AddrColor="\e[1;31m"
        RXTXColor="\e[2;32m"
    else
        NormalColor="\e[0m"
        MachineColor="\e[7m"
        ValueColor="\e[1m"
        AddrColor="\e[4m"
        RXTXColor="\e[1m"
    fi
    local i
    for i in $(seq $(expr $Width + 4 )); do 
        Rouler="$Rouler-";
    done
}

human_readable() {
    if [ $1 -gt 0 ]; then
        printf "$(awk -v n=$1 'BEGIN{for(i=split("B KB MB GB TB PB",suffix);s<1;i--)s=n/(2**(10*i));printf (int(s)==s)?"%.0f%s":"%.1f%s",s,suffix[i+2]}')"
    else
        printf "0B"
    fi
}

device_rx_tx() {
    local RXTX=$(awk -v Device=$1 '$1==Device ":"{printf "%d\t%d",$2,$10}' /proc/net/dev)
    [ "$RXTX" != "" ] && printf ", rx/tx: $RXTXColor$(human_readable $(echo "$RXTX" | cut -f 1))$NormalColor/$RXTXColor$(human_readable $(echo "$RXTX" | cut -f 2))$NormalColor"
}

uptime_str() {
    local Uptime=$1
    if [ $Uptime -gt 0 ]; then
        local Days=$(expr $Uptime / 60 / 60 / 24)
        local Hours=$(expr $Uptime / 60 / 60 % 24)
        local Minutes=$(expr $Uptime / 60 % 60)
        local Seconds=$(expr $Uptime % 60)
        if [ $Days -gt 0 ]; then
            Days=$(printf "%dd " $Days)
        else
            Days=""
        fi
        printf "$Days%02d:%02d:%02d" $Hours $Minutes $Seconds
    fi
}

print_line() {
    printf " | %-${Width}s |\r | $1\n"
}

print_horizontal_ruler() {
    printf " $Rouler\n"
}

print_machine() {
    local Machine=""
    local HostName=$(uci -q get system.@system[0].hostname)
    [ -e /tmp/sysinfo/model ] && Machine=$(cat /tmp/sysinfo/model)
    print_line "Machine: $MachineColor$Machine$NormalColor, Name: $MachineColor$HostName$NormalColor"
}

print_uptime() {
    local SysUptime=$(cut -d. -f1 /proc/uptime)
    local Uptime=$(uptime_str $SysUptime)
    local Now=$(date +'%Y-%m-%d %H:%M:%S')
    print_line "Uptime: $ValueColor$Uptime$NormalColor, Now: $ValueColor$Now$NormalColor"
}

print_loadavg() {
    local LoadAvg=$(awk '{printf"%s, %s, %s",$1,$2,$3}' /proc/loadavg)
    print_line "Load: $ValueColor$LoadAvg$NormalColor"
}

print_flash() {
    local Flash=$(df -k /overlay | awk '/overlay/{printf "%d\t%d\t%.1f",$4*1024,$2*1024,($2>0)?$3/$2*100:0}')
    local Free=$(echo "$Flash" | cut -f 1)
    local Total=$(echo "$Flash" | cut -f 2)
    local Used=$(echo "$Flash" | cut -f 3)
    print_line "Flash: free: $ValueColor$(human_readable $Free)$NormalColor, total: $ValueColor$(human_readable $Total)$NormalColor, used: $ValueColor$Used$NormalColor%%"
}

print_memory() {
    local Memory=$(awk 'BEGIN{Total=0;Free=0}$1~/^MemTotal:/{Total=$2}$1~/^MemFree:|^Buffers:|^Cached:/{Free+=$2}END{printf"%d\t%d\t%.1f",Free*1024,Total*1024,(Total>0)?(((Total-Free)/Total)*100):0}' /proc/meminfo)
    local Free=$(echo "$Memory" | cut -f 1)
    local Total=$(echo "$Memory" | cut -f 2)
    local Used=$(echo "$Memory" | cut -f 3)
    print_line "Memory: free: $ValueColor$(human_readable $Free)$NormalColor, total: $ValueColor$(human_readable $Total)$NormalColor, used: $ValueColor$Used$NormalColor%%"
}

print_wan() {
    local Zone
    local Device
    for Zone in $(uci -q show firewall | grep .masq= | cut -f2 -d.); do
        for Device in $(uci -q get firewall.$Zone.network); do
            local Status="$(ubus call network.interface.$Device status 2>/dev/null)"
            if [ "$Status" != "" ]; then
                local State=""
                local Iface=""
                local Uptime=""
                local IP4=""
                local IP6=""
                local Subnet4=""
                local Subnet6=""
                local Gateway4="n/a"
                local Gateway6="n/a"
                local DNS=""
                local Protocol=""
                json_load "${Status:-{}}"
                json_get_var State up
                json_get_var Uptime uptime
                json_get_var Iface l3_device
                json_get_var Protocol proto
                if json_get_type Status ipv4_address && [ "$Status" = array ]; then
                    json_select ipv4_address
                    json_get_type Status 1
                    if [ "$Status" = object ]; then
                        json_select 1
                        json_get_var IP4 address
                        json_get_var Subnet4 mask
                        [ "$IP4" != "" ] && [ "$Subnet4" != "" ] && IP4="$IP4/$Subnet4"
                    fi
                fi
                json_select
                if json_get_type Status ipv6_address && [ "$Status" = array ]; then
                    json_select ipv6_address
                    json_get_type Status 1
                    if [ "$Status" = object ]; then
                        json_select 1
                        json_get_var IP6 address
                        json_get_var Subnet6 mask
                        [ "$IP6" != "" ] && [ "$Subnet6" != "" ] && IP6="$IP6/$Subnet6"
                    fi
                fi
                json_select
                if json_get_type Status route && [ "$Status" = array ]; then
                    json_select route
                    local Index="1"
                    while json_get_type Status $Index && [ "$Status" = object ]; do
                        json_select "$((Index++))"
                        json_get_var Status target
                        case "$Status" in
                            0.0.0.0)
                                json_get_var Gateway4 nexthop;;
                            ::)
                                json_get_var Gateway6 nexthop;;
                        esac
                        json_select ".."
                    done    
                fi
                json_select
                if json_get_type Status dns_server && [ "$Status" = array ]; then
                    json_select dns_server
                    local Index="1"
                    while json_get_type Status $Index && [ "$Status" = string ]; do
                        json_get_var Status "$((Index++))"
                        DNS="${DNS:+$DNS }$Status"
                    done
                fi
                if [ "$State" == "1" ]; then
                    [ "$IP4" != "" ] && print_line "WAN: $AddrColor$IP4$NormalColor($Iface), gateway: $AddrColor$Gateway4$NormalColor"
                    [ "$IP6" != "" ] && print_line "WAN: $AddrColor$IP6$NormalColor($Iface), gateway: $AddrColor$Gateway6$NormalColor"
                    print_line "proto: $ValueColor$Protocol$NormalColor, uptime: $ValueColor$(uptime_str $Uptime)$NormalColor$(device_rx_tx $Iface)"
                    [ "$DNS" != "" ] && print_line "dns: $AddrColor$DNS$NormalColor"
                fi
            fi
        done
    done
}

print_lan() {
    local Device="lan"
    local State
    local Iface
    local IP4
    local IP6
    local Subnet4
    local Subnet6
    local Status="$(ubus call network.interface.$Device status 2>/dev/null)"
    if [ "$Status" != "" ]; then
        json_load "${Status:-{}}"
        json_get_var State up
        json_get_var Iface device
        if json_get_type Status ipv4_address && [ "$Status" = array ]; then
            json_select ipv4_address
            json_get_type Status 1
            if [ "$Status" = object ]; then
                json_select 1
                json_get_var IP4 address
                json_get_var Subnet4 mask
                [ "$IP4" != "" ] && [ "$Subnet4" != "" ] && IP4="$IP4/$Subnet4"
            fi
        fi
        json_select
        if json_get_type Status ipv6_address && [ "$Status" = array ]; then
            json_select ipv6_address
            json_get_type Status 1
            if [ "$Status" = object ]; then
                json_select 1
                json_get_var IP6 address
                json_get_var Subnet6 mask
                [ "$IP6" != "" ] && [ "$Subnet6" != "" ] && IP6="$IP6/$Subnet6"
            fi
        fi
        [ "$IP4" != "" ] && print_line "LAN: $AddrColor$IP4$NormalColor"
        [ "$IP6" != "" ] && print_line "LAN: $AddrColor$IP6$NormalColor"
    fi
}

print_wlan() {
    local Iface
    for Iface in $(uci -q show wireless | grep device=radio | cut -f2 -d.); do
        local Device=$(uci -q get wireless.$Iface.device)
        local SSID=$(uci -q get wireless.$Iface.ssid)
        local IfaceDisabled=$(uci -q get wireless.$Iface.disabled)
        local DeviceDisabled=$(uci -q get wireless.$Device.disabled)
        if [ -n "$SSID" ] && [ "$IfaceDisabled" != "1" ] && [ "$DeviceDisabled" != "1" ]; then
            local Mode=$(uci -q -P /var/state get wireless.$Iface.mode)
            local Channel=$(uci -q get wireless.$Device.channel)
            local RadioIface=$(uci -q -P /var/state get wireless.$Iface.ifname)
            local Connection="Down"
            if [ -n "$RadioIface" ]; then
                if [ "$Mode" == "ap" ]; then
                    Connection="$(iw dev $RadioIface station dump | grep Station | wc -l)"
                else
                    Connection="$(iw dev $RadioIface link | awk 'BEGIN{FS=": ";Signal="";Bitrate=""} $1~/signal/ {Signal=$2} $1~/tx bitrate/ {Bitrate=$2}END{print Signal" "Bitrate}')"
                fi
            fi
            if [ "$Mode" == "ap" ]; then
                print_line "WLAN: $ValueColor$SSID$NormalColor($Mode), ch: $ValueColor$Channel$NormalColor, conn: $ValueColor$Connection$NormalColor$(device_rx_tx $RadioIface)"
            else
                print_line "WLAN: $ValueColor$SSID$NormalColor($Mode), ch: $ValueColor$Channel$NormalColor(device_rx_tx $RadioIface)"
                print_line "conn: $ValueColor$Connection$NormalColor"
            fi
        fi
    done
}

print_vpn() {
    local VPN
    for VPN in $(uci -q show openvpn | grep .ca= | cut -f2 -d.); do
        local Device=$(uci -q get openvpn.$VPN.dev)
        local Enabled=$(uci -q get openvpn.$VPN.enabled)
        if [ "$Enabled" == "1" ] || [ "$Enabled" == "" ]; then
            local Mode=$(uci -q get openvpn.$VPN.mode)
            local Connection="n/a"
            if [ "$Mode" == "server" ]; then
                Mode="$ValueColor$VPN$NormalColor(svr):$(uci -q get openvpn.$VPN.port)"
                Status=$(uci -q get openvpn.$VPN.status)
                Connection=$(awk 'BEGIN{FS=",";c=0;l=0}{if($1=="Common Name")l=1;else if($1=="ROUTING TABLE")exit;else if (l==1) c=c+1}END{print c}' $Status)
            else
                Mode="$ValueColor$VPN$NormalColor(cli)"
                Connection="Down"
                ifconfig $Device &>/dev/null && Connection="Up"
            fi
            print_line "VPN: $Mode, conn: $ValueColor$Connection$NormalColor$(device_rx_tx $Device)"
        fi
    done
}

initialize $@
[ "$StartRuler" == "1" ] && print_horizontal_ruler
print_machine
print_uptime
print_loadavg
print_flash
print_memory
print_wan
print_lan
print_wlan
print_vpn
[ "$EndRuler" == "1" ] && print_horizontal_ruler
exit 

178

(206 odpowiedzi, napisanych Oprogramowanie / Software)

A tak poważnie to dla mnie wszystkie opinie i uwagi są cenne, więc pisz śmiało.

179

(206 odpowiedzi, napisanych Oprogramowanie / Software)

Zamierzone to sklejenie:), jeżeli to kogoś jeszcze będzie raziło to zmienię.

180

(206 odpowiedzi, napisanych Oprogramowanie / Software)

Czyli faza RTM?;)

181

(206 odpowiedzi, napisanych Oprogramowanie / Software)

Witam,
oto następna wersja skryptu:

#!/bin/sh
#
# sysinfo.sh dla OpenWRT AA Cezary Jackiewicz 2013
# 
#    1.00    CJ    Pierwsza wersja kodu
#    1.01    RD    Drobna przebudowa
#    1.02    RD    Korekta bledu wysw. zajetosci Flash-a, dodanie kolorow
#    1.03    RD    Dodanie nazwy routera, zmiana formatowania
#    1.04    RD    Kosmetyka, sugestie mikhnal. Zmiana przetwarzania info. o wan.
#    1.05    RD    Zmiana algorytmu pobierania danych dla wan i lan
#    1.06    RD    Parametryzacja kolorów i pojawiania się podkreśleń
#    1.07    RD    Modyfikacja związana z poprawnym wyświetlaniem interfejsu dla prot.3g
#    1.08    RD    Modyfikacja wyświetlania DNS-ów dla wan, dodanie uptime dla interfejsów
#
# Destination /sbin/sysinfo.sh
#
. /usr/share/libubox/jshn.sh

local Width=60
local StartRuler="1"
local EndRuler="1"
local Rouler
local NormalColor
local MachineColor
local ValueColor
local AddrColor
local RXTXColor

initialize() {
    local ColorMode="1"
    for Parameter in $@; do
        case  $Parameter  in
        -m) ColorMode="0";;
        -sr) StartRuler="0";;
        -er) EndRuler="0";;
        -w1) Width=80;;
        -w2) Width=100;;
        -w3) Width=120;;
        -h|*)    
            echo "Usage: $0 - [parameter]"
            echo "    -h    : This help."
            echo "    -m    : Display mono version."
            echo "    -sr    : Without start horizontal ruler."    
            echo "    -er    : Without end horizontal ruler."    
            exit 1;;
        esac
    done
    if [ "$ColorMode" == "1" ]; then
        NormalColor="\e[0m"
        MachineColor="\e[0;33m"
        ValueColor="\e[1;36m"
        AddrColor="\e[1;31m"
        RXTXColor="\e[2;32m"
    else
        NormalColor="\e[0m"
        MachineColor="\e[7m"
        ValueColor="\e[1m"
        AddrColor="\e[4m"
        RXTXColor="\e[1m"
    fi
    local i
    for i in $(seq $(expr $Width + 4 )); do 
        Rouler="$Rouler-";
    done
}

human_readable() {
    if [ $1 -gt 0 ]; then
        printf "$(awk -v n=$1 'BEGIN{for(i=split("B KB MB GB TB PB",suffix);s<1;i--)s=n/(2**(10*i));printf (int(s)==s)?"%.0f%s":"%.1f%s",s,suffix[i+2]}')"
    else
        printf "0B"
    fi
}

device_rx_tx() {
    local RXTX=$(awk -v Device=$1 '$1==Device ":"{printf "%d\t%d",$2,$10}' /proc/net/dev)
    [ "$RXTX" != "" ] && printf "rx/tx: $RXTXColor$(human_readable $(echo "$RXTX" | cut -f 1))$NormalColor/$RXTXColor$(human_readable $(echo "$RXTX" | cut -f 2))$NormalColor"
}

uptime_str() {
    local Uptime=$1
    if [ $Uptime -gt 0 ]; then
        local Days=$(expr $Uptime / 60 / 60 / 24)
        local Hours=$(expr $Uptime / 60 / 60 % 24)
        local Minutes=$(expr $Uptime / 60 % 60)
        local Seconds=$(expr $Uptime % 60)
        if [ $Days -gt 0 ]; then
            Days=$(printf "%dd " $Days)
        else
            Days=""
        fi
        printf "$Days%02d:%02d:%02d" $Hours $Minutes $Seconds
    fi
}

print_line() {
    printf " | %-${Width}s |\r | $1\n"
}

print_horizontal_ruler() {
    printf " $Rouler\n"
}

print_machine() {
    local Machine=""
    local HostName=$(uci -q get system.@system[0].hostname)
    [ -e /tmp/sysinfo/model ] && Machine=$(cat /tmp/sysinfo/model)
    print_line "Machine: $MachineColor$Machine$NormalColor, Name: $MachineColor$HostName$NormalColor"
}

print_uptime() {
    local SysUptime=$(cut -d. -f1 /proc/uptime)
    local Uptime=$(uptime_str $SysUptime)
    local Now=$(date +'%Y-%m-%d %H:%M:%S')
    print_line "Uptime: $ValueColor$Uptime$NormalColor, Now: $ValueColor$Now$NormalColor"
}

print_loadavg() {
    local LoadAvg=$(awk '{printf"%s, %s, %s",$1,$2,$3}' /proc/loadavg)
    print_line "Load: $ValueColor$LoadAvg$NormalColor"
}

print_flash() {
    local Flash=$(df -k /overlay | awk '/overlay/{printf "%d\t%d\t%.1f",$4*1024,$2*1024,($2>0)?$3/$2*100:0}')
    local Free=$(echo "$Flash" | cut -f 1)
    local Total=$(echo "$Flash" | cut -f 2)
    local Used=$(echo "$Flash" | cut -f 3)
    print_line "Flash: free: $ValueColor$(human_readable $Free)$NormalColor, total: $ValueColor$(human_readable $Total)$NormalColor, used: $ValueColor$Used$NormalColor%%"
}

print_memory() {
    local Memory=$(awk 'BEGIN{Total=0;Free=0}$1~/^MemTotal:/{Total=$2}$1~/^MemFree:|^Buffers:|^Cached:/{Free+=$2}END{printf"%d\t%d\t%.1f",Free*1024,Total*1024,(Total>0)?(((Total-Free)/Total)*100):0}' /proc/meminfo)
    local Free=$(echo "$Memory" | cut -f 1)
    local Total=$(echo "$Memory" | cut -f 2)
    local Used=$(echo "$Memory" | cut -f 3)
    print_line "Memory: free: $ValueColor$(human_readable $Free)$NormalColor, total: $ValueColor$(human_readable $Total)$NormalColor, used: $ValueColor$Used$NormalColor%%"
}

print_wan() {
    local Zone
    local Device
    for Zone in $(uci -q show firewall | grep .masq= | cut -f2 -d.); do
        for Device in $(uci -q get firewall.$Zone.network); do
            local Status="$(ubus call network.interface.$Device status 2>/dev/null)"
            if [ "$Status" != "" ]; then
                local State=""
                local Iface=""
                local Uptime=""
                local IP4=""
                local IP6=""
                local Subnet4=""
                local Subnet6=""
                local Gateway4="n/a"
                local Gateway6="n/a"
                local DNS=""
                local Protocol=""
                json_load "${Status:-{}}"
                json_get_var State up
                json_get_var Uptime uptime
                json_get_var Iface l3_device
                json_get_var Protocol proto
                if json_get_type Status ipv4_address && [ "$Status" = array ]; then
                    json_select ipv4_address
                    json_get_type Status 1
                    if [ "$Status" = object ]; then
                        json_select 1
                        json_get_var IP4 address
                        json_get_var Subnet4 mask
                        [ "$IP4" != "" ] && [ "$Subnet4" != "" ] && IP4="$IP4/$Subnet4"
                    fi
                fi
                json_select
                if json_get_type Status ipv6_address && [ "$Status" = array ]; then
                    json_select ipv6_address
                    json_get_type Status 1
                    if [ "$Status" = object ]; then
                        json_select 1
                        json_get_var IP6 address
                        json_get_var Subnet6 mask
                        [ "$IP6" != "" ] && [ "$Subnet6" != "" ] && IP6="$IP6/$Subnet6"
                    fi
                fi
                json_select
                if json_get_type Status route && [ "$Status" = array ]; then
                    json_select route
                    local Index="1"
                    while json_get_type Status $Index && [ "$Status" = object ]; do
                        json_select "$((Index++))"
                        json_get_var Status target
                        case "$Status" in
                            0.0.0.0)
                                json_get_var Gateway4 nexthop;;
                            ::)
                                json_get_var Gateway6 nexthop;;
                        esac
                        json_select ".."
                    done    
                fi
                json_select
                if json_get_type Status dns_server && [ "$Status" = array ]; then
                    json_select dns_server
                    local Index="1"
                    while json_get_type Status $Index && [ "$Status" = string ]; do
                        json_get_var Status "$((Index++))"
                        DNS="${DNS:+$DNS }$Status"
                    done
                fi
                if [ "$State" == "1" ]; then
                    [ "$IP4" != "" ] && print_line "WAN: $AddrColor$IP4$NormalColor($Iface), gateway: $AddrColor$Gateway4$NormalColor"
                    [ "$IP6" != "" ] && print_line "WAN: $AddrColor$IP6$NormalColor($Iface), gateway: $AddrColor$Gateway6$NormalColor"
                    print_line "proto: $ValueColor$Protocol$NormalColor, uptime: $ValueColor$(uptime_str $Uptime)$NormalColor, $(device_rx_tx $Iface)"
                    [ "$DNS" != "" ] && print_line "dns: $AddrColor$DNS$NormalColor"
                fi
            fi
        done
    done
}

print_lan() {
    local Device="lan"
    local State
    local Iface
    local IP4
    local IP6
    local Subnet4
    local Subnet6
    local Status="$(ubus call network.interface.$Device status 2>/dev/null)"
    if [ "$Status" != "" ]; then
        json_load "${Status:-{}}"
        json_get_var State up
        json_get_var Iface device
        if json_get_type Status ipv4_address && [ "$Status" = array ]; then
            json_select ipv4_address
            json_get_type Status 1
            if [ "$Status" = object ]; then
                json_select 1
                json_get_var IP4 address
                json_get_var Subnet4 mask
                [ "$IP4" != "" ] && [ "$Subnet4" != "" ] && IP4="$IP4/$Subnet4"
            fi
        fi
        json_select
        if json_get_type Status ipv6_address && [ "$Status" = array ]; then
            json_select ipv6_address
            json_get_type Status 1
            if [ "$Status" = object ]; then
                json_select 1
                json_get_var IP6 address
                json_get_var Subnet6 mask
                [ "$IP6" != "" ] && [ "$Subnet6" != "" ] && IP6="$IP6/$Subnet6"
            fi
        fi
        [ "$IP4" != "" ] && print_line "LAN: $AddrColor$IP4$NormalColor"
        [ "$IP6" != "" ] && print_line "LAN: $AddrColor$IP6$NormalColor"
    fi
}

print_wlan() {
    local Iface
    for Iface in $(uci -q show wireless | grep device=radio | cut -f2 -d.); do
        local Device=$(uci -q get wireless.$Iface.device)
        local SSID=$(uci -q get wireless.$Iface.ssid)
        local IfaceDisabled=$(uci -q get wireless.$Iface.disabled)
        local DeviceDisabled=$(uci -q get wireless.$Device.disabled)
        if [ -n "$SSID" ] && [ "$IfaceDisabled" != "1" ] && [ "$DeviceDisabled" != "1" ]; then
            local Mode=$(uci -q -P /var/state get wireless.$Iface.mode)
            local Channel=$(uci -q get wireless.$Device.channel)
            local RadioIface=$(uci -q -P /var/state get wireless.$Iface.ifname)
            if [ -n "$RadioIface" ]; then
                if [ "$Mode" == "ap" ]; then
                    Connection="$(iw dev $RadioIface station dump | grep Station | wc -l)"
                else
                    Connection="$(iw dev $RadioIface link | awk 'BEGIN{FS=": ";Signal="";Bitrate=""} $1~/signal/ {Signal=$2} $1~/tx bitrate/ {Bitrate=$2}END{print Signal" "Bitrate}')"
                fi
            fi
            print_line "WLAN: $ValueColor$SSID$NormalColor($Mode), ch: $ValueColor$Channel$NormalColor, conn: $ValueColor$Connection$NormalColor, $(device_rx_tx $RadioIface)"
        fi
    done
}

print_vpn() {
    local VPN
    for VPN in $(uci -q show openvpn | grep .ca= | cut -f2 -d.); do
        local Device=$(uci -q get openvpn.$VPN.dev)
        local Enabled=$(uci -q get openvpn.$VPN.enabled)
        if [ "$Enabled" == "1" ] || [ "$Enabled" == "" ]; then
            Mode=$(uci -q get openvpn.$VPN.mode)
            if [ "$Mode" == "server" ]; then
                Mode="$ValueColor$VPN$NormalColor(svr):$(uci -q get openvpn.$VPN.port)"
                Status=$(uci -q get openvpn.$VPN.status)
                Connection=$(awk 'BEGIN{FS=",";c=0;l=0}{if($1=="Common Name")l=1;else if($1=="ROUTING TABLE")exit;else if (l==1) c=c+1}END{print c}' $Status)
            else
                Mode="$ValueColor$VPN$NormalColor(cli)"
                Connection="Down"
                ifconfig $Device &>/dev/null && Connection="Up"
            fi
            print_line "VPN: $Mode, conn: $ValueColor$Connection$NormalColor, $(device_rx_tx $Device)"
        fi
    done
}

initialize $@
[ "$StartRuler" == "1" ] && print_horizontal_ruler
print_machine
print_uptime
print_loadavg
print_flash
print_memory
print_wan
print_lan
print_wlan
print_vpn
[ "$EndRuler" == "1" ] && print_horizontal_ruler
exit 

182

(206 odpowiedzi, napisanych Oprogramowanie / Software)

Cezary napisał/a:

Pojawia się tylko raz podczas zalogowania się przez ssh do routera (w sensie wołane z automatu). Jak uruchamiam z palca to jest już normalnie. Gdzieś spacje wchodzą...

Zrobiłem wyświetlanie linii tak że treść nadpisuje kreski (pipe-y) więc to nie możliwe żeby były odsunięte. Może inny skrypt?

183

(206 odpowiedzi, napisanych Oprogramowanie / Software)

Cezary napisał/a:

+wan i proto, Trochę dłuższe jest.

Cezary,
ostatnia linia to świadomie wszystkie informacje o połączeniu.
Ale te linie z wan to coś dziwnego, nie potrafię tego odtworzyć.

184

(206 odpowiedzi, napisanych Oprogramowanie / Software)

Cezary napisał/a:

Cuda trochę się robią:

 | Machine: TP-Link TL-MR3020 v1, Name: Gargoyle                |
 | Uptime: 0d 00:01:59, Now: 2013-05-22 08:01:11                |
 | Load: 0.43, 0.18, 0.06                                       |
 | Flash: free: 156.0KB, total: 384.0KB, used: 59.4%            |
 | Memory: free: 14.7MB, total: 28.5MB, used: 48.4%             |
 | WAN: 10.1.1.121/24(br-wan), gateway: 10.1.1.1                  |
 | proto: dhcp, rx/tx: 1.8KB/2.0KB                               |
 | dns: 10.1.1.1                                                |
 | LAN: 192.168.1.1/24                                          |
 | WLAN: xxxxxxxxxxxxxxx (sta), ch: 3, conn: -34 dBm 65.0 MBit/s MCS 6 short GI, rx/tx: 2.3KB/1.9KB
 ----------------------------------------------------------------

Masz na myśli ostatnią linię?

185

(206 odpowiedzi, napisanych Oprogramowanie / Software)

Witam,
kolejna wersja, proszę o testy i opinie.

#!/bin/sh
#
# sysinfo.sh dla OpenWRT AA Cezary Jackiewicz 2013
# 
#    1.00    CJ    Pierwsza wersja kodu
#    1.01    RD    Drobna przebudowa
#    1.02    RD    Korekta bledu wysw. zajetosci Flash-a, dodanie kolorow
#    1.03    RD    Dodanie nazwy routera, zmiana formatowania
#    1.04    RD    Kosmetyka, sugestie mikhnal. Zmiana przetwarzania info. o wan.
#    1.05    RD    Zmiana algorytmu pobierania danych dla wan i lan
#    1.06    RD    Parametryzacja kolorów i pojawiania się podkreśleń
#    1.07    RD    Modyfikacja związana z poprawnym wyświetlaniem interfejsu dla prot.3g
#
# Destination /sbin/sysinfo.sh
#
. /usr/share/libubox/jshn.sh

local Width=60
local StartRuler="1"
local EndRuler="1"
local Rouler
local NormalColor
local MachineColor
local ValueColor
local AddrColor
local RXTXColor

initialize() {
    local ColorMode="1"
    for Parameter in $@; do
        case  $Parameter  in
        -m) ColorMode="0";;
        -sr) StartRuler="0";;
        -er) EndRuler="0";;
        -w1) Width=80;;
        -w2) Width=100;;
        -w3) Width=120;;
        -h|*)    
            echo "Usage: $0 - [parameter]"
            echo "    -h    : This help."
            echo "    -m    : Display mono version."
            echo "    -sr    : Without start horizontal ruler."    
            echo "    -er    : Without end horizontal ruler."    
            exit 1;;
        esac
    done
    if [ "$ColorMode" == "1" ]; then
        NormalColor="\e[0m"
        MachineColor="\e[0;33m"
        ValueColor="\e[1;36m"
        AddrColor="\e[1;31m"
        RXTXColor="\e[2;32m"
    else
        NormalColor="\e[0m"
        MachineColor="\e[7m"
        ValueColor="\e[1m"
        AddrColor="\e[4m"
        RXTXColor="\e[1m"
    fi
    local i
    for i in $(seq $(expr $Width + 4 )); do 
        Rouler="$Rouler-";
    done
}

human_readable() {
    if [ $1 -gt 0 ]; then
        printf "$(awk -v n=$1 'BEGIN{for(i=split("B KB MB GB TB PB",suffix);s<1;i--)s=n/(2**(10*i));printf (int(s)=s)?"%.0f%s":"%.1f%s",s,suffix[i+2]}')"
    else
        printf "0B"
    fi
}

device_rx_tx() {
    local RXTX=$(awk -v Device=$1 '$1==Device ":"{printf "%d\t%d",$2,$10}' /proc/net/dev)
    [ "$RXTX" != "" ] && printf "rx/tx: $RXTXColor$(human_readable $(echo "$RXTX" | cut -f 1))$NormalColor/$RXTXColor$(human_readable $(echo "$RXTX" | cut -f 2))$NormalColor"
}

print_line() {
    printf " | %-${Width}s |\r | $1\n"
}

print_horizontal_ruler() {
    printf " $Rouler\n"
}

print_machine() {
    local Machine=""
    local HostName=$(uci -q get system.@system[0].hostname)
    [ -e /tmp/sysinfo/model ] && Machine=$(cat /tmp/sysinfo/model)
    print_line "Machine: $MachineColor$Machine$NormalColor, Name: $MachineColor$HostName$NormalColor"
}

print_uptime() {
    local Uptime=$(cut -d. -f1 /proc/uptime)
    local Days=$(expr $Uptime / 60 / 60 / 24)
    local Hours=$(expr $Uptime / 60 / 60 % 24)
    local Minutes=$(expr $Uptime / 60 % 60)
    local Seconds=$(expr $Uptime % 60)
    print_line "Uptime: $ValueColor$(printf '%dd %02d:%02d:%02d' $Days $Hours $Minutes $Seconds)$NormalColor, Now: $ValueColor$(date +'%Y-%m-%d %H:%M:%S')$NormalColor"
}

print_loadavg() {
    local LoadAvg=$(awk '{printf"%s, %s, %s",$1,$2,$3}' /proc/loadavg)
    print_line "Load: $ValueColor$LoadAvg$NormalColor"
}

print_flash() {
    local Flash=$(df -k /overlay | awk '/overlay/{printf "%d\t%d\t%.1f",$4*1024,$2*1024,($2>0)?$3/$2*100:0}')
    local Free=$(echo "$Flash" | cut -f 1)
    local Total=$(echo "$Flash" | cut -f 2)
    local Used=$(echo "$Flash" | cut -f 3)
    print_line "Flash: free: $ValueColor$(human_readable $Free)$NormalColor, total: $ValueColor$(human_readable $Total)$NormalColor, used: $ValueColor$Used$NormalColor%%"
}

print_memory() {
    local Memory=$(awk 'BEGIN{Total=0;Free=0}$1~/^MemTotal:/{Total=$2}$1~/^MemFree:|^Buffers:|^Cached:/{Free+=$2}END{printf"%d\t%d\t%.1f",Free*1024,Total*1024,(Total>0)?(((Total-Free)/Total)*100):0}' /proc/meminfo)
    local Free=$(echo "$Memory" | cut -f 1)
    local Total=$(echo "$Memory" | cut -f 2)
    local Used=$(echo "$Memory" | cut -f 3)
    print_line "Memory: free: $ValueColor$(human_readable $Free)$NormalColor, total: $ValueColor$(human_readable $Total)$NormalColor, used: $ValueColor$Used$NormalColor%%"
}

print_wan() {
    local Zone
    local Device
    for Zone in $(uci -q show firewall | grep .masq= | cut -f2 -d.); do
        for Device in $(uci -q get firewall.$Zone.network); do
            local Status="$(ubus call network.interface.$Device status 2>/dev/null)"
            if [ "$Status" != "" ]; then
                local State=""
                local Iface=""
                local IP4=""
                local IP6=""
                local Subnet4=""
                local Subnet6=""
                local Gateway4="n/a"
                local Gateway6="n/a"
                local DNS=""
                local Protocol=""
                json_load "${Status:-{}}"
                json_get_var State up
                json_get_var Iface l3_device
                json_get_var Protocol proto
                if json_get_type Status ipv4_address && [ "$Status" = array ]; then
                    json_select ipv4_address
                    json_get_type Status 1
                    if [ "$Status" = object ]; then
                        json_select 1
                        json_get_var IP4 address
                        json_get_var Subnet4 mask
                        [ "$IP4" != "" ] && [ "$Subnet4" != "" ] && IP4="$IP4/$Subnet4"
                    fi
                fi
                json_select
                if json_get_type Status ipv6_address && [ "$Status" = array ]; then
                    json_select ipv6_address
                    json_get_type Status 1
                    if [ "$Status" = object ]; then
                        json_select 1
                        json_get_var IP6 address
                        json_get_var Subnet6 mask
                        [ "$IP6" != "" ] && [ "$Subnet6" != "" ] && IP6="$IP6/$Subnet6"
                    fi
                fi
                json_select
                if json_get_type Status route && [ "$Status" = array ]; then
                    json_select route
                    local Index="1"
                    while json_get_type Status $Index && [ "$Status" = object ]; do
                        json_select "$((Index++))"
                        json_get_var Status target
                        case "$Status" in
                            0.0.0.0)
                                json_get_var Gateway4 nexthop;;
                            ::)
                                json_get_var Gateway6 nexthop;;
                        esac
                        json_select ".."
                    done    
                fi
                json_select
                if json_get_type Status dns_server && [ "$Status" = array ]; then
                    json_select dns_server
                    local Index="1"
                    while json_get_type Status $Index && [ "$Status" = string ]; do
                        json_get_var Status "$((Index++))"
                        DNS="${DNS:+$DNS }$Status"
                    done
                fi
                if [ "$State" == "1" ]; then
                    [ "$IP4" != "" ] && print_line "WAN: $AddrColor$IP4$NormalColor($Iface), gateway: $AddrColor$Gateway4$NormalColor"
                    [ "$IP6" != "" ] && print_line "WAN: $AddrColor$IP6$NormalColor($Iface), gateway: $AddrColor$Gateway6$NormalColor"
                    print_line "proto: $ValueColor$Protocol$NormalColor, $(device_rx_tx $Iface)"
                    print_line "dns: $AddrColor$DNS$NormalColor"
                fi
            fi
        done
    done
}

print_lan() {
    local Device="lan"
    local State
    local Iface
    local IP4
    local IP6
    local Subnet4
    local Subnet6
    local Status="$(ubus call network.interface.$Device status 2>/dev/null)"
    if [ "$Status" != "" ]; then
        json_load "${Status:-{}}"
        json_get_var State up
        json_get_var Iface device
        if json_get_type Status ipv4_address && [ "$Status" = array ]; then
            json_select ipv4_address
            json_get_type Status 1
            if [ "$Status" = object ]; then
                json_select 1
                json_get_var IP4 address
                json_get_var Subnet4 mask
                [ "$IP4" != "" ] && [ "$Subnet4" != "" ] && IP4="$IP4/$Subnet4"
            fi
        fi
        json_select
        if json_get_type Status ipv6_address && [ "$Status" = array ]; then
            json_select ipv6_address
            json_get_type Status 1
            if [ "$Status" = object ]; then
                json_select 1
                json_get_var IP6 address
                json_get_var Subnet6 mask
                [ "$IP6" != "" ] && [ "$Subnet6" != "" ] && IP6="$IP6/$Subnet6"
            fi
        fi
        [ "$IP4" != "" ] && print_line "LAN: $AddrColor$IP4$NormalColor"
        [ "$IP6" != "" ] && print_line "LAN: $AddrColor$IP6$NormalColor"
    fi
}

print_wlan() {
    local Iface
    for Iface in $(uci -q show wireless | grep device=radio | cut -f2 -d.); do
        local Device=$(uci -q get wireless.$Iface.device)
        local SSID=$(uci -q get wireless.$Iface.ssid)
        local IfaceDisabled=$(uci -q get wireless.$Iface.disabled)
        local DeviceDisabled=$(uci -q get wireless.$Device.disabled)
        if [ -n "$SSID" ] && [ "$IfaceDisabled" != "1" ] && [ "$DeviceDisabled" != "1" ]; then
            local Mode=$(uci -q -P /var/state get wireless.$Iface.mode)
            local Channel=$(uci -q get wireless.$Device.channel)
            local RadioIface=$(uci -q -P /var/state get wireless.$Iface.ifname)
            if [ -n "$RadioIface" ]; then
                if [ "$Mode" == "ap" ]; then
                    Connection="$(iw dev $RadioIface station dump | grep Station | wc -l)"
                else
                    Connection="$(iw dev $RadioIface link | awk 'BEGIN{FS=": ";Signal="";Bitrate=""} $1~/signal/ {Signal=$2} $1~/tx bitrate/ {Bitrate=$2}END{print Signal" "Bitrate}')"
                fi
            fi
            print_line "WLAN: $ValueColor$SSID$NormalColor($Mode), ch: $ValueColor$Channel$NormalColor, conn: $ValueColor$Connection$NormalColor, $(device_rx_tx $RadioIface)"
        fi
    done
}

print_vpn() {
    local VPN
    for VPN in $(uci -q show openvpn | grep .ca= | cut -f2 -d.); do
        local Device=$(uci -q get openvpn.$VPN.dev)
        local Enabled=$(uci -q get openvpn.$VPN.enabled)
        if [ "$Enabled" == "1" ] || [ "$Enabled" == "" ]; then
            Mode=$(uci -q get openvpn.$VPN.mode)
            if [ "$Mode" == "server" ]; then
                Mode="$ValueColor$VPN$NormalColor(svr):$(uci -q get openvpn.$VPN.port)"
                Status=$(uci -q get openvpn.$VPN.status)
                Connection=$(awk 'BEGIN{FS=",";c=0;l=0}{if($1=="Common Name")l=1;else if($1=="ROUTING TABLE")exit;else if (l==1) c=c+1}END{print c}' $Status)
            else
                Mode="$ValueColor$VPN$NormalColor(cli)"
                Connection="Down"
                ifconfig $Device &>/dev/null && Connection="Up"
            fi
            print_line "VPN: $Mode, conn: $ValueColor$Connection$NormalColor, $(device_rx_tx $Device)"
        fi
    done
}

initialize $@
[ "$StartRuler" == "1" ] && print_horizontal_ruler
print_machine
print_uptime
print_loadavg
print_flash
print_memory
print_wan
print_lan
print_wlan
print_vpn
[ "$EndRuler" == "1" ] && print_horizontal_ruler
exit 0

186

(206 odpowiedzi, napisanych Oprogramowanie / Software)

Cezary, przyznaję, że trochę się pokolorowało przez przypadek:) Masz jakieś sugestie? Wracamy do wersji czarno-białej?

Z interfejsem sprawdzę.

187

(206 odpowiedzi, napisanych Oprogramowanie / Software)

Cezary,
to wersja po kolejnych optymalizacjach:

#!/bin/sh
#
# sysinfo.sh dla OpenWRT AA Cezary Jackiewicz 2013
# 
#    1.00    CJ    Pierwsza wersja kodu
#    1.01    RD    Drobna przebudowa
#    1.02    RD    Korekta bledu wysw. zajetosci Flash-a, dodanie kolorow
#    1.03    RD    Dodanie nazwy routera, zmiana formatowania
#    1.04    RD    Kosmetyka, sugestie mikhnal. Zmiana przetwarzania info. o wan.
#    1.05    RD    Zmiana algorytmu pobierania danych dla wan i lan
#
. /usr/share/libubox/jshn.sh
#. /lib/functions/network.sh

local NormalColor="\e[0;37m"
local MachineColor="\e[0;33m"
local ValueColor="\e[1;36m"
local AddrColor="\e[1;31m"
local RXTXColor="\e[2;32m"

human_readable() {
    if [ $1 -gt 0 ]; then
        printf "$(awk -v n=$1 'BEGIN{for(i=split("B KB MB GB TB PB",suffix);s<1;i--)s=n/(2**(10*i));printf (int(s)=s)?"%.0f%s":"%.1f%s",s,suffix[i+2]}')"
    else
        printf "0B"
    fi
}

device_rx_tx() {
    local RXTX=$(awk -v Device=$1 '$1==Device ":"{printf "%d\t%d",$2,$10}' /proc/net/dev)
    [ "$RXTX" != "" ] && printf "rx/tx: $RXTXColor$(human_readable $(echo "$RXTX" | cut -f 1))$NormalColor/$RXTXColor$(human_readable $(echo "$RXTX" | cut -f 2))$NormalColor"
}

print_line() {
    printf " | %-60s |\r | $1\n"
}

print_horizontal_ruler() {
    printf " ----------------------------------------------------------------\n"
}

print_machine() {
    local Machine=""
    local HostName=$(uci -q get system.@system[0].hostname)
    [ -e /tmp/sysinfo/model ] && Machine=$(cat /tmp/sysinfo/model)
    print_line "Machine: $MachineColor$Machine$NormalColor, Name: $MachineColor$HostName$NormalColor"
}

print_uptime() {
    local Uptime=$(cut -d. -f1 /proc/uptime)
    local Days=$(expr $Uptime / 60 / 60 / 24)
    local Hours=$(expr $Uptime / 60 / 60 % 24)
    local Minutes=$(expr $Uptime / 60 % 60)
    local Seconds=$(expr $Uptime % 60)
    print_line "Uptime: $ValueColor$(printf '%dd %02d:%02d:%02d' $Days $Hours $Minutes $Seconds)$NormalColor, Now: $ValueColor$(date +'%Y-%m-%d %H:%M:%S')$NormalColor"
}

print_loadavg() {
    local LoadAvg=$(awk '{printf"%s, %s, %s",$1,$2,$3}' /proc/loadavg)
    print_line "Load: $ValueColor$LoadAvg$NormalColor"
}

print_flash() {
    local Flash=$(df -k /overlay | awk '/overlay/{printf "%d\t%d\t%.1f",$4*1024,$2*1024,($2>0)?$3/$2*100:0}')
    local Free=$(echo "$Flash" | cut -f 1)
    local Total=$(echo "$Flash" | cut -f 2)
    local Used=$(echo "$Flash" | cut -f 3)
    print_line "Flash: free: $ValueColor$(human_readable $Free)$NormalColor, total: $ValueColor$(human_readable $Total)$NormalColor, used: $ValueColor$Used$NormalColor%%"
}

print_memory() {
    local Memory=$(awk 'BEGIN{Total=0;Free=0}$1~/^MemTotal:/{Total=$2}$1~/^MemFree:|^Buffers:|^Cached:/{Free+=$2}END{printf"%d\t%d\t%.1f",Free*1024,Total*1024,(Total>0)?(((Total-Free)/Total)*100):0}' /proc/meminfo)
    local Free=$(echo "$Memory" | cut -f 1)
    local Total=$(echo "$Memory" | cut -f 2)
    local Used=$(echo "$Memory" | cut -f 3)
    print_line "Memory: free: $ValueColor$(human_readable $Free)$NormalColor, total: $ValueColor$(human_readable $Total)$NormalColor, used: $ValueColor$Used$NormalColor%%"
}

print_wan() {
    local Zone
    local Device
    local State
    local Iface
    local IP4
    local IP6
    local Subnet4
    local Subnet6
    local Gateway4
    local Gateway6
    local DNS
    local Protocol
    for Zone in $(uci -q show firewall | grep .masq= | cut -f2 -d.); do
        for Device in $(uci -q get firewall.$Zone.network); do
            local Status="$(ubus call network.interface.$Device status 2>/dev/null)"
            if [ "$Status" != "" ]; then
                json_load "${Status:-{}}"
                json_get_var State up
                json_get_var Iface device
                json_get_var Protocol proto
                if json_get_type Status ipv4_address && [ "$Status" = array ]; then
                    json_select ipv4_address
                    json_get_type Status 1
                    if [ "$Status" = object ]; then
                        json_select 1
                        json_get_var IP4 address
                        json_get_var Subnet4 mask
                        [ "$IP4" != "" ] && [ "$Subnet4" != "" ] && IP4="$IP4/$Subnet4"
                    fi
                fi
                json_select
                if json_get_type Status ipv6_address && [ "$Status" = array ]; then
                    json_select ipv6_address
                    json_get_type Status 1
                    if [ "$Status" = object ]; then
                        json_select 1
                        json_get_var IP6 address
                        json_get_var Subnet6 mask
                        [ "$IP6" != "" ] && [ "$Subnet6" != "" ] && IP6="$IP6/$Subnet6"
                    fi
                fi
                json_select
                if json_get_type Status route && [ "$Status" = array ]; then
                    json_select route
                    local Index="1"
                    while json_get_type Status $Index && [ "$Status" = object ]; do
                        json_select "$((Index++))"
                        json_get_var Status target
                        case "$Status" in
                            0.0.0.0)
                                json_get_var Gateway4 nexthop;;
                            ::)
                                json_get_var Gateway6 nexthop;;
                        esac
                        json_select ".."
                    done    
                fi
                json_select
                if json_get_type Status dns_server && [ "$Status" = array ]; then
                    json_select dns_server
                    local Index="1"
                    while json_get_type Status $Index && [ "$Status" = string ]; do
                        json_get_var Status "$((Index++))"
                        DNS="${DNS:+$DNS }$Status"
                    done
                fi
                if [ "$State" == "1" ]; then
                    [ "$IP4" != "" ] && print_line "WAN: $AddrColor$IP4$NormalColor($Iface), gateway: $AddrColor$Gateway4$NormalColor"
                    [ "$IP6" != "" ] && print_line "WAN: $AddrColor$IP6$NormalColor($Iface), gateway: $AddrColor$Gateway6$NormalColor"
                    print_line "proto: $ValueColor$Protocol$NormalColor, $(device_rx_tx $Iface)"
                    print_line "dns: $AddrColor$DNS$NormalColor"
                fi
            fi
        done
    done
}

print_lan() {
    local Device="lan"
    local State
    local Iface
    local IP4
    local IP6
    local Subnet4
    local Subnet6
    local Status="$(ubus call network.interface.$Device status 2>/dev/null)"
    if [ "$Status" != "" ]; then
        json_load "${Status:-{}}"
        json_get_var State up
        json_get_var Iface device
        if json_get_type Status ipv4_address && [ "$Status" = array ]; then
            json_select ipv4_address
            json_get_type Status 1
            if [ "$Status" = object ]; then
                json_select 1
                json_get_var IP4 address
                json_get_var Subnet4 mask
                [ "$IP4" != "" ] && [ "$Subnet4" != "" ] && IP4="$IP4/$Subnet4"
            fi
        fi
        json_select
        if json_get_type Status ipv6_address && [ "$Status" = array ]; then
            json_select ipv6_address
            json_get_type Status 1
            if [ "$Status" = object ]; then
                json_select 1
                json_get_var IP6 address
                json_get_var Subnet6 mask
                [ "$IP6" != "" ] && [ "$Subnet6" != "" ] && IP6="$IP6/$Subnet6"
            fi
        fi
        [ "$IP4" != "" ] && print_line "LAN: $AddrColor$IP4$NormalColor"
        [ "$IP6" != "" ] && print_line "LAN: $AddrColor$IP6$NormalColor"
    fi
}

print_wlan() {
    local Iface
    for Iface in $(uci -q show wireless | grep device=radio | cut -f2 -d.); do
        local Device=$(uci -q get wireless.$Iface.device)
        local SSID=$(uci -q get wireless.$Iface.ssid)
        local IfaceDisabled=$(uci -q get wireless.$Iface.disabled)
        local DeviceDisabled=$(uci -q get wireless.$Device.disabled)
        if [ -n "$SSID" ] && [ "$IfaceDisabled" != "1" ] && [ "$DeviceDisabled" != "1" ]; then
            local Mode=$(uci -q -P /var/state get wireless.$Iface.mode)
            local Channel=$(uci -q get wireless.$Device.channel)
            local RadioIface=$(uci -q -P /var/state get wireless.$Iface.ifname)
            local Info
            if [ -n "$RadioIface" ]; then
                if [ "$Mode" == "ap" ]; then
                    Connection="$(iw dev $RadioIface station dump | grep Station | wc -l)"
                else
                    Connection="$(iw dev $RadioIface link | awk 'BEGIN{FS=": ";Signal="";Bitrate=""} $1~/signal/ {Signal=$2} $1~/tx bitrate/ {Bitrate=$2}END{print Signal" "Bitrate}')"
                fi
            fi
            print_line "WLAN: $ValueColor$SSID$NormalColor($Mode), ch: $ValueColor$Channel$NormalColor, conn: $ValueColor$Connection$NormalColor, $(device_rx_tx $RadioIface)"
        fi
    done
}

print_vpn() {
    local VPN
    for VPN in $(uci -q show openvpn | grep .ca= | cut -f2 -d.); do
        local Device=$(uci -q get openvpn.$VPN.dev)
        local Enabled=$(uci -q get openvpn.$VPN.enabled)
        if [ "$Enabled" == "1" ] || [ "$Enabled" == "" ]; then
            Mode=$(uci -q get openvpn.$VPN.mode)
            if [ "$Mode" == "server" ]; then
                Mode="$ValueColor$VPN$NormalColor(svr):$(uci -q get openvpn.$VPN.port)"
                Status=$(uci -q get openvpn.$VPN.status)
                Connection=$(awk 'BEGIN{FS=",";c=0;l=0}{if($1=="Common Name")l=1;else if($1=="ROUTING TABLE")exit;else if (l==1) c=c+1}END{print c}' $Status)
            else
                Mode="$ValueColor$VPN$NormalColor(cli)"
                Connection="Down"
                ifconfig $Device &>/dev/null && Connection="Up"
            fi
            print_line "VPN: $Mode, conn: $ValueColor$Connection$NormalColor, $(device_rx_tx $Device)"
        fi
    done
}

print_machine
print_uptime
print_loadavg
print_flash
print_memory
print_wan
print_lan
print_wlan
print_vpn
print_horizontal_ruler
exit 0

Poproszę o ocenę wydajności.

188

(206 odpowiedzi, napisanych Oprogramowanie / Software)

Witam
zrobiłem trochę kosmetyki o której wspominaliście, zmodyfikowałem wyświetlanie wan (Cezary poszedłem Twoim tropem, maskarada jest wyznacznikiem).
Czy taki czas wykonywania skryptu jest dopuszczalny?

PS: Co do 2GB rx wanu to występuje tylko dla fizycznego portu Ethernet, np. dla wwan0 nie. To jakiś błąd, taka wartość jest w pliku /proc/net/dev.

#!/bin/sh
#
# sysinfo.sh dla OpenWRT AA Cezary Jackiewicz 2013
# 
#    1.00    CJ    Pierwsza wersja kodu
#    1.01    RD    Drobna przebudowa
#    1.02    RD    Korekta bledu wysw. zajetosci Flash-a, dodanie kolorow
#    1.03    RD    Dodanie nazwy routera, zmiana formatowania
#    1.04    RD    Kosmetyka, sugestie mikhnal. Zmiana przetwarzania info. o wan.
#
. /lib/functions/network.sh

local NormalColor="\e[0;37m"
local MachineColor="\e[0;33m"
local ValueColor="\e[1;36m"
local AddrColor="\e[1;31m"
local RXTXColor="\e[2;32m"

human_readable() {
    if [ $1 -gt 0 ]; then
        printf "$(awk -v n=$1 'BEGIN{for(i=split("B KB MB GB TB PB",suffix);s<1;i--)s=n/(2**(10*i));printf (int(s)=s)?"%.0f%s":"%.1f%s",s,suffix[i+2]}')"
    else
        printf "0B"
    fi
}

device_rx_tx() {
    local RXTX=$(awk -v Device=$1 '$1==Device ":"{printf "%d\t%d",$2,$10}' /proc/net/dev)
    [ "$RXTX" != "" ] && printf "rx/tx: $RXTXColor$(human_readable $(echo "$RXTX" | cut -f 1))$NormalColor/$RXTXColor$(human_readable $(echo "$RXTX" | cut -f 2))$NormalColor"
}

print_line() {
    printf " | %-60s |\r | $1\n"
}

print_horizontal_ruler() {
    printf " ----------------------------------------------------------------\n"
}

print_machine() {
    local Machine=""
    local HostName=$(uci -q get system.@system[0].hostname)
    [ -e /tmp/sysinfo/model ] && Machine=$(cat /tmp/sysinfo/model)
    print_line "Machine: $MachineColor$Machine$NormalColor, Name: $MachineColor$HostName$NormalColor"
}

print_uptime() {
    local Uptime=$(cut -d. -f1 /proc/uptime)
    local Days=$(expr $Uptime / 60 / 60 / 24)
    local Hours=$(expr $Uptime / 60 / 60 % 24)
    local Minutes=$(expr $Uptime / 60 % 60)
    local Seconds=$(expr $Uptime % 60)
    print_line "Uptime: $ValueColor$(printf '%dd %02d:%02d:%02d' $Days $Hours $Minutes $Seconds)$NormalColor, Now: $ValueColor$(date +'%Y-%m-%d %H:%M:%S')$NormalColor"
}

print_loadavg() {
    local LoadAvg=$(awk '{printf"%s, %s, %s",$1,$2,$3}' /proc/loadavg)
    print_line "Load: $ValueColor$LoadAvg$NormalColor"
}

print_flash() {
    local Flash=$(df -k /overlay | awk '/overlay/{printf "%d\t%d\t%.1f",$4*1024,$2*1024,($2>0)?$3/$2*100:0}')
    local Free=$(echo "$Flash" | cut -f 1)
    local Total=$(echo "$Flash" | cut -f 2)
    local Used=$(echo "$Flash" | cut -f 3)
    print_line "Flash: free: $ValueColor$(human_readable $Free)$NormalColor, total: $ValueColor$(human_readable $Total)$NormalColor, used: $ValueColor$Used$NormalColor%%"
}

print_memory() {
    local Memory=$(awk 'BEGIN{Total=0;Free=0}$1~/^MemTotal:/{Total=$2}$1~/^MemFree:|^Buffers:|^Cached:/{Free+=$2}END{printf"%d\t%d\t%.1f",Free*1024,Total*1024,(Total>0)?(((Total-Free)/Total)*100):0}' /proc/meminfo)
    local Free=$(echo "$Memory" | cut -f 1)
    local Total=$(echo "$Memory" | cut -f 2)
    local Used=$(echo "$Memory" | cut -f 3)
    print_line "Memory: free: $ValueColor$(human_readable $Free)$NormalColor, total: $ValueColor$(human_readable $Total)$NormalColor, used: $ValueColor$Used$NormalColor%%"
}

print_wan() {
    local Zone
    local Device
    local Iface
    local IP
    local Subnet
    local Gateway
    local DNS
    local Protocol
    for Zone in $(uci -q show firewall | grep .masq= | cut -f2 -d.); do
        for Device in $(uci -q get firewall.$Zone.network); do
            local State=$(uci -q -P /var/state get network.$Device.up)
            if [ "$State" == "1" ]; then
                Protocol=$(uci -q get network.$Device.proto)
                Iface=$(uci -q -P /var/state get network.$Device.ifname)
                network_get_ipaddr IP $Device
                network_get_subnet Subnet $Device
                network_get_gateway Gateway $Device
                network_get_dnsserver DNS $Device
                print_line "WAN: $AddrColor$IP$NormalColor($Iface), subnet: $AddrColor$Subnet$NormalColor"
                print_line "gateway: $AddrColor$Gateway$NormalColor, proto: $ValueColor$Protocol$NormalColor, $(device_rx_tx $Iface)"
                print_line "dns: $AddrColor$DNS$NormalColor"
            fi
        done
    done
}

print_lan() {
    local Device="lan"
    local IP
    local Subnet
    network_get_ipaddr IP $Device
    network_get_subnet Subnet $Device
    print_line "LAN: $AddrColor$IP$NormalColor, subnet: $AddrColor$Subnet$NormalColor"
}

print_wlan() {
    local Iface
    for Iface in $(uci -q show wireless | grep device=radio | cut -f2 -d.); do
        local Device=$(uci -q get wireless.$Iface.device)
        local SSID=$(uci -q get wireless.$Iface.ssid)
        local IfaceDisabled=$(uci -q get wireless.$Iface.disabled)
        local DeviceDisabled=$(uci -q get wireless.$Device.disabled)
        if [ -n "$SSID" ] && [ "$IfaceDisabled" != "1" ] && [ "$DeviceDisabled" != "1" ]; then
            local Mode=$(uci -q -P /var/state get wireless.$Iface.mode)
            local Channel=$(uci -q get wireless.$Device.channel)
            local RadioIface=$(uci -q -P /var/state get wireless.$Iface.ifname)
            local Info
            if [ -n "$RadioIface" ]; then
                if [ "$Mode" == "ap" ]; then
                    Connection="$(iw dev $RadioIface station dump | grep Station | wc -l)"
                else
                    Connection="$(iw dev $RadioIface link | awk 'BEGIN{FS=": ";Signal="";Bitrate=""} $1~/signal/ {Signal=$2} $1~/tx bitrate/ {Bitrate=$2}END{print Signal" "Bitrate}')"
                fi
            fi
            print_line "WLAN: $ValueColor$SSID$NormalColor($Mode), ch: $ValueColor$Channel$NormalColor, conn: $ValueColor$Connection$NormalColor, $(device_rx_tx $RadioIface)"
        fi
    done
}

print_vpn() {
    local VPN
    for VPN in $(uci -q show openvpn | grep .ca= | cut -f2 -d.); do
        local Device=$(uci -q get openvpn.$VPN.dev)
        local Enabled=$(uci -q get openvpn.$VPN.enabled)
        if [ "$Enabled" == "1" ] || [ "$Enabled" == "" ]; then
            Mode=$(uci -q get openvpn.$VPN.mode)
            if [ "$Mode" == "server" ]; then
                Mode="$ValueColor$VPN$NormalColor(svr):$(uci -q get openvpn.$VPN.port)"
                Status=$(uci -q get openvpn.$VPN.status)
                Connection=$(awk 'BEGIN{FS=",";c=0;l=0}{if($1=="Common Name")l=1;else if($1=="ROUTING TABLE")exit;else if (l==1) c=c+1}END{print c}' $Status)
            else
                Mode="$ValueColor$VPN$NormalColor(cli)"
                Connection="Down"
                ifconfig $Device &>/dev/null && Connection="Up"
            fi
            print_line "VPN: $Mode, conn: $ValueColor$Connection$NormalColor, $(device_rx_tx $Device)"
        fi
    done
}

print_machine
print_uptime
print_loadavg
print_flash
print_memory
print_wan
print_lan
print_wlan
print_vpn
print_horizontal_ruler
exit 0

189

(206 odpowiedzi, napisanych Oprogramowanie / Software)

Cezary,
zmieniłem formatowanie, też mi to chodziło po głowie.

#!/bin/sh
#
# sysinfo.sh dla OpenWRT AA Cezary Jackiewicz 2013
# 
#    1.00    CJ    Pierwsza wersja kodu
#    1.01    RD    Drobna przebudowa
#    1.02    RD    Korekta bledu wysw. zajetosci Flash-a, dodanie kolorow
#    1.03    RD    Dodanie nazwy routera, zmiana formatowania
#
. /lib/functions/network.sh

local NormalColor="\e[0;37m"
local MachineColor="\e[0;33m"
local ValueColor="\e[1;36m"
local AddrColor="\e[1;31m"
local RXTXColor="\e[2;32m"

human_readable() {
    if [ $1 -gt 0 ]; then
        printf "$(awk -v n=$1 'BEGIN{for(i=split("B KB MB GB TB PB",suffix);s<1;i--)s=n/(2**(10*i));printf (int(s)=s)?"%.0f%s":"%.2f%s",s,suffix[i+2]}')"
    else
        printf "0"
    fi
}

device_rx_tx() {
    local RXTX=$(awk -v Device=$1 '$1==Device ":"{printf "%d\t%d",$2,$10}' /proc/net/dev)
    [ "$RXTX" != "" ] && printf "rx:$RXTXColor$(human_readable $(echo "$RXTX" | cut -f 1))$NormalColor,tx:$RXTXColor$(human_readable $(echo "$RXTX" | cut -f 2))$NormalColor"
}

print_line() {
    printf " | %-60s |\r | $1\n"
}

print_horizontal_ruler() {
    printf " ----------------------------------------------------------------\n"
}

print_machine() {
    local Machine=""
    local HostName=$(uci -q get system.@system[0].hostname)
    [ -e /tmp/sysinfo/model ] && Machine=$(cat /tmp/sysinfo/model)
    print_line "Machine: $MachineColor$Machine$NormalColor, Name: $MachineColor$HostName$NormalColor"
}

print_uptime() {
    local Uptime=$(cut -d. -f1 /proc/uptime)
    local Days=$(expr $Uptime / 60 / 60 / 24)
    local Hours=$(expr $Uptime / 60 / 60 % 24)
    local Minutes=$(expr $Uptime / 60 % 60)
    local Seconds=$(expr $Uptime % 60)
    print_line "Uptime: $ValueColor$(printf '%dd, %02d:%02d:%02d' $Days $Hours $Minutes $Seconds)$NormalColor, Now: $ValueColor$(date +'%Y-%m-%d %H:%M:%S')$NormalColor"
}

print_loadavg() {
    local LoadAvg=$(awk '{printf"%s,%s,%s",$1,$2,$3}' /proc/loadavg)
    print_line "Load: $ValueColor$LoadAvg$NormalColor"
}

print_flash() {
    local Flash=$(df -k /overlay | awk '/overlay/{printf "%d\t%d\t%.1f",$4*1024,$2*1024,($2>0)?$3/$2*100:0}')
    local Free=$(echo "$Flash" | cut -f 1)
    local Total=$(echo "$Flash" | cut -f 2)
    local Used=$(echo "$Flash" | cut -f 3)
    print_line "Flash: free: $ValueColor$(human_readable $Free)$NormalColor, total: $ValueColor$(human_readable $Total)$NormalColor, used: $ValueColor$Used$NormalColor%%"
}

print_memory() {
    local Memory=$(awk 'BEGIN{Total=0;Free=0}$1~/^MemTotal:/{Total=$2}$1~/^MemFree:|^Buffers:|^Cached:/{Free+=$2}END{printf"%d\t%d\t%.1f",Free*1024,Total*1024,(Total>0)?(((Total-Free)/Total)*100):0}' /proc/meminfo)
    local Free=$(echo "$Memory" | cut -f 1)
    local Total=$(echo "$Memory" | cut -f 2)
    local Used=$(echo "$Memory" | cut -f 3)
    print_line "Memory: free: $ValueColor$(human_readable $Free)$NormalColor, total: $ValueColor$(human_readable $Total)$NormalColor, used: $ValueColor$Used$NormalColor%%"
}

print_wan() {
    local Device
    local Iface
    local IP
    local Subnet
    local Gateway
    local DNS
    local Protocol
    network_find_wan Device
    if [ "$Device" != "" ]; then
        Iface=$(uci -q -P /var/state get network.$Device.ifname)
        network_get_ipaddr IP $Device
        network_get_subnet Subnet $Device
        network_get_gateway Gateway $Device
        network_get_dnsserver DNS $Device
        Protocol=$(uci -q get network.$Device.proto)
        print_line "WAN: $AddrColor$IP$NormalColor, subnet: $AddrColor$Subnet$NormalColor"
        print_line "gateway: $AddrColor$Gateway$NormalColor, protocol: $ValueColor$Protocol$NormalColor, $(device_rx_tx $Iface)"
        print_line "dns: $AddrColor$DNS$NormalColor"
    fi
    network_find_wan6 Device
    if [ "$Device" != "" ]; then
        Iface=$(uci -q -P /var/state get network.$Device.ifname)
        network_get_ipaddr6 IP $Device
        network_get_subnet6 Subnet $Device
        network_get_gateway6 Gateway $Device
        network_get_dnsserver DNS $Device
        Protocol=$(uci -q get network.$Device.proto)
        print_line "WAN6: $AddrColor$IP$NormalColor, subnet: $AddrColor$Subnet$NormalColor"
        print_line "gateway: $AddrColor$Gateway$NormalColor, protocol: $ValueColor$Protocol$NormalColor, $(device_rx_tx $Iface)"
        print_line "dns: $AddrColor$DNS$NormalColor"
    fi
}

print_lan() {
    local Device="lan"
    local IP
    local Subnet
    network_get_ipaddr IP $Device
    network_get_subnet Subnet $Device
    print_line "LAN: $AddrColor$IP$NormalColor, subnet: $AddrColor$Subnet$NormalColor"
}

print_wlan() {
    local Iface
    for Iface in $(uci -q show wireless | grep device=radio | cut -f2 -d.); do
        local Device=$(uci -q get wireless.$Iface.device)
        local SSID=$(uci -q get wireless.$Iface.ssid)
        local IfaceDisabled=$(uci -q get wireless.$Iface.disabled)
        local DeviceDisabled=$(uci -q get wireless.$Device.disabled)
        if [ -n "$SSID" ] && [ "$IfaceDisabled" != "1" ] && [ "$DeviceDisabled" != "1" ]; then
            local Mode=$(uci -q -P /var/state get wireless.$Iface.mode)
            local Channel=$(uci -q get wireless.$Device.channel)
            local RadioIface=$(uci -q -P /var/state get wireless.$Iface.ifname)
            local Info
            if [ -n "$RadioIface" ]; then
                if [ "$Mode" == "ap" ]; then
                    Connection="$(iw dev $RadioIface station dump | grep Station | wc -l)"
                else
                    Connection="$(iw dev $RadioIface link | awk 'BEGIN{FS=": ";Signal="";Bitrate=""} $1~/signal/ {Signal=$2} $1~/tx bitrate/ {Bitrate=$2}END{print Signal" "Bitrate}')"
                fi
            fi
            print_line "WLAN: $ValueColor$SSID$NormalColor($Mode), ch: $ValueColor$Channel$NormalColor, conn: $ValueColor$Connection$NormalColor $(device_rx_tx $RadioIface)"
        fi
    done
}

print_vpn() {
    local VPN
    for VPN in $(uci -q show openvpn | grep .ca= | cut -f2 -d.); do
        local Device=$(uci -q get openvpn.$VPN.dev)
        local Enabled=$(uci -q get openvpn.$VPN.enabled)
        if [ "$Enabled" == "1" ] || [ "$Enabled" == "" ]; then
            Mode=$(uci -q get openvpn.$VPN.mode)
            if [ "$Mode" == "server" ]; then
                Mode="$ValueColor$VPN$NormalColor($Mode):$(uci -q get openvpn.$VPN.port)"
                Status=$(uci -q get openvpn.$VPN.status)
                Connection=$(awk 'BEGIN{FS=",";c=0;l=0}{if($1=="Common Name")l=1;else if($1=="ROUTING TABLE")exit;else if (l==1) c=c+1}END{print c}' $Status)
            else
                Mode="$ValueColor$VPN$NormalColor(client)"
                Connection="Down"
                ifconfig $Device &>/dev/null && Connection="Up"
            fi
            print_line "VPN: $Mode, conn: $ValueColor$Connection$NormalColor, $(device_rx_tx $Device)"
        fi
    done
}

print_machine
print_uptime
print_loadavg
print_flash
print_memory
print_wan
print_lan
print_wlan
print_vpn
print_horizontal_ruler
exit 0

190

(206 odpowiedzi, napisanych Oprogramowanie / Software)

Cezary,
na ten moment tyle:

#!/bin/sh
#
# sysinfo.sh dla OpenWRT AA Cezary Jackiewicz 2013
# 
#    1.00    CJ    Pierwsza wersja kodu
#    1.01    RD    Drobna przebudowa
#    1.02    RD    Korekta bledu wysw. zajetosci Flash-a, dodanie kolorow
#
. /lib/functions/network.sh

local NormalColor="\e[0;37m"
local MachineColor="\e[0;33m"
local ValueColor="\e[1;36m"
local AddrColor="\e[1;31m"
local RXTXColor="\e[2;32m"

human_readable() {
    if [ $1 -gt 0 ]; then
        printf "$(awk -v n=$1 'BEGIN{for(i=split("B KB MB GB TB PB",suffix);s<1;i--)s=n/(2**(10*i));printf "%.0f%s",s,suffix[i+2]}')"
    else
        printf "0"
    fi
}

device_rx_tx() {
    local RXTX=$(awk -v Device=$1 '$1==Device ":"{printf "%d\t%d",$2,$10}' /proc/net/dev)
    [ "$RXTX" != "" ] && printf "rx:$RXTXColor$(human_readable $(echo "$RXTX" | cut -f 1))$NormalColor,tx:$RXTXColor$(human_readable $(echo "$RXTX" | cut -f 2))$NormalColor"
}

print_line() {
    printf " | %-60s |\r | $1\n"
}

print_horizontal_ruler() {
    printf " ----------------------------------------------------------------\n"
}

print_machine() {
    local Macine=""
    [ -e /tmp/sysinfo/model ] && Machine=$(cat /tmp/sysinfo/model)
    print_line "Machine: $MachineColor$Machine$NormalColor"
}

print_uptime() {
    local Uptime=$(cut -d. -f1 /proc/uptime)
    local Days=$(expr $Uptime / 60 / 60 / 24)
    local Hours=$(expr $Uptime / 60 / 60 % 24)
    local Minutes=$(expr $Uptime / 60 % 60)
    local Seconds=$(expr $Uptime % 60)
    print_line "Uptime: $ValueColor$(printf '%dd, %02d:%02d:%02d' $Days $Hours $Minutes $Seconds)$NormalColor, Now: $ValueColor$(date +'%Y-%m-%d %H:%M:%S')$NormalColor"
}

print_loadavg() {
    local LoadAvg=$(awk '{printf"%s,%s,%s",$1,$2,$3}' /proc/loadavg)
    print_line "Load: $ValueColor$LoadAvg$NormalColor"
}

print_flash() {
    local Flash=$(df -k /overlay | awk '/overlay/{printf "%d\t%d\t%.1f",$4*1024,$2*1024,($2>0)?$3/$2*100:0}')
    local Free=$(echo "$Flash" | cut -f 1)
    local Total=$(echo "$Flash" | cut -f 2)
    local Used=$(echo "$Flash" | cut -f 3)
    print_line "Flash: free: $ValueColor$(human_readable $Free)$NormalColor, total: $ValueColor$(human_readable $Total)$NormalColor, used: $ValueColor$Used$NormalColor%%"
}

print_memory() {
    local Memory=$(awk 'BEGIN{Total=0;Free=0}$1~/^MemTotal:/{Total=$2}$1~/^MemFree:|^Buffers:|^Cached:/{Free+=$2}END{printf"%d\t%d\t%.1f",Free*1024,Total*1024,(Total>0)?(((Total-Free)/Total)*100):0}' /proc/meminfo)
    local Free=$(echo "$Memory" | cut -f 1)
    local Total=$(echo "$Memory" | cut -f 2)
    local Used=$(echo "$Memory" | cut -f 3)
    print_line "Memory: free: $ValueColor$(human_readable $Free)$NormalColor, total: $ValueColor$(human_readable $Total)$NormalColor, used: $ValueColor$Used$NormalColor%%"
}

print_wan() {
    local Device
    local Iface
    local IP
    local Subnet
    local Gateway
    local DNS
    local Protocol
    network_find_wan Device
    if [ "$Device" != "" ]; then
        Iface=$(uci -q -P /var/state get network.$Device.ifname)
        network_get_ipaddr IP $Device
        network_get_subnet Subnet $Device
        network_get_gateway Gateway $Device
        network_get_dnsserver DNS $Device
        Protocol=$(uci -q get network.$Device.proto)
        print_line "WAN: $AddrColor$IP$NormalColor, subnet: $AddrColor$Subnet$NormalColor"
        print_line "gateway: $AddrColor$Gateway$NormalColor, protocol: $ValueColor$Protocol$NormalColor, $(device_rx_tx $Iface)"
        print_line "dns: $AddrColor$DNS$NormalColor"
    fi
    network_find_wan6 Device
    if [ "$Device" != "" ]; then
        Iface=$(uci -q -P /var/state get network.$Device.ifname)
        network_get_ipaddr6 IP $Device
        network_get_subnet6 Subnet $Device
        network_get_gateway6 Gateway $Device
        network_get_dnsserver DNS $Device
        Protocol=$(uci -q get network.$Device.proto)
        print_line "WAN6: $AddrColor$IP$NormalColor, subnet: $AddrColor$Subnet$NormalColor"
        print_line "gateway: $AddrColor$Gateway$NormalColor, protocol: $ValueColor$Protocol$NormalColor, $(device_rx_tx $Iface)"
        print_line "dns: $AddrColor$DNS$NormalColor"
    fi
}

print_lan() {
    local Device="lan"
    local IP
    local Subnet
    network_get_ipaddr IP $Device
    network_get_subnet Subnet $Device
    print_line "LAN: $AddrColor$IP$NormalColor, subnet: $AddrColor$Subnet$NormalColor"
}

print_wlan() {
    local Iface
    for Iface in $(uci -q show wireless | grep device=radio | cut -f2 -d.); do
        local Device=$(uci -q get wireless.$Iface.device)
        local SSID=$(uci -q get wireless.$Iface.ssid)
        local IfaceDisabled=$(uci -q get wireless.$Iface.disabled)
        local DeviceDisabled=$(uci -q get wireless.$Device.disabled)
        if [ -n "$SSID" ] && [ "$IfaceDisabled" != "1" ] && [ "$DeviceDisabled" != "1" ]; then
            local Mode=$(uci -q -P /var/state get wireless.$Iface.mode)
            local Channel=$(uci -q get wireless.$Device.channel)
            local RadioIface=$(uci -q -P /var/state get wireless.$Iface.ifname)
            local Info
            if [ -n "$RadioIface" ]; then
                if [ "$Mode" == "ap" ]; then
                    Connection="$(iw dev $RadioIface station dump | grep Station | wc -l)"
                else
                    Connection="$(iw dev $RadioIface link | awk 'BEGIN{FS=": ";Signal="";Bitrate=""} $1~/signal/ {Signal=$2} $1~/tx bitrate/ {Bitrate=$2}END{print Signal" "Bitrate}')"
                fi
            fi
            print_line "WLAN: $ValueColor$SSID$NormalColor($Mode), ch: $ValueColor$Channel$NormalColor, conn: $ValueColor$Connection$NormalColor $(device_rx_tx $RadioIface)"
        fi
    done
}

print_vpn() {
    local VPN
    for VPN in $(uci -q show openvpn | grep .ca= | cut -f2 -d.); do
        local Device=$(uci -q get openvpn.$VPN.dev)
        local Enabled=$(uci -q get openvpn.$VPN.enabled)
        if [ "$Enabled" == "1" ] || [ "$Enabled" == "" ]; then
            Mode=$(uci -q get openvpn.$VPN.mode)
            if [ "$Mode" == "server" ]; then
                Mode="$ValueColor$VPN$NormalColor($Mode):$(uci -q get openvpn.$VPN.port)"
                Status=$(uci -q get openvpn.$VPN.status)
                Connection=$(awk 'BEGIN{FS=",";c=0;l=0}{if($1=="Common Name")l=1;else if($1=="ROUTING TABLE")exit;else if (l==1) c=c+1}END{print c}' $Status)
            else
                Mode="$ValueColor$VPN$NormalColor(client)"
                Connection="Down"
                ifconfig $Device &>/dev/null && Connection="Up"
            fi
            print_line "VPN: $Mode, conn: $ValueColor$Connection$NormalColor, $(device_rx_tx $Device)"
        fi
    done
}

print_machine
print_uptime
print_loadavg
print_flash
print_memory
print_wan
print_lan
print_wlan
print_vpn
print_horizontal_ruler
exit 0

191

(206 odpowiedzi, napisanych Oprogramowanie / Software)

Dzięki Cezary,
- wyświetlanie info o flash poprawiłem.
- przestoje to głównie szukanie wan-u, coś pokombinuje jeszcze,
- jeżeli okaże się że rx i tx ma znaczący wpływ prędkość to wytnę,
- z kolorkami masz bardzo dobry pomysł, zrobię.

192

(206 odpowiedzi, napisanych Oprogramowanie / Software)

Cezary,
zerknij proszę i napisz jak to widzisz.

#!/bin/sh
#
# sysinfo.sh dla OpenWRT AA Cezary Jackiewicz 2013
# 
#    1.00    CJ    Pierwsza wersja kodu
#    1.01    RD    Drobna przebudowa
#
. /lib/functions/network.sh

human_readable() {
    if [ $1 -gt 0 ]; then
        echo "$(awk -v n=$1 'BEGIN{for(i=split("B KB MB GB TB PB",suffix);s<1;i--)s=n/(2**(10*i));printf "%.0f%s",s,suffix[i+2]}')"
    else
        echo "0"
    fi
}

device_rx_tx() {
    local RXTX=$(awk -v Device=$1 '$1==Device ":"{printf "%d\t%d",$2,$10}' /proc/net/dev)
    [ "$RXTX" != "" ] && echo "rx:$(human_readable $(echo "$RXTX" | cut -f 1)),tx:$(human_readable $(echo "$RXTX" | cut -f 2))"
}

print_line() {
    printf " | %-60s |\n" "$1"
}

print_horizontal_ruler() {
    echo " ----------------------------------------------------------------"
}

print_machine() {
    local Macine=""
    [ -e /tmp/sysinfo/model ] && Machine=$(cat /tmp/sysinfo/model)
    print_line "Machine: $Machine"
}

print_uptime() {
    local Uptime=$(cut -d. -f1 /proc/uptime)
    local Days=$(expr $Uptime / 60 / 60 / 24)
    local Hours=$(expr $Uptime / 60 / 60 % 24)
    local Minutes=$(expr $Uptime / 60 % 60)
    local Seconds=$(expr $Uptime % 60)
    print_line "Uptime: $(printf "%dd, %02d:%02d:%02d" $Days $Hours $Minutes $Seconds), Now: $(date +"%Y-%m-%d %H:%M:%S")"
}

print_loadavg() {
    local LoadAvg=$(awk '{printf"%s,%s,%s",$1,$2,$3}' /proc/loadavg)
    print_line "Load: $LoadAvg"
}

print_flash() {
    local Flash=$(df -k /overlay | awk '/overlay/{printf "%d\t%d\t%.1f",$4*1024,$2*1024,($2>0)?$4/$2*100:0}')
    local Free=$(echo "$Flash" | cut -f 1)
    local Total=$(echo "$Flash" | cut -f 2)
    local Used=$(echo "$Flash" | cut -f 3)
    print_line "Flash: free: $(human_readable $Free), total: $(human_readable $Total), used: $Used%"
}

print_memory() {
    local Memory=$(awk 'BEGIN{Total=0;Free=0}$1~/^MemTotal:/{Total=$2}$1~/^MemFree:|^Buffers:|^Cached:/{Free+=$2}END{printf"%d\t%d\t%.1f",Free*1024,Total*1024,(Total>0)?(((Total-Free)/Total)*100):0}' /proc/meminfo)
    local Free=$(echo "$Memory" | cut -f 1)
    local Total=$(echo "$Memory" | cut -f 2)
    local Used=$(echo "$Memory" | cut -f 3)
    print_line "Memory: free: $(human_readable $Free), total: $(human_readable $Total), used: $Used%"
}

print_wan() {
    local Device
    local Iface
    local IP
    local Subnet
    local Gateway
    local DNS
    local Protocol
    network_find_wan Device
    if [ "$Device" != "" ]; then
        Iface=$(uci -q -P /var/state get network.$Device.ifname)
        network_get_ipaddr IP $Device
        network_get_subnet Subnet $Device
        network_get_gateway Gateway $Device
        network_get_dnsserver DNS $Device
        Protocol=$(uci -q get network.$Device.proto)
        print_line "WAN: $IP, subnet: $Subnet"
        print_line "gateway: $Gateway, protocol: $Protocol, $(device_rx_tx $Iface)"
        print_line "dns: $DNS"
    fi
    network_find_wan6 Device
    if [ "$Device" != "" ]; then
        Iface=$(uci -q -P /var/state get network.$Device.ifname)
        network_get_ipaddr6 IP $Device
        network_get_subnet6 Subnet $Device
        network_get_gateway6 Gateway $Device
        network_get_dnsserver DNS $Device
        Protocol=$(uci -q get network.$Device.proto)
        print_line "WAN6: $IP, subnet: $Subnet"
        print_line "gateway: $Gateway, protocol: $Protocol, $(device_rx_tx $Iface)"
        print_line "dns: $DNS"
    fi
}

print_lan() {
    local Device="lan"
    local IP
    local Subnet
    network_get_ipaddr IP $Device
    network_get_subnet Subnet $Device
    print_line "LAN: $IP, subnet: $Subnet"
}

print_wlan() {
    local Iface
    for Iface in $(uci -q show wireless | grep device=radio | cut -f2 -d.); do
        local Device=$(uci -q get wireless.$Iface.device)
        local SSID=$(uci -q get wireless.$Iface.ssid)
        local IfaceDisabled=$(uci -q get wireless.$Iface.disabled)
        local DeviceDisabled=$(uci -q get wireless.$Device.disabled)
        if [ -n "$SSID" ] && [ "$IfaceDisabled" != "1" ] && [ "$DeviceDisabled" != "1" ]; then
            local Mode=$(uci -q -P /var/state get wireless.$Iface.mode)
            local Channel=$(uci -q get wireless.$Device.channel)
            local RadioIface=$(uci -q -P /var/state get wireless.$Iface.ifname)
            local Info
            if [ -n "$RadioIface" ]; then
                if [ "$Mode" == "ap" ]; then
                    Connection="$(iw dev $RadioIface station dump | grep Station | wc -l)"
                else
                    Connection="$(iw dev $RadioIface link | awk 'BEGIN{FS=": ";Signal="";Bitrate=""} $1~/signal/ {Signal=$2} $1~/tx bitrate/ {Bitrate=$2}END{print Signal" "Bitrate}')"
                fi
            fi
            print_line "WLAN: $SSID($Mode), ch: $Channel, conn: $Connection $(device_rx_tx $RadioIface)"
        fi
    done
}

print_vpn() {
    local VPN
    for VPN in $(uci -q show openvpn | grep .ca= | cut -f2 -d.); do
        local Device=$(uci -q get openvpn.$VPN.dev)
        local Enabled=$(uci -q get openvpn.$VPN.enabled)
        if [ "$Enabled" == "1" ] || [ "$Enabled" == "" ]; then
            Mode=$(uci -q get openvpn.$VPN.mode)
            if [ "$Mode" == "server" ]; then
                Mode="$VPN($Mode):$(uci -q get openvpn.$VPN.port)"
                Status=$(uci -q get openvpn.$VPN.status)
                Connection=$(awk 'BEGIN{FS=",";c=0;l=0}{if($1=="Common Name")l=1;else if($1=="ROUTING TABLE")exit;else if (l==1) c=c+1}END{print c}' $Status)
            else
                Mode="$VPN(client)"
                Connection="Down"
                ifconfig $Device &>/dev/null && Connection="Up"
            fi
            print_line "VPN: $Mode, conn: $Connection, $(device_rx_tx $Device)"
        fi
    done
}

print_machine
print_uptime
print_loadavg
print_flash
print_memory
print_wan
print_lan
print_wlan
print_vpn
print_horizontal_ruler
exit 0

193

(206 odpowiedzi, napisanych Oprogramowanie / Software)

Cezary napisał/a:

Tylko robi się mały problem. W założeniu miał być to mały szybki status systemu, a apetyt rośnie smile

Jak prowokujesz fajnym pomysłem,  to się później nie dziw ze apetyt rośnie. Cos za cos;-)

194

(206 odpowiedzi, napisanych Oprogramowanie / Software)

Fajny pomysł

195

(206 odpowiedzi, napisanych Oprogramowanie / Software)

Witam,
Cezary nie wiem, kto jest autorem skryptu sysinfo.sh więc kieruję to do Ciebie.

Pozwoliłem sobie na małą modyfikacje tego skryptu:
- zmieniłem wyszukiwanie WAN-u, był na sztywno teraz jest dynamicznie,
- dodałem informacje o DNS-ach i podsieci,
- w WiFi zmieniłem wyświetlanie trybu, dla kilku sta i ap źle pokazywał,
- w WiFi zmieniłem wykrywanie czy włączone jest radio0 na dynamiczne zależne od rzeczywistej ilości interfejsów radio*,
- w WiFi dodałem wykrywanie czy włączony jest konkretny interfejs,
- dodałem sekcję informacji o VPN.

Czy możesz zaktualizować go w Swoich obrazach?

#!/bin/sh
. /lib/functions/network.sh
MACH=""
[ -e /tmp/sysinfo/model ] && MACH=$(cat /tmp/sysinfo/model)

U=$(cut -d. -f1 /proc/uptime)
D=$(expr $U / 60 / 60 / 24)
H=$(expr $U / 60 / 60 % 24)
M=$(expr $U / 60 % 60)
S=$(expr $U % 60)
U=$(printf "%dd, %02d:%02d:%02d" $D $H $M $S)

L=$(awk '{ print $1" "$2" "$3}' /proc/loadavg)

RFS=$(df -h /overlay | awk '/overlay/ {printf "used: %s, total: %s", $3, $2}')

total_mem="$(awk '/^MemTotal:/ {print $2}' /proc/meminfo)"
buffers_mem="$(awk '/^Buffers:/ {print $2}' /proc/meminfo)"
cached_mem="$(awk '/^Cached:/ {print $2}' /proc/meminfo)"
free_mem="$(awk '/^MemFree:/ {print $2}' /proc/meminfo)"
free_mem="$(( ${free_mem} + ${buffers_mem} + ${cached_mem} ))"
MEM=$(echo "free: ""$free_mem""K, total: ""$total_mem""K")

#LAN=$(uci -q get network.lan.ipaddr)
#WAN=$(uci -q -P /var/state get network.wan.ipaddr)
#[ -z "$WAN" ] && WAN=$(ifstatus wan | awk -F\" '/"address"/ {print $4}')
#[ -n "$WAN" ] && WAN="$WAN, proto: "$(uci -q get network.wan.proto)

LAN_DEV="lan"
network_get_ipaddr LAN_IP $LAN_DEV
network_get_subnet LAN_SUBNET $LAN_DEV
network_find_wan WAN_DEV
network_get_ipaddr WAN_IP $WAN_DEV
network_get_subnet WAN_SUBNET $WAN_DEV
network_get_dnsserver WAN_DNS $WAN_DEV
WAN_PROT=$(uci -q get network.$WAN_DEV.proto)

printf " | %-60s |\n" "Machine: $MACH"
printf " | %-60s |\n" "Uptime: $U"
printf " | %-60s |\n" "Load: $L"
printf " | %-60s |\n" "Flash: $RFS"
printf " | %-60s |\n" "Memory: $MEM"
printf " | %-60s |\n" "WAN: $WAN_IP, subnet: $WAN_SUBNET, proto: $WAN_PROT"
printf " | %-60s |\n" "DNS: $WAN_DNS"
printf " | %-60s |\n" "LAN: $LAN_IP, subnet: $LAN_SUBNET"

IFACES=$(uci -q show wireless | grep device=radio | cut -f2 -d.)
for i in $IFACES; do
    SSID=$(uci -q get wireless.$i.ssid)
    DEV=$(uci -q get wireless.$i.device)
    OFF=$(uci -q get wireless.$DEV.disabled)
    OFF2=$(uci -q get wireless.$i.disabled)
    if [ -n "$SSID" ] && [ "$OFF" != "1" ] && [ "$OFF2" != "1" ]; then
        MODE=$(uci -q -P /var/state get wireless.$i.mode)
        RIFACE=$(uci -q -P /var/state get wireless.$i.ifname)
        [ -n "$RIFACE" ] && CNT=$(iw dev $RIFACE station dump | grep Station | wc -l)
        CHANNEL=$(uci -q get wireless.$DEV.channel)
        printf " | %-60s |\n" "WLAN: mode: $MODE, ssid: $SSID, channel: $CHANNEL, conn: $CNT"
    fi
done
VPNS=$(uci -q show openvpn | grep .ca= | cut -f2 -d.)
for VPN in $VPNS; do
    OFF=$(uci -q get openvpn.$VPN.enabled)
    if [ "$OFF" == "1" ] || [ "$OFF" == "" ]; then
        MODE=$(uci -q get openvpn.$VPN.mode)
        STATUS=$(uci -q get openvpn.$VPN.status)
        DEV=$(uci -q get openvpn.$VPN.dev)
        if [ "$MODE" == "server" ]; then
            MODE="$MODE:$(uci -q get openvpn.$VPN.port)"
            CNT=$(cat $STATUS | awk 'BEGIN{FS=",";c=0;l=0}{if($1=="Common Name")l=1;else if($1=="ROUTING TABLE")exit;else if (l==1) c=c+1}END{print c}')

        else
            MODE="client"
            CNT="Down"
            ifconfig $DEV &>/dev/null && CNT="Up"
        fi
        RXTX=$(cat /proc/net/dev | awk -v dev=$DEV 'BEGIN {OFMT = "%.0f";OFS=""}$1==dev ":"{print "Rx:",($2/1024/1024),"M,Tx:",$10/1024/1024,"M"}')
        printf " | %-60s |\n" "VPN: mode: $MODE, dev: $DEV, conn: $CNT, $RXTX"
    fi
    
done
echo " ----------------------------------------------------------------"
exit 0

196

(148 odpowiedzi, napisanych Oprogramowanie / Software)

Ciesze się ze mogłem pomóc.

Powinno działać.

@KMY jestem otwarty na zmiany, proszę wszystkich o testy i informacje w tym wątku, z którymi modemami działa a z którymi nie. Będą kolejne wersje:)

@Cezary, dziękuję za propozycję, zmieniłem skrypt.

Witam,
na pewno spotkaliście się z przypadkiem, gdy interfejsy systemowe modemów podłączonych do routera zmieniają się i np. trudno na pierwszy rzut oka powiedzieć, który to modem schował się pod /dev/ttyUSB02.

Jeżeli w modemach są karty różnych operatorów to problem się komplikuje, bo gdy modem zmieni „miejsce” ustawienia systemu już nie pasują.

Rozwiązaniem jest poniższy skrypt, który automatycznie tworzy aliasy dla każdego modemu.
Jeżeli np. mamy modem E173 o numerze IMEI XXXXXXXXXXXXXXX a w nim kartę SIM o numerze YYYYYYYYYYYYYYYYYYYY a modem ma typowo trzy interfejsy (/dev/ttyUSB0 do /dev/ttyUSB2) to skrypt utworzy sześć aliasów:

dla /dev/ttyUSB0 aliasy /dev/mdmXXXXXXXXXXXXXXXi0 oraz /dev/simYYYYYYYYYYYYYYYYYYYYi0
dla /dev/ttyUSB1 aliasy /dev/mdmXXXXXXXXXXXXXXXi1 oraz /dev/simYYYYYYYYYYYYYYYYYYYYi1
dla /dev/ttyUSB2 aliasy /dev/mdmXXXXXXXXXXXXXXXi2 oraz /dev/simYYYYYYYYYYYYYYYYYYYYi2

W ten oto sposób posługując się aliasem /dev/sim* w konfiguracji uniezależniamy się od tego, w którym modemie znajdzie się karta SIM.
Natomiast posługując się aliasem /dev/mdm* w konfiguracji uniezależniamy się od tego, w które porty zostaną przydzielone modemowi, zawsze to będzie ten sam modem.
Numery interfejsów znajdujące się po znaku "i" w aliasie będą zawsze stałe dla danego modemu.

Wszystko wklejamy do pliku /etc/hotplug.d/usb/90-modem_aliases

#!/bin/sh
# Create alias for modem interface, based on its IMEI and sim ICCID
# Script version 1.03 Rafal Drzymala 2013
#
# Changelog
#     1.00    RD    First stable code
#    1.01    RD    Added additional USB device filter (suggested by Obsy)
#    1.02    RD    Added ICCID decode to readable format
#    1.03    RD    Changed communication with modem
#
# Destination /etc/hotplug.d/usb/90-modem_aliases
#

do_modem_cmd() {
    local Device=$1
    local Cmd=$2
    printf "\nATQ0V1E1\nAT$Cmd\n" >$Device 2>/dev/null
    sleep 1
    awk '
    BEGIN {
        FS="\n";
        RS="\n";
        Step=1;
        Response="";}
    {    if ($1!="") print $1 >>"/tmp/modem_aliases";
        if ($1=="" || substr($1,1,11)=="^")
            {}
        else if ($1=="COMMAND NOT SUPPORT" || $1=="ERROR" || substr($1,1,11)=="+CME ERROR:")
            exit 1
        else if (Step==1 && $1=="OK")
            Step=2
        else if (Step==2 && $1=="AT'$Cmd'") 
            Step=3
        else if (Step==3 && $1!="" && $1!="OK")
            { Step=4; Response=$1 }
        else if (Step==4 && $1=="OK") 
            exit}
    END {
        print Response}' $Device 2>/dev/null
}

get_modem_IMEI() {
    local IMEI=$(do_modem_cmd $1 "+CGSN")
    case "$IMEI" in
    [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]) echo "$IMEI";;
    esac
}

get_sim_ICCID() {
    local ICCID=$(do_modem_cmd $1 "+CRSM=176,12258,0,0,10" | cut -d "," -f 3 | tr -d "\"")
    local ICCID=$(echo "${ICCID:1:1}${ICCID:0:1}${ICCID:3:1}${ICCID:2:1}${ICCID:5:1}"\
"${ICCID:4:1}${ICCID:7:1}${ICCID:6:1}${ICCID:9:1}${ICCID:8:1}${ICCID:11:1}${ICCID:10:1}"\
"${ICCID:13:1}${ICCID:12:1}${ICCID:15:1}${ICCID:14:1}${ICCID:17:1}${ICCID:16:1}${ICCID:19:1}")
    case "$ICCID" in
    [0-9][0-9][0-9][0-9]*) echo "$ICCID";;
    esac
}

create_device_alias() {
    local DevicePath=$1
    local InterfaceAlias=$2
    if [ -L $InterfaceAlias ] && [ $(ls -l $InterfaceAlias | awk '{print $11}') != $DevicePath ]; then
        logger -p user.notice -t $SCR "$DEVICENAME Remove link $InterfaceAlias for device $DevicePath"
        rm -f $InterfaceAlias
    fi
    if [ ! -L $InterfaceAlias ]; then
        logger -p user.notice -t $SCR "$DEVICENAME Create link $InterfaceAlias for device $DevicePath"
        ln -sf $DevicePath $InterfaceAlias
    fi
}

cleanup_devices_aliases() {
    local DeviceInfo
    for DeviceInfo in $(ls -l /dev/*i? | awk '$9!="" && $11!="" {print $9":"$11}'); do
        local InterfaceAlias=$(echo "$DeviceInfo" | cut -d ":" -f 1)
        local DevicePath=$(echo "$DeviceInfo" | cut -d ":" -f 2)
        if [ ! -c $DevicePath ]; then
            logger -p user.notice -t $SCR "$DEVICENAME Remove link $InterfaceAlias for device $DevicePath"
            rm -f $InterfaceAlias
        fi
    done
}

if [ "$HOTPLUG_TYPE" == "usb" ] && [ "$DEVTYPE" == "usb_interface" ]; then
    case "$DEVICENAME" in
    *-*.*:*.*) : ;;
    *-*:*.*) : ;;
    *) exit 0 ;;
    esac
    SCR=$(basename $0)
    if [ "$ACTION" == "add" ]; then
        if [ -e /sys$DEVPATH/*/tty/*/dev ]; then
            local ModemIMEI
            local simICCID
            for InterfaceConfig in /sys$DEVPATH/../*/*/tty/*; do
                local InterfaceNumber=$(cut -d ':' -f 2 $InterfaceConfig/dev)
                if [ "$InterfaceNumber" != "" ]; then
                    local ModemDevice=/dev/$(basename $InterfaceConfig)
                    [ -c $ModemDevice ] && [ "$ModemIMEI" == "" ] && ModemIMEI=$(get_modem_IMEI $ModemDevice)
                    if [ "$ModemIMEI" != "" ]; then
                        local InterfaceAlias=/dev/"mdm"$ModemIMEI"i"$InterfaceNumber
                        create_device_alias $ModemDevice $InterfaceAlias
                    fi
                    [ -c $ModemDevice ] && [ "$simICCID" == "" ] && simICCID=$(get_sim_ICCID $ModemDevice)
                    if [ "$simICCID" != "" ]; then
                        local InterfaceAlias=/dev/"sim"$simICCID"i"$InterfaceNumber
                        create_device_alias $ModemDevice $InterfaceAlias
                    fi
                fi
            done
        fi
    elif [ "$ACTION" == "remove" ]; then
        cleanup_devices_aliases
    fi
fi
#Done

Tu http://eko.one.pl/?p=openwrt-linkidoportowszeregowych także znajdziecie coś na ten temat.

Witam,
pakiet vnstat umożliwia zbieranie informacji o ruchu na wskazanych (w konfiguacji) interfejsach. Pakiet vnstati umożliwia zaś wygenerowanie wykresów z danych zebranych przez vnstat. Tym z Was którzy chcieli by w prosty sposób obejrzeć wszystko przez przeglądarkę polecam skrypt który to automatycznie zrobi.

Do działania wymagane są:
- działające pakiety vnstat i vnstati
- działający serwer WWW np. uhttpd
- poniższy skrypt

Skrypt należy wkleić do pliku /bin/vnstati_make.sh

#!/bin/sh
# Auto-generate vnstat portal.
# Script version 1.00 Rafal Drzymala 2013
#
# Changelog
#    1.00    RD    First stable code
#
VNSTAT_DB=$(awk '{if($1=="DatabaseDir") print substr($2,2,length($2)-2)}' /etc/vnstat.conf)    # db location
VNSTATI_WWW=/www/vnstat                                # vnstati www dir
VNSTATI_OUT=/tmp/vnstat                                  # output images and HTML to here
VNSTATI_BIN=$(which vnstati)                          # which vnstati
VNSTATI_HTML=${VNSTATI_OUT}/index.html                # output HTML file
VNSTATI_CMD="--transparent --noheader --style 1"    # vnstati additional commands
VNSTATI_OUTS="vs d"                                   # what images to generate
#
# h        hours
# d        days
# m        months
# t        top10
# s        summary
# hs    horizontal summary with hours
# vs    vertical summary with hours
# 
[ -d ${VNSTATI_OUT} ] || mkdir -p ${VNSTATI_OUT}
[ -L ${VNSTATI_WWW} ] && [ $(ls -l ${VNSTATI_WWW} | awk '{print $11}') == ${VNSTATI_OUT} ] || rm ${VNSTATI_WWW}
[ -L ${VNSTATI_WWW} ] || ln -s ${VNSTATI_OUT} ${VNSTATI_WWW}
echo "<!DOCTYPE html>">${VNSTATI_HTML}
echo "<HTML>">>${VNSTATI_HTML}
echo "<META HTTP-EQUIV=\"refresh\" CONTENT=\"300\">">>${VNSTATI_HTML}
echo "<META GENERATOR=\"$($VNSTATI_BIN --version)\">">>${VNSTATI_HTML}
echo "<HEAD>">>${VNSTATI_HTML}
echo "<TITLE>vnStat - $(uci get system.@system[0].hostname)</TITLE>">>${VNSTATI_HTML}
echo "</HEAD>">>${VNSTATI_HTML}
echo "<BODY BGCOLOR=\"#F0F0F0\">">>${VNSTATI_HTML}
echo "<FONT FACE=\"Tahoma\">">>${VNSTATI_HTML}
interfaces="$(ls -1 $VNSTAT_DB)"
outputs_count="$(echo \"$VNSTATI_OUTS\"|wc -w)"
if [ -z "$interfaces" ]; then
    echo "<H1>No database found ($VNSTAT_DB), nothing to do.</H1>">>${VNSTATI_HTML}
else
    for interface in $interfaces; do
        iface_jump="$iface_jump <A HREF=\"#$interface\">$interface</A>"
    done
    echo "<TABLE BORDER=\"0\" WIDTH=\"100%\">">>${VNSTATI_HTML}
    for interface in $interfaces; do
        echo "<TR>">>${VNSTATI_HTML}
        echo "<TH COLSPAN=\"$outputs_count\" ALIGN=\"center\" BGCOLOR=\"#DDDDDD\">">>${VNSTATI_HTML}
        echo "<A NAME=\"$interface\">">>${VNSTATI_HTML}
        echo "<DIV>Interface <STRONG>$interface</STRONG></DIV>">>${VNSTATI_HTML}
        echo "</A>">>${VNSTATI_HTML}
        echo "</TH>">>${VNSTATI_HTML}
        echo "</TR>">>${VNSTATI_HTML}
        echo "<TR ALIGN=\"center\" VALIGN=\"top\">">>${VNSTATI_HTML}
        for output in $VNSTATI_OUTS; do
            echo "<TD>">>${VNSTATI_HTML}
            case  $output in
                h) image_type="Hourly";;
                d) image_type="Daily";;
                m) image_type="Monthly";;
                t) image_type="Top 10";;
                s|hs|vs) image_type="Summary";;
                *) image_type="Unknown $output";;
            esac         
            echo "<DIV>$image_type</DIV>">>${VNSTATI_HTML}
            image=vnstat_${interface}_${output}.png
            $VNSTATI_BIN ${VNSTATI_CMD} --dbdir ${VNSTAT_DB} --iface $interface --output ${VNSTATI_OUT}/${image} -${output} 
            echo "<IMG SRC=\"$image\" ALT=\"$interface $image_type\"/>">>${VNSTATI_HTML}
            echo "</TD>">>${VNSTATI_HTML}
        done
        echo "</TR>">>${VNSTATI_HTML}
        echo "<TR>">>${VNSTATI_HTML}
        echo "<TD COLSPAN=\"$outputs_count\" ALIGN=\"center\" BGCOLOR=\"#E9E9E9\">">>${VNSTATI_HTML}
        echo "<DIV>Jump to:$iface_jump</DIV>">>${VNSTATI_HTML}
        echo "</TD>">>${VNSTATI_HTML}
        echo "</TR>">>${VNSTATI_HTML}
        echo "<TR><TD><P><BR></P></TD></TR>">>${VNSTATI_HTML}
    done
    echo "</TABLE>">>${VNSTATI_HTML}
fi
echo "</FONT>">>${VNSTATI_HTML}
echo "</BODY>">>${VNSTATI_HTML}
echo "</HTML>">>${VNSTATI_HTML}
exit 0
# Done

Następnie należy nadać odpowiednie uprawnienia do skryptu, wydając polecenie:

chmod 700 /bin/vnstati_make.sh

Skrypt można uruchamiać cyklicznie przez cron np. co 15 miniut. Edycja:

crontab -e

i dodajemy dwie linie:

*/15 * * * * /usr/bin/vnstat -u
*/15 * * * * /bin/vnstati_make.sh

Jeżeli serwer uhttpd i pakiety vnstat,vnstati nie są jeszcze zainstalowane należy wydać polecenie:

opkg update
opkg install uhttpd vnstat vnstati
/etc/init.d/uhttpd enable
/etc/init.d/uhttpd start
/etc/init.d/vnstat enable
/etc/init.d/vnstat start
 

* oczywiście pakiety te należy skonfigurować według swoich potrzeb.

Aby skrypt zbudował portal od razu należy wydać polecenie:

/bin/vnstati_make.sh

Teraz wystarczy wpisać w przeglądarce adres routera i scieżkę np.:

http://192.168.1.1/vnstat