From 3b0e52fdfe77c6d046c36eaf5dc44dd1ed3bfdfc Mon Sep 17 00:00:00 2001
From: Sebastian Lohff <seba@someserver.de>
Date: Sun, 26 Apr 2020 21:48:45 +0200
Subject: [PATCH] riscli dump-loc-rip: dump v4 and v6 + additional error
 handling (#259)

* riscli dump-loc-rip: Dump IPv4/IPv6 routes

By default riscli dump-loc-rib will now dump IPv4 and IPv6 routes. The
flags -4 and -6 have been added to restrict dumping to a single address
family.

* riscli dump-loc-rip: Handle EOF from API
---
 cmd/riscli/dump_loc_rib.go | 36 ++++++++++++++++++++++++++++++------
 1 file changed, 30 insertions(+), 6 deletions(-)

diff --git a/cmd/riscli/dump_loc_rib.go b/cmd/riscli/dump_loc_rib.go
index f8bff161..50e34670 100644
--- a/cmd/riscli/dump_loc_rib.go
+++ b/cmd/riscli/dump_loc_rib.go
@@ -2,6 +2,8 @@ package main
 
 import (
 	"context"
+	"fmt"
+	"io"
 	"os"
 
 	pb "github.com/bio-routing/bio-rd/cmd/ris/api"
@@ -16,6 +18,10 @@ func NewDumpLocRIBCommand() cli.Command {
 	cmd := cli.Command{
 		Name:  "dump-loc-rib",
 		Usage: "dump loc RIB",
+		Flags: []cli.Flag{
+			&cli.BoolFlag{Name: "4", Usage: "print IPv4 routes"},
+			&cli.BoolFlag{Name: "6", Usage: "print IPv6 routes"},
+		},
 	}
 
 	cmd.Action = func(c *cli.Context) error {
@@ -26,11 +32,26 @@ func NewDumpLocRIBCommand() cli.Command {
 		}
 		defer conn.Close()
 
+		afisafis := make([]pb.DumpRIBRequest_AFISAFI, 0)
+		req_ipv4, req_ipv6 := c.Bool("4"), c.Bool("6")
+		if !req_ipv4 && !req_ipv6 {
+			req_ipv4, req_ipv6 = true, true
+		}
+		if req_ipv4 {
+			afisafis = append(afisafis, pb.DumpRIBRequest_IPv4Unicast)
+		}
+		if req_ipv6 {
+			afisafis = append(afisafis, pb.DumpRIBRequest_IPv6Unicast)
+		}
+
 		client := pb.NewRoutingInformationServiceClient(conn)
-		err = dumpRIB(client, c.GlobalString("router"), c.GlobalUint64("vrf_id"))
-		if err != nil {
-			log.Errorf("DumpRIB failed: %v", err)
-			os.Exit(1)
+		for _, afisafi := range afisafis {
+			fmt.Printf(" --- Dump %s ---\n", pb.DumpRIBRequest_AFISAFI_name[int32(afisafi)])
+			err = dumpRIB(client, c.GlobalString("router"), c.GlobalUint64("vrf_id"), afisafi)
+			if err != nil {
+				log.Errorf("DumpRIB failed: %v", err)
+				os.Exit(1)
+			}
 		}
 
 		return nil
@@ -39,11 +60,11 @@ func NewDumpLocRIBCommand() cli.Command {
 	return cmd
 }
 
-func dumpRIB(c pb.RoutingInformationServiceClient, routerName string, vrfID uint64) error {
+func dumpRIB(c pb.RoutingInformationServiceClient, routerName string, vrfID uint64, afisafi pb.DumpRIBRequest_AFISAFI) error {
 	client, err := c.DumpRIB(context.Background(), &pb.DumpRIBRequest{
 		Router:  routerName,
 		VrfId:   vrfID,
-		Afisafi: pb.DumpRIBRequest_IPv4Unicast,
+		Afisafi: afisafi,
 	})
 	if err != nil {
 		return errors.Wrap(err, "Unable to get client")
@@ -52,6 +73,9 @@ func dumpRIB(c pb.RoutingInformationServiceClient, routerName string, vrfID uint
 	for {
 		r, err := client.Recv()
 		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
 			return errors.Wrap(err, "Received failed")
 		}
 
-- 
GitLab