From a717b9bcfbe811787fd6718fb3f8fb3f272bcfb9 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Mon, 3 Dec 2012 13:08:03 +0100 Subject: [PATCH] Add option to dump only a list of reachable nodes. --- bash_completion.d/tinc | 4 ++-- doc/tinc.texi | 3 ++- doc/tincctl.8.in | 3 ++- src/tincctl.c | 23 ++++++++++++++++++++--- 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/bash_completion.d/tinc b/bash_completion.d/tinc index f486f877..dd41874c 100644 --- a/bash_completion.d/tinc +++ b/bash_completion.d/tinc @@ -60,8 +60,8 @@ _tinc() { get|set|add|del) COMPREPLY=( $(compgen -W "${confvars}" -- ${cur}) ) ;; - dump) - COMPREPLY=( $(compgen -W "nodes edges subnets connections graph" -- ${cur}) ) + dump|reachable) + COMPREPLY=( $(compgen -W "reachable nodes edges subnets connections graph" -- ${cur}) ) return 0 ;; esac diff --git a/doc/tinc.texi b/doc/tinc.texi index c0115f40..d4c527fa 100644 --- a/doc/tinc.texi +++ b/doc/tinc.texi @@ -2232,8 +2232,9 @@ Generate public/private keypair of @var{bits} length. If @var{bits} is not speci but will default to the configuration directory (you can use the -c or -n option). -@item dump nodes +@item dump [reachable] nodes Dump a list of all known nodes in the VPN. +If the reachable keyword is used, only lists reachable nodes. @item dump edges Dump a list of all known connections in the VPN. diff --git a/doc/tincctl.8.in b/doc/tincctl.8.in index 821803ae..8fdd2727 100644 --- a/doc/tincctl.8.in +++ b/doc/tincctl.8.in @@ -114,8 +114,9 @@ If is omitted, the default length will be 2048 bits. When saving keys to existing files, tinc will not delete the old keys; you have to remove them manually. -.It dump nodes +.It dump [reachable] nodes Dump a list of all known nodes in the VPN. +If the keyword reachable is used, only lists reachable nodes. .It dump edges Dump a list of all known connections in the VPN. .It dump subnets diff --git a/src/tincctl.c b/src/tincctl.c index 130dddea..dd0bbcc2 100644 --- a/src/tincctl.c +++ b/src/tincctl.c @@ -135,7 +135,7 @@ static void usage(bool status) { " generate-rsa-keys [bits] Generate a new RSA public/private keypair.\n" " generate-ecdsa-keys Generate a new ECDSA public/private keypair.\n" " dump Dump a list of one of the following things:\n" - " nodes - all known nodes in the VPN\n" + " [reachable] nodes - all known nodes in the VPN\n" " edges - all known connections in the VPN\n" " subnets - all known subnets in the VPN\n" " connections - all meta connections with ourself\n" @@ -912,6 +912,19 @@ static int cmd_reload(int argc, char *argv[]) { } static int cmd_dump(int argc, char *argv[]) { + bool only_reachable = false; + + if(argc > 2 && !strcasecmp(argv[1], "reachable")) { + if(strcasecmp(argv[2], "nodes")) { + fprintf(stderr, "`reachable' only supported for nodes.\n"); + usage(true); + return 1; + } + only_reachable = true; + argv++; + argc--; + } + if(argc != 2) { fprintf(stderr, "Invalid number of arguments.\n"); usage(true); @@ -986,8 +999,10 @@ static int cmd_dump(int argc, char *argv[]) { fprintf(stderr, "Unable to parse node dump from tincd: %s\n", line); return 1; } + + memcpy(&status, &status_int, sizeof status); + if(do_graph) { - memcpy(&status, &status_int, sizeof status); const char *color = "black"; if(!strcmp(host, "MYSELF")) color = "green"; @@ -1001,6 +1016,8 @@ static int cmd_dump(int argc, char *argv[]) { color = "green"; printf(" %s [label = \"%s\", color = \"%s\"%s];\n", node, node, color, strcmp(host, "MYSELF") ? "" : ", style = \"filled\""); } else { + if(only_reachable && !status.reachable) + continue; printf("%s at %s port %s cipher %d digest %d maclength %d compression %d options %x status %04x nexthop %s via %s distance %d pmtu %hd (min %hd max %hd)\n", node, host, port, cipher, digest, maclength, compression, options, status_int, nexthop, via, distance, pmtu, minmtu, maxmtu); } @@ -1947,7 +1964,7 @@ static char *complete_command(const char *text, int state) { } static char *complete_dump(const char *text, int state) { - const char *matches[] = {"nodes", "edges", "subnets", "connections", "graph", NULL}; + const char *matches[] = {"reachable", "nodes", "edges", "subnets", "connections", "graph", NULL}; static int i; if(!state) -- 2.20.1