network info (primary I/F) script; with workaround for Debian #798329 and iproute2...
[shellsnippets/shellsnippets.git] / mksh / sysadmin / getnetcfg
1 # From $Id: chktskfn.in 4521 2015-09-08 12:05:45Z tglase $
2 # $MirOS: src/distrib/common/functions,v 1.3 2010/08/26 12:07:40 tg Exp $
3 #-
4 # Copyright (c) 2008, 2010
5 #       Thorsten Glaser <tg@mirbsd.org>
6 # Copyright © 2009, 2010, 2011, 2014, 2015
7 #       Thorsten Glaser <t.glaser@tarent.de>
8 #
9 # Provided that these terms and disclaimer and all copyright notices
10 # are retained or reproduced in an accompanying document, permission
11 # is granted to deal in this work without restriction, including un-
12 # limited rights to use, publicly perform, distribute, sell, modify,
13 # merge, give away, or sublicence.
14 #
15 # This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
16 # the utmost extent permitted by applicable law, neither express nor
17 # implied; without malicious intent or gross negligence. In no event
18 # may a licensor, author or contributor be held liable for indirect,
19 # direct, other damage, loss, or other issues arising in any way out
20 # of dealing in the work, even if advised of the possibility of such
21 # damage or existence of a defect, except proven that it results out
22 # of said person's immediate fault when using the work as intended.
23
24 export LC_ALL=C PATH=/bin:/sbin:/usr/bin:/usr/sbin
25 unset LANGUAGE
26
27 hn=$(hostname -f || echo $(hostname).invalid.fqdn)
28 [[ $hn = *.* ]] || hn=$hn.no.fqdn
29
30 lladdr=
31 test -s /etc/tarent/primary.mac && lladdr=$(cat /etc/tarent/primary.mac)
32 test -n "$lladdr" || lladdr=$(tgetif | \
33     sed -ne '/^ *ether \([0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]\)\( .*\)$/s//\1/p' -e '2,$d' -e '/^.* HWaddr \([0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]\)\( .*\)$/s//\1/p' | head -n 1)
34 ipaddr=$(tgetif | sed -n '/^ *inet \(addr:\)*\([0-9.]*\) .*$/s//\2/p')
35 netconf=$(/sbin/ip a | tr '\n' '~' | sed 's/~ /= /g' | tr '~' '\n' | fgrep -v vnet | tr '=' '\n' | sed -ne '/^[0-9]*: \([^:@]*\)\(@NONE\)*\([^:]*\):.*$/s//\1\3/p' -e '/inet/s/ scope.*//p' -e '/ link/s/ brd.*$//p'
36     ) || netconf=
37
38 function wid {
39         typeset -Uu c
40         local line=$1
41         set -U
42
43         c=${%line}
44         (( c = c == -1 ? ${#line} : c ))
45         REPLY=$c
46 }
47
48 function maxwidth {
49         typeset -Ui w=0 c
50         local line
51         set -U
52
53         while IFS= read -r line; do
54                 c=${%line}
55                 (( c = c == -1 ? ${#line} : c ))
56                 (( w = c > w ? c : w ))
57         done
58
59         print $w
60 }
61
62 function pad {
63         typeset -Ui to=$2 from=${3:-0}
64
65         while (( from++ < to )); do
66                 REPLY+=$1
67         done
68 }
69
70 hs="Hostname   : $hn"; hw=${|wid "$hs";}
71 ls="MAC address: $lladdr"; lw=${|wid "$ls";}
72 is="IP address : $ipaddr"; iw=${|wid "$is";}
73 typeset -Ui maxw=$( {
74                 print -r -- "$netconf"
75                 print -r -- "$hs"
76                 print -r -- "$ls"
77         } | maxwidth)
78 (( maxw = maxw < 40 ? 40 : maxw ))
79
80 print -r -- "┌──┤ Network configuration ├${|pad ─ $maxw 26;}─┐"
81 print -r -- "│ $hs${|pad ' ' $maxw $hw;} │"
82 print -r -- "│ $is${|pad ' ' $maxw $iw;} │"
83 print -r -- "│ $ls${|pad ' ' $maxw $lw;} │"
84 print -r -- "│ ${|pad ' ' $maxw;} │"
85 print -r -- "$netconf" |&
86 while IFS= read -pr line; do
87         xw=${|wid "$line";}
88         print -r -- "│ $line${|pad ' ' $maxw $xw;} │"
89 done
90 print -r -- "└─${|pad ─ $maxw;}─┘"