import json, parseopt, strutils # usage: process_dashboard --nodes=2 --in=node0_dashboard.json --out=all_nodes_dashboard.json var p = initOptParser() nodes: int inputFileName, outputFilename: string while true: p.next() case p.kind: of cmdEnd: break of cmdShortOption, cmdLongOption: if p.key == "nodes": nodes = p.val.parseInt() elif p.key == "in": inputFileName = p.val elif p.key == "out": outputFileName = p.val else: echo "unsupported argument: ", p.key of cmdArgument: echo "unsupported argument: ", p.key var inputData = parseFile(inputFileName) panels = inputData["panels"].copy() numPanels = len(panels) gridHeight = 0 outputData = inputData for panel in panels: if panel["gridPos"]["x"].getInt() == 0: gridHeight += panel["gridPos"]["h"].getInt() outputData["panels"] = %* [] for nodeNum in 0 .. (nodes - 1): var nodePanels = panels.copy() panelIndex = 0 for panel in nodePanels.mitems: panel["title"] = %* replace(panel["title"].getStr(), "#0", "#" & $nodeNum) panel["id"] = %* (panelIndex + (nodeNum * numPanels)) panel["gridPos"]["y"] = %* (panel["gridPos"]["y"].getInt() + (nodeNum * gridHeight)) var targets = panel["targets"] for target in targets.mitems: target["expr"] = %* replace(target["expr"].getStr(), "{node=\"0\"}", "{node=\"" & $nodeNum & "\"}") outputData["panels"].add(panel) panelIndex.inc() outputData["uid"] = %* (outputData["uid"].getStr() & "a") outputData["title"] = %* (outputData["title"].getStr() & " (all nodes)") writeFile(outputFilename, pretty(outputData))