78 lines
1.8 KiB
Go
78 lines
1.8 KiB
Go
|
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
|
||
|
}
|