From: Guus Sliepen Date: Tue, 19 May 2015 22:12:01 +0000 (+0200) Subject: Allow dumping a list of outstanding invitations. X-Git-Tag: release-1.1pre12~139 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=58e8f598f38dbb2f210d8a62c8fb4b46513dc39f;p=oweals%2Ftinc.git Allow dumping a list of outstanding invitations. This dumps the name of the invitation file, as well as the name of the node that is being invited. This can make it easier to find the invitation file belonging to a given node. --- diff --git a/bash_completion.d/tinc b/bash_completion.d/tinc index 7fdbf20..48512dd 100644 --- a/bash_completion.d/tinc +++ b/bash_completion.d/tinc @@ -58,7 +58,7 @@ _tinc() { return 0 ;; dump|list|reachable) - COMPREPLY=( $(compgen -W "reachable nodes edges subnets connections graph" -- ${cur}) ) + COMPREPLY=( $(compgen -W "reachable nodes edges subnets connections graph invitations" -- ${cur}) ) return 0 ;; network) diff --git a/doc/tinc.8.in b/doc/tinc.8.in index b9bd2d4..016053b 100644 --- a/doc/tinc.8.in +++ b/doc/tinc.8.in @@ -172,6 +172,9 @@ format. Nodes are colored according to their reachability: red nodes are unreachable, orange nodes are indirectly reachable, green nodes are directly reachable. Black nodes are either directly or indirectly reachable, but direct reachability has not been tried yet. +.It dump invitations +Dump a list of outstanding invitations. +The filename of the invitation, as well as the name of the node that is being invited is shown for each invitation. .It info Ar node | subnet | address Show information about a particular node, subnet or address. If an address is given, any matching subnet will be shown. diff --git a/doc/tinc.texi b/doc/tinc.texi index 05760d9..f386b83 100644 --- a/doc/tinc.texi +++ b/doc/tinc.texi @@ -2408,6 +2408,10 @@ Nodes are colored according to their reachability: red nodes are unreachable, orange nodes are indirectly reachable, green nodes are directly reachable. Black nodes are either directly or indirectly reachable, but direct reachability has not been tried yet. +@item dump invitations +Dump a list of outstanding invitations. +The filename of the invitation, as well as the name of the node that is being invited is shown for each invitation. + @cindex info @item info @var{node} | @var{subnet} | @var{address} Show information about a particular @var{node}, @var{subnet} or @var{address}. diff --git a/src/tincctl.c b/src/tincctl.c index 8d3d7a5..e0a6086 100644 --- a/src/tincctl.c +++ b/src/tincctl.c @@ -1,6 +1,6 @@ /* tincctl.c -- Controlling a running tincd - Copyright (C) 2007-2014 Guus Sliepen + Copyright (C) 2007-2015 Guus Sliepen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -134,6 +134,7 @@ static void usage(bool status) { " subnets - all known subnets in the VPN\n" " connections - all meta connections with ourself\n" " [di]graph - graph of the VPN in dotty format\n" + " invitations - outstanding invitations\n" " info NODE|SUBNET|ADDRESS Give information about a particular NODE, SUBNET or ADDRESS.\n" " purge Purge unreachable nodes\n" " debug N Set debug level\n" @@ -943,6 +944,65 @@ static int cmd_reload(int argc, char *argv[]) { } +static int dump_invitations(void) { + char dname[PATH_MAX]; + snprintf(dname, sizeof dname, "%s" SLASH "invitations", confbase); + DIR *dir = opendir(dname); + if(!dir) { + if(errno == ENOENT) { + fprintf(stderr, "No outstanding invitations.\n"); + return 0; + } + + fprintf(stderr, "Cannot not read directory %s: %s\n", dname, strerror(errno)); + return 1; + } + + struct dirent *ent; + bool found = false; + + while((ent = readdir(dir))) { + char buf[MAX_STRING_SIZE]; + if(b64decode(ent->d_name, buf, 24) != 18) + continue; + + char fname[PATH_MAX]; + snprintf(fname, sizeof fname, "%s" SLASH "%s", dname, ent->d_name); + FILE *f = fopen(fname, "r"); + if(!f) { + fprintf(stderr, "Cannot open %s: %s\n", fname, strerror(errno)); + fclose(f); + continue; + } + + buf[0] = 0; + if(!fgets(buf, sizeof buf, f)) { + fprintf(stderr, "Invalid invitation file %s", fname); + fclose(f); + continue; + } + fclose(f); + + char *eol = buf + strlen(buf); + while(strchr("\t \r\n", *--eol)) + *eol = 0; + if(strncmp(buf, "Name = ", 7) || !check_id(buf + 7)) { + fprintf(stderr, "Invalid invitation file %s", fname); + continue; + } + + found = true; + printf("%s %s\n", ent->d_name, buf + 7); + } + + closedir(dir); + + if(!found) + fprintf(stderr, "No outstanding invitations.\n"); + + return 0; +} + static int cmd_dump(int argc, char *argv[]) { bool only_reachable = false; @@ -963,6 +1023,9 @@ static int cmd_dump(int argc, char *argv[]) { return 1; } + if(!strcasecmp(argv[1], "invitations")) + return dump_invitations(); + if(!connect_tincd(true)) return 1;