github.com/mem/u-root@v2.0.1-0.20181004165302-9b18b4636a33+incompatible/cmds/ip/ops.go (about)

     1  // Copyright 2012-2017 the u-root Authors. All rights reserved
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package main
     6  
     7  import (
     8  	"fmt"
     9  	"io"
    10  	"math"
    11  	"strings"
    12  
    13  	"github.com/vishvananda/netlink"
    14  )
    15  
    16  func showLinks(w io.Writer, withAddresses bool) error {
    17  	ifaces, err := netlink.LinkList()
    18  	if err != nil {
    19  		return fmt.Errorf("Can't enumerate interfaces? %v", err)
    20  	}
    21  
    22  	for _, v := range ifaces {
    23  		l := v.Attrs()
    24  
    25  		fmt.Fprintf(w, "%d: %s: <%s> mtu %d state %s\n", l.Index, l.Name,
    26  			strings.Replace(strings.ToUpper(fmt.Sprintf("%s", l.Flags)), "|", ",", -1),
    27  			l.MTU, strings.ToUpper(l.OperState.String()))
    28  
    29  		fmt.Fprintf(w, "    link/%s %s\n", l.EncapType, l.HardwareAddr)
    30  
    31  		if withAddresses {
    32  			showLinkAddresses(w, v)
    33  		}
    34  	}
    35  	return nil
    36  }
    37  
    38  func showLinkAddresses(w io.Writer, link netlink.Link) error {
    39  	addrs, err := netlink.AddrList(link, netlink.FAMILY_ALL)
    40  	if err != nil {
    41  		return fmt.Errorf("Can't enumerate addresses: %v", err)
    42  	}
    43  
    44  	for _, addr := range addrs {
    45  
    46  		var inet string
    47  		switch len(addr.IPNet.IP) {
    48  		case 4:
    49  			inet = "inet"
    50  		case 16:
    51  			inet = "inet6"
    52  		default:
    53  			return fmt.Errorf("Can't figure out IP protocol version")
    54  		}
    55  
    56  		fmt.Fprintf(w, "    %s %s", inet, addr.IP)
    57  		if addr.Broadcast != nil {
    58  			fmt.Fprintf(w, " brd %s", addr.Broadcast)
    59  		}
    60  		fmt.Fprintf(w, " scope %s %s\n", addrScopes[netlink.Scope(addr.Scope)], addr.Label)
    61  
    62  		var validLft, preferredLft string
    63  		// TODO: fix vishnavanda/netlink. *Lft should be uint32, not int.
    64  		if uint32(addr.PreferedLft) == math.MaxUint32 {
    65  			preferredLft = "forever"
    66  		} else {
    67  			preferredLft = fmt.Sprintf("%dsec", addr.PreferedLft)
    68  		}
    69  		if uint32(addr.ValidLft) == math.MaxUint32 {
    70  			validLft = "forever"
    71  		} else {
    72  			validLft = fmt.Sprintf("%dsec", addr.ValidLft)
    73  		}
    74  		fmt.Fprintf(w, "       valid_lft %s preferred_lft %s\n", validLft, preferredLft)
    75  	}
    76  	return nil
    77  }