Allow dumping a list of outstanding invitations.
authorGuus Sliepen <guus@tinc-vpn.org>
Tue, 19 May 2015 22:12:01 +0000 (00:12 +0200)
committerGuus Sliepen <guus@tinc-vpn.org>
Tue, 19 May 2015 22:12:01 +0000 (00:12 +0200)
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.

bash_completion.d/tinc
doc/tinc.8.in
doc/tinc.texi
src/tincctl.c

index 7fdbf209e295c89474b1134b3e9266b1bcaee4f8..48512dd5447167e4cadaad5fbf6b60c88bbee8af 100644 (file)
@@ -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)
index b9bd2d419708dcc2291f55fd4132f8dc02f25ffd..016053b5530c1fc01375680657c10f66319ba8ba 100644 (file)
@@ -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.
index 05760d9909b0f6f14977a4c92f76ed0da1205d29..f386b8352a5a624e8e3032dbd690efeaed196b90 100644 (file)
@@ -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}.
index 8d3d7a58749dab9d5b3fe29f34e7461c92059edb..e0a6086e8f89b9b44f3ce9d328656c16206efb8c 100644 (file)
@@ -1,6 +1,6 @@
 /*
     tincctl.c -- Controlling a running tincd
-    Copyright (C) 2007-2014 Guus Sliepen <guus@tinc-vpn.org>
+    Copyright (C) 2007-2015 Guus Sliepen <guus@tinc-vpn.org>
 
     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;