#!/bin/sh # Displays basic information about the system # shellcheck disable=SC2048,SC2086 . /etc/os-release bopt="-c" opt="-br" all="" plain="" h1() { STR="$*" if [ -n "$plain" ]; then echo "$STR" | tr '[:lower:]' '[:upper:]' else printf "\033[7m%-${COLUMNS}s\033[0m\n" "$STR" fi } h2() { STR="$*" if [ -n "$plain" ]; then echo "$STR" echo "$STR" | sed 's/./-/g' else printf "\033[1m%-${COLUMNS}s\033[0m\n" "$STR" fi } dm() { if [ -n "$plain" ]; then echo "${*}" else printf "\033[2m%s\033[0m\n" "$*" fi } ul() { if [ -n "$plain" ]; then printf "__%s__" "$*" else printf "\033[4%s\033[0m" "$*" fi } em() { if [ -n "$plain" ]; then printf "**%s**" "$*" else printf "\033[5m%s\033[0m" "$*" fi } usage() { cat </dev/null | grep -q true } dhcp() { if ! is_dhcp_running; then echo "DHCP server not enabled." exit 0 fi case $1 in detail) sysrepocfg -f json -X -d operational -m infix-dhcp-server | \ jq -C . ;; stat*) sysrepocfg -f json -X -d operational -m infix-dhcp-server | \ /usr/libexec/statd/cli-pretty "show-dhcp-server" -s ;; *) sysrepocfg -f json -X -d operational -m infix-dhcp-server | \ /usr/libexec/statd/cli-pretty "show-dhcp-server" ;; esac } # Usage 1: show port eth0 # Usage 2: show port # Usage 3: show ports # # The first show ethtool output for 'eth0' (in this case). The latter # two are the same, showing a summary of all interfaces classified as # access ports. ports() { if [ $# -gt 0 ] && [ -e "/sys/class/net/$1" ]; then for port in $*; do ethtool "$port" done return fi h1 "PORT STATE MAC ADDRESS FLAGS" if grep -q port /etc/iproute2/group; then ip $opt link show group port else ip $opt link show fi if [ -z "$plain" ] && [ -z "$nofoot" ]; then dm "______________________________________________________________________________" dm "Use: '[ip|bridge] --help' and '[ip|bridge] link help' for more details." fi } vlans() { h1 "INTERFACE VLAN FLAGS" bridge $bopt vlan show |tail +2 | awk 'NF { iface=$1; vid=$2; printf("%-16s %4d ", iface, vid); for (i=3; i <= NF; i++) printf("%s ", $i); printf("\n"); }' if [ -z "$plain" ] && [ -z "$nofoot" ]; then dm "______________________________________________________________________________" dm "See: 'bridge --help' and 'bridge vlan help' for more details." fi } ifaces() { if [ -n "$all" ]; then if [ $# -gt 0 ]; then for iface in $*; do ip $opt addr show dev "$iface" done return fi h1 "INTERFACE STATE ADDRESS" ip $opt addr show if [ -z "$plain" ] && [ -z "$nofoot" ]; then dm "______________________________________________________________________________" dm "See: 'ip --help' and 'ip address help' for more details." fi else if [ $# -gt 0 ]; then for iface in $*; do sysrepocfg -f json -X -d operational -x \ "/ietf-interfaces:interfaces/interface[name='$iface']" | \ /usr/libexec/statd/cli-pretty "show-interfaces" -n "$iface" done return fi sysrepocfg -f json -X -d operational -m ietf-interfaces | \ /usr/libexec/statd/cli-pretty "show-interfaces" fi } log() { if [ -n "$1" ] && [ -r "/var/log/$1" ]; then fn="/var/log/$1" else fn="/var/log/syslog" fi less +G $fn } rmon() { if [ -z "$*" ]; then echo "Missing argument, see 'show port' for available interfaces" exit 1 fi for port in $*; do ethtool -S "$port" done if [ -z "$plain" ] && [ -z "$nofoot" ]; then dm "______________________________________________________________________________" dm "See: 'ethtool --help' for more details." fi } rstp() { mstpctl showbridge echo "br0 port info" mstpctl showport br0 } stp() { sysrepocfg -f json -X -d operational -m ietf-interfaces | \ /usr/libexec/statd/cli-pretty "show-bridge-stp" } fdb() { bridge $bopt fdb show } mdb() { bridge $bopt mdb show } routes() { if [ -n "$1" ]; then arg="-i $1" else arg="-i ipv4" fi sysrepocfg -f json -X -d operational -x "/ietf-routing:routing/ribs" | \ /usr/libexec/statd/cli-pretty "show-routing-table" $arg } igmp() { mctl $@ } system() { h1 "SYSTEM INFORMATION" echo "System Name : $(uname -n)" echo "System Variant : $VARIANT" echo "System Description : $PRETTY_NAME" echo "System Contact : $HOME_URL" echo "System Timezone : $(cat /etc/timezone)" echo "System Type : $NAME" echo "System Version : $(cat /etc/version)" echo "System Arch : $(uname -m)" echo "Kernel Version : $(uname -sr)" } version() { cat /etc/version } while [ "$1" != "" ]; do case $1 in -a) all=1 ;; -f) opt="" if [ -n "$plain" ]; then opt="-color=never" bopt="-color=never" fi opt="-d $opt" bopt="-d $bopt" ;; -n) nofoot="yes" ;; -p) plain="yes" opt="$opt -color=never" bopt="$bopt -color=never" ;; -h) usage exit 0 ;; *) break esac shift done if [ -z "$plain" ]; then TTY=$(resize) eval "$TTY" # COLUMS and ROWS should be set on the console, if not, use fallback if [ -z "$COLUMNS" ]; then if command -v tput; then COLUMNS=$(tput cols) else COLUMNS=80 fi fi fi cmd=$1 if [ -n "$cmd" ]; then shift fi case $cmd in help) usage ;; dhcp | dhcp-server) dhcp $* ;; port*) ports $* ;; vlan*) vlans ;; fdb) fdb ;; mdb) mdb ;; ifa*) ifaces $* ;; ip) cmd=$1 shift case $cmd in addr*) all=1 opt="$opt -d" ifaces $* ;; route*) routes ipv4 ;; igmp*) igmp $* ;; *) usage ;; esac ;; ipv6) cmd=$1 shift case $cmd in addr*) ifaces ;; route*) routes ipv6 ;; mld*) igmp $* ;; *) usage ;; esac ;; log) log $1 ;; rmon) rmon $* ;; route*) routes ;; span*) rstp ;; stp*) stp ;; sys*) system ;; ver*) version ;; *) usage exit 1 ;; esac