-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwriteGraph.go
81 lines (74 loc) · 2.2 KB
/
writeGraph.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
81
package main
import (
"crypto/sha256"
_ "embed"
"encoding/json"
"fmt"
"os"
"strings"
"text/template"
)
// embed HTML template
var (
//go:embed syncthing-map-template.html
templateContents []byte
)
func writeGraph(dataFilename string, outputFilename string) {
var err error
var data dataJsonT
var mermaidCode []string
dataBytes, err := readFile(dataFilename)
if err != nil {
log.Fatal().Msgf("cannot read %s file: %s", dataFilename, err)
}
err = json.Unmarshal(dataBytes, &data)
if err != nil {
log.Fatal().Msgf("cannot unmarshal %s file: %s", dataFilename, err)
}
// build mermaid.js code
mermaidCode = append(mermaidCode, "flowchart LR")
// get every registered device
for deviceKey, folders := range data {
localDeviceName := strings.Split(deviceKey, " ")[0]
localDeviceId := strings.Split(deviceKey, " ")[1]
for i := range folders {
folders[i].ID = hashData([]string{folders[i].ID, localDeviceId})
}
// container for the device
mermaidCode = append(mermaidCode, fmt.Sprintf("subgraph x%s[\"%s\"]", localDeviceId, localDeviceName))
for _, folder := range folders {
mermaidCode = append(mermaidCode, fmt.Sprintf("%s[\"%s\"]", folder.ID, folder.Label))
}
mermaidCode = append(mermaidCode, "end")
// add shares
for _, folder := range folders {
for _, device := range folder.Device {
// discard path to local device
if device.ID == localDeviceId {
continue
}
mermaidCode = append(mermaidCode, fmt.Sprintf("%s--\"%s %s\"-->x%s", folder.ID, folder.Type, device.Name, device.ID))
}
}
}
// export graph
template, err := template.New("graph").Parse(string(templateContents))
if err != nil {
log.Fatal().Msgf("parse template syncthing-map-template.html: %s", err)
}
// var output io.Writer
f, err := os.Create(outputFilename)
if err != nil {
log.Fatal().Msgf("cannot create %s: %s", outputFilename, err)
}
err = template.Execute(f, strings.Join(mermaidCode, "\n"))
if err != nil {
log.Fatal().Msgf("cannot populate %s with template: %s", outputFilename, err)
}
f.Close()
log.Info().Msgf("wrote %s", outputFilename)
}
func hashData(data []string) string {
hsha2 := sha256.Sum256([]byte(strings.Join(data, " ")))
return fmt.Sprintf("X%x", hsha2)
}