mirror of
https://github.com/kernelkit/infix.git
synced 2026-08-02 22:03:01 +02:00
The reason for this is: 1) We want to use the same fetch tool for all operational data, to avoid having duplicated xpaths scattered across the repo. 2) We want to call this directly from the CLI, which means it need to be escape safe. A unprivileged user shall be able to use it but not escape into a shell or do other malicious stuff. Signed-off-by: Richard Alpe <richard@bit42.se>
416 lines
7.4 KiB
Bash
416 lines
7.4 KiB
Bash
#!/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 <<EOF
|
|
usage:
|
|
show [opt] cmd
|
|
|
|
options:
|
|
-a Show all, of something
|
|
-f Show full output, not brief port/iface listings
|
|
-h Show this help text
|
|
-n Show output without any footer
|
|
-p Show plain output, no bells or whistles
|
|
|
|
commands:
|
|
dhcp Show DHCP server
|
|
port PORT Show port configuration and link information
|
|
ports Show ports available for bridging
|
|
vlans Show port groups in bridge
|
|
ifaces Show interfaces and their addresses
|
|
fdb Show forwarding database (unicast)
|
|
mdb Show multicast forwarding database
|
|
stp Show spanning tree status
|
|
ip addr Show IPv4 addresses
|
|
route Show routing table
|
|
ipv6 addr Show IPv6 addresses
|
|
route Show routing table
|
|
log [FILE] Show latest entries from syslog, or other FILE
|
|
rmon PORT Show RMON counters for PORT (when applicable)
|
|
system Show OS details
|
|
version Show OS verson
|
|
EOF
|
|
}
|
|
|
|
is_dhcp_running()
|
|
{
|
|
sysrepocfg -X -f json -m infix-dhcp-server | jq -r '
|
|
."infix-dhcp-server:dhcp-server".enabled as $global |
|
|
if ."infix-dhcp-server:dhcp-server".subnet? then
|
|
(."infix-dhcp-server:dhcp-server".subnet[] |
|
|
select(.enabled != false)) |
|
|
if $global != false and . then "true" else "false" end
|
|
else "false" end
|
|
' 2>/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
|