From 31fb5b529cecbbf2ebbd9134fc053949b49c4207 Mon Sep 17 00:00:00 2001 From: Denis Krivak Date: Fri, 8 Sep 2023 08:27:03 +0200 Subject: [PATCH] Add LANUserTable metrics. --- api.go | 20 ++++++++++++++++++++ collector.go | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/api.go b/api.go index eb5e5a0..c123433 100644 --- a/api.go +++ b/api.go @@ -17,6 +17,7 @@ const ( // List of XML RPC getter function codes. const ( FnCMSystemInfo = "2" + FnLANUserTable = "123" FnCMState = "136" ) @@ -59,6 +60,25 @@ func (c *CMSystemInfo) UnmarshalXML(d *xml.Decoder, start xml.StartElement) erro return nil } +// LANUserTable is a list of connected devices. +type LANUserTable struct { + Ethernet []LANUserTableClientInfo `xml:"Ethernet"` + WIFI []LANUserTableClientInfo `xml:"WIFI"` +} + +// LANUserTableClientInfo is a device connected to the router. +type LANUserTableClientInfo struct { + Interface string `xml:"interface"` + IPv4Addr string `xml:"IPv4Addr"` + Index string `xml:"index"` + InterfaceID string `xml:"interfaceid"` + Hostname string `xml:"hostname"` + MACAddr string `xml:"MACAddr"` + Method string `xml:"method"` + LeaseTime string `xml:"leaseTime"` + Speed string `xml:"speed"` +} + // CMState shows cable modem state. type CMState struct { TunnerTemperature int `xml:"TunnerTemperature"` diff --git a/collector.go b/collector.go index b01e624..a97f374 100644 --- a/collector.go +++ b/collector.go @@ -43,6 +43,7 @@ func (c *Collector) ServeHTTP(w http.ResponseWriter, r *http.Request) { reg := prometheus.NewRegistry() c.collectCMState(r.Context(), reg, client) c.collectCMSSystemInfo(r.Context(), reg, client) + c.collectLANUserTable(r.Context(), reg, client) h := promhttp.HandlerFor(reg, promhttp.HandlerOpts{}) h.ServeHTTP(w, r) @@ -103,6 +104,50 @@ func (c *Collector) collectCMSSystemInfo( } } +func (c *Collector) collectLANUserTable( + ctx context.Context, + reg *prometheus.Registry, + client *ConnectBox, +) { + clientGauge := prometheus.NewGaugeVec(prometheus.GaugeOpts{ + Name: "connect_box_lan_client", + Help: "cm_docsis_mode.", + }, []string{ + "connection", + "interface", + "ipv4_addr", + "hostname", + "MACAddr", + }) + + reg.MustRegister(clientGauge) + + var data LANUserTable + err := client.GetMetrics(ctx, FnLANUserTable, &data) + if err == nil { + for _, c := range data.Ethernet { + clientGauge.WithLabelValues( + "ethernet", + c.Interface, + c.IPv4Addr, + c.Hostname, + c.MACAddr, + ).Set(1) + } + for _, c := range data.WIFI { + clientGauge.WithLabelValues( + "wifi", + c.Interface, + c.IPv4Addr, + c.Hostname, + c.MACAddr, + ).Set(1) + } + } else { + log.Printf("Failed to get LANUserTable: %v", err) + } +} + func (c *Collector) collectCMState( ctx context.Context, reg *prometheus.Registry,