Added graph dumping ability based on Markus Goetz's patch.
This commit is contained in:
parent
1728d5b2c4
commit
0200d3cd5d
4 changed files with 76 additions and 1 deletions
1
THANKS
1
THANKS
|
@ -18,6 +18,7 @@ We would like to thank the following people for their contributions to tinc:
|
|||
* Mads Kiilerich
|
||||
* Marc A. Lehmann
|
||||
* Mark Glines
|
||||
* Markus Goetz
|
||||
* Martin Kihlgren
|
||||
* Matias Carrasco
|
||||
* Miles Nordin
|
||||
|
|
64
src/graph.c
64
src/graph.c
|
@ -47,6 +47,7 @@
|
|||
#include "system.h"
|
||||
|
||||
#include "avl_tree.h"
|
||||
#include "config.h"
|
||||
#include "connection.h"
|
||||
#include "device.h"
|
||||
#include "edge.h"
|
||||
|
@ -57,6 +58,8 @@
|
|||
#include "subnet.h"
|
||||
#include "utils.h"
|
||||
|
||||
static bool graph_changed = true;
|
||||
|
||||
/* Implementation of Kruskal's algorithm.
|
||||
Running time: O(EN)
|
||||
Please note that sorting on weight is already done by add_edge().
|
||||
|
@ -306,4 +309,65 @@ void graph(void)
|
|||
{
|
||||
mst_kruskal();
|
||||
sssp_bfs();
|
||||
graph_changed = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Dump nodes and edges to a graphviz file.
|
||||
|
||||
The file can be converted to an image with
|
||||
dot -Tpng graph_filename -o image_filename.png -Gconcentrate=true
|
||||
*/
|
||||
|
||||
void dump_graph(void)
|
||||
{
|
||||
avl_node_t *node;
|
||||
node_t *n;
|
||||
edge_t *e;
|
||||
char *filename = NULL, *tmpname = NULL;
|
||||
FILE *file;
|
||||
|
||||
if(!graph_changed || !get_config_string(lookup_config(config_tree, "GraphDumpFile"), &filename))
|
||||
return;
|
||||
|
||||
graph_changed = false;
|
||||
|
||||
ifdebug(PROTOCOL) logger(LOG_NOTICE, "Dumping graph");
|
||||
|
||||
if(filename[0] == '|') {
|
||||
file = popen(filename + 1, "w");
|
||||
} else {
|
||||
asprintf(&tmpname, "%s.new", filename);
|
||||
file = fopen(tmpname, "w");
|
||||
}
|
||||
|
||||
if(!file) {
|
||||
logger(LOG_ERR, "Unable to open graph dump file %s: %s", filename, strerror(errno));
|
||||
free(tmpname);
|
||||
return;
|
||||
}
|
||||
|
||||
fprintf(file, "digraph {\n");
|
||||
|
||||
/* dump all nodes first */
|
||||
for(node = node_tree->head; node; node = node->next) {
|
||||
n = node->data;
|
||||
fprintf(file, " %s [label = \"%s\"];\n", n->name, n->name);
|
||||
}
|
||||
|
||||
/* now dump all edges */
|
||||
for(node = edge_weight_tree->head; node; node = node->next) {
|
||||
e = node->data;
|
||||
fprintf(file, " %s -> %s;\n", e->from->name, e->to->name);
|
||||
}
|
||||
|
||||
fprintf(file, "}\n");
|
||||
|
||||
fclose(file);
|
||||
|
||||
if(filename[0] != '|') {
|
||||
rename(tmpname, filename);
|
||||
free(tmpname);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,5 +26,6 @@
|
|||
extern void graph(void);
|
||||
extern void mst_kruskal(void);
|
||||
extern void sssp_bfs(void);
|
||||
extern void dump_graph(void);
|
||||
|
||||
#endif /* __TINC_GRAPH_H__ */
|
||||
|
|
11
src/net.c
11
src/net.c
|
@ -354,13 +354,15 @@ int main_loop(void)
|
|||
fd_set readset, writeset;
|
||||
struct timeval tv;
|
||||
int r, maxfd;
|
||||
time_t last_ping_check, last_config_check;
|
||||
time_t last_ping_check, last_config_check, last_graph_dump;
|
||||
event_t *event;
|
||||
|
||||
cp();
|
||||
|
||||
last_ping_check = now;
|
||||
last_config_check = now;
|
||||
last_graph_dump = now;
|
||||
|
||||
srand(now);
|
||||
|
||||
running = true;
|
||||
|
@ -478,6 +480,13 @@ int main_loop(void)
|
|||
|
||||
try_outgoing_connections();
|
||||
}
|
||||
|
||||
/* Dump graph if wanted every 60 seconds*/
|
||||
|
||||
if(last_graph_dump + 60 < now) {
|
||||
dump_graph();
|
||||
last_graph_dump = now;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
Loading…
Reference in a new issue