Files
the-other-dude/poller/internal/device/interfaces.go
Jason Staack b840047e19 feat: The Other Dude v9.0.1 — full-featured email system
ci: add GitHub Pages deployment workflow for docs site

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 19:30:44 -05:00

62 lines
1.6 KiB
Go

// Package device provides RouterOS metric collectors for the poller.
package device
import (
"fmt"
"log/slog"
"strconv"
routeros "github.com/go-routeros/routeros/v3"
)
// InterfaceStats holds the traffic counters for a single RouterOS interface.
type InterfaceStats struct {
Name string `json:"name"`
RxBytes int64 `json:"rx_bytes"`
TxBytes int64 `json:"tx_bytes"`
Running bool `json:"running"`
Type string `json:"type"`
}
// CollectInterfaces queries the RouterOS device for per-interface traffic
// counters via /interface/print.
//
// Returns a slice of InterfaceStats. On error, returns an empty slice and the
// error — the caller decides whether to skip the device or log a warning.
func CollectInterfaces(client *routeros.Client) ([]InterfaceStats, error) {
reply, err := client.Run(
"/interface/print",
"=.proplist=name,rx-byte,tx-byte,running,type",
)
if err != nil {
return nil, fmt.Errorf("running /interface/print: %w", err)
}
stats := make([]InterfaceStats, 0, len(reply.Re))
for _, sentence := range reply.Re {
m := sentence.Map
rxBytes, err := strconv.ParseInt(m["rx-byte"], 10, 64)
if err != nil {
slog.Warn("could not parse rx-byte for interface", "interface", m["name"], "value", m["rx-byte"])
rxBytes = 0
}
txBytes, err := strconv.ParseInt(m["tx-byte"], 10, 64)
if err != nil {
slog.Warn("could not parse tx-byte for interface", "interface", m["name"], "value", m["tx-byte"])
txBytes = 0
}
stats = append(stats, InterfaceStats{
Name: m["name"],
RxBytes: rxBytes,
TxBytes: txBytes,
Running: m["running"] == "true",
Type: m["type"],
})
}
return stats, nil
}