opnsense-exporter/opnsense/arp_table.go

78 lines
1.8 KiB
Go
Raw Permalink Normal View History

package opnsense
import (
"strings"
)
type arpSearchResponse struct {
Total int `json:"total"`
RowCount int `json:"rowCount"`
Current int `json:"current"`
Rows []struct {
Mac string `json:"mac"`
IP string `json:"ip"`
Intf string `json:"intf"`
Expired bool `json:"expired"`
Expires int `json:"expires"`
Permanent bool `json:"permanent"`
Type string `json:"type"`
Manufacturer string `json:"manufacturer"`
Hostname string `json:"hostname"`
IntfDescription string `json:"intf_description"`
} `json:"rows"`
}
type Arp struct {
Mac string
IP string
Expired bool
Expires int
Permanent bool
Type string
Hostname string
IntfDescription string
}
type ArpTable struct {
TotalEntries int
Arp []Arp
}
const fetchArpPayload = `{"current":1,"rowCount":-1,"sort":{},"searchPhrase":"","resolve":"no"}`
func (c *Client) FetchArpTable() (ArpTable, *APICallError) {
var resp arpSearchResponse
var arpTable ArpTable
path, ok := c.endpoints["arp"]
if !ok {
return arpTable, &APICallError{
Endpoint: "arp",
Message: "endpoint not found",
StatusCode: 0,
}
}
if err := c.do("POST", path, strings.NewReader(fetchArpPayload), &resp); err != nil {
return arpTable, err
}
for _, arp := range resp.Rows {
a := Arp{
Mac: arp.Mac,
IP: arp.IP,
Expired: arp.Expired,
Expires: arp.Expires,
Permanent: arp.Permanent,
Type: arp.Type,
Hostname: arp.Hostname,
IntfDescription: arp.IntfDescription,
}
arpTable.Arp = append(arpTable.Arp, a)
}
arpTable.TotalEntries = resp.Total
return arpTable, nil
}