/
graphviz.go
80 lines (69 loc) · 1.93 KB
/
graphviz.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package configviz
import (
"fmt"
"github.com/awalterschulze/gographviz"
"github.com/moul/advanced-ssh-config/pkg/config"
)
func nodename(input string) string {
return fmt.Sprintf(`"%s"`, input)
}
type GraphSettings struct {
ShowIsolatedHosts bool
NoResolveWildcard bool
NoInherits bool
}
func Graph(cfg *config.Config, settings *GraphSettings) (string, error) {
graph := gographviz.NewGraph()
if err := graph.SetName("G"); err != nil {
return "", err
}
if err := graph.SetDir(true); err != nil {
return "", err
}
hostsToShow := map[string]bool{}
for _, host := range cfg.Hosts {
if len(host.Gateways) == 0 && !settings.ShowIsolatedHosts {
continue
}
hostsToShow[nodename(host.Name())] = true
idx := 0
for _, gateway := range host.Gateways {
if gateway == "direct" {
continue
}
if _, found := cfg.Hosts[gateway]; !found {
if settings.NoResolveWildcard {
continue
}
gw := cfg.GetGatewaySafe(gateway)
if gw == nil {
continue
}
if err := graph.AddEdge(nodename(host.Name()), nodename(gw.RawName()), true, map[string]string{"color": "red", "label": nodename(gateway)}); err != nil {
return "", err
}
hostsToShow[nodename(gw.RawName())] = true
continue
}
idx++
hostsToShow[nodename(gateway)] = true
if err := graph.AddEdge(nodename(host.Name()), nodename(gateway), true, map[string]string{"color": "red", "label": fmt.Sprintf("%d", idx)}); err != nil {
return "", err
}
}
if !settings.NoInherits {
for _, inherit := range host.Inherits {
hostsToShow[nodename(inherit)] = true
if err := graph.AddEdge(nodename(host.Name()), nodename(inherit), true, map[string]string{"color": "black", "style": "dashed"}); err != nil {
return "", err
}
}
}
}
for hostname := range hostsToShow {
if err := graph.AddNode("G", hostname, map[string]string{"color": "blue"}); err != nil {
return "", err
}
}
return graph.String(), nil
}