ASR_BASE

Change-Id: Icf3719cc0afe3eeb3edc7fa80a2eb5199ca9dda1
diff --git a/external/subpack/utils/prometheus-node-exporter-ucode/files/extra/wireguard.uc b/external/subpack/utils/prometheus-node-exporter-ucode/files/extra/wireguard.uc
new file mode 100644
index 0000000..12ae56a
--- /dev/null
+++ b/external/subpack/utils/prometheus-node-exporter-ucode/files/extra/wireguard.uc
@@ -0,0 +1,49 @@
+import { cursor } from "uci";
+
+const x = ubus.call("wireguard", "status");
+if (!x)
+	return false;
+
+const uci = cursor();
+uci.load("network");
+
+let m_wg_iface_info = gauge("wireguard_interface_info");
+let m_wg_peer_info = gauge("wireguard_peer_info");
+let m_wg_handshake = gauge ("wireguard_latest_handshake_seconds");
+let m_wg_rx = gauge ("wireguard_received_bytes_total");
+let m_wg_tx = gauge ("wireguard_sent_bytes_total");
+
+for (let iface in x) {
+	const wc = x[iface];
+
+	m_wg_iface_info({
+		name: iface,
+		public_key: wc["public_key"],
+		listen_port: wc["listen_port"],
+		fwmark: wc["fwmark"] || NaN,
+	}, 1);
+
+	for (let peer in wc["peers"]) {
+		let description;
+		uci.foreach('network', `wireguard_${iface}`, (s) => {
+			if (s.public_key == peer)
+				description = s.description;
+		});
+
+		const pc = wc["peers"][peer];
+
+		m_wg_peer_info({
+			interface: iface,
+			public_key: peer,
+			description,
+			endpoint: pc["endpoint"],
+			persistent_keepalive_interval: pc["persistent_keepalive_interval"] || NaN,
+		}, 1);
+
+		const labels = { public_key: peer };
+
+		m_wg_handshake(labels, pc["last_handshake"]);
+		m_wg_rx(labels, pc["rx_bytes"]);
+		m_wg_tx(labels, pc["tx_bytes"]);
+	}
+}