2024-09-22 08:27:05 +00:00
|
|
|
package netbox
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"io"
|
|
|
|
"net/http"
|
|
|
|
|
|
|
|
"git.faercol.me/faercol/topology-map/internal/models"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
2024-09-23 11:45:30 +00:00
|
|
|
devicesRoute = "/api/dcim/devices"
|
|
|
|
cablesRoute = "/api/dcim/cables"
|
|
|
|
vmsRoute = "/api/virtualization/virtual-machines"
|
|
|
|
interfaceRoute = "/api/dcim/interfaces"
|
2024-09-22 08:27:05 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type vmsResponse struct {
|
|
|
|
Results []models.VM `json:"results"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type deviceResponse struct {
|
|
|
|
Results []models.Device `json:"results"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type cableResponse struct {
|
|
|
|
Results []models.Cable `json:"results"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type interfaceResponse struct {
|
|
|
|
Results []models.Interface `json:"results"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type NetboxClient struct {
|
|
|
|
httpClt *http.Client
|
|
|
|
netboxBaseURL string
|
|
|
|
netboxToken string
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *NetboxClient) queryAPI(route string) ([]byte, error) {
|
|
|
|
query, err := http.NewRequest("GET", c.netboxBaseURL+route, nil)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
query.Header.Set("Authorization", "Token "+c.netboxToken)
|
|
|
|
|
|
|
|
resp, err := c.httpClt.Do(query)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
respBody, err := io.ReadAll(resp.Body)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return respBody, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *NetboxClient) GetDevices() ([]models.Device, error) {
|
|
|
|
var res deviceResponse
|
|
|
|
|
|
|
|
respBody, err := c.queryAPI(devicesRoute)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := json.Unmarshal(respBody, &res); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return res.Results, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *NetboxClient) GetInterfaces() ([]models.Interface, error) {
|
|
|
|
var res interfaceResponse
|
|
|
|
|
|
|
|
respBody, err := c.queryAPI(interfaceRoute)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := json.Unmarshal(respBody, &res); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return res.Results, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *NetboxClient) GetCables() ([]models.Cable, error) {
|
|
|
|
var res cableResponse
|
|
|
|
|
|
|
|
respBody, err := c.queryAPI(cablesRoute)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := json.Unmarshal(respBody, &res); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return res.Results, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *NetboxClient) GetVMs() ([]models.VM, error) {
|
|
|
|
var res vmsResponse
|
|
|
|
|
|
|
|
respBody, err := c.queryAPI(vmsRoute)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := json.Unmarshal(respBody, &res); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return res.Results, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewClient(baseURL, token string) *NetboxClient {
|
|
|
|
return &NetboxClient{
|
|
|
|
httpClt: http.DefaultClient,
|
|
|
|
netboxBaseURL: baseURL,
|
|
|
|
netboxToken: token,
|
|
|
|
}
|
|
|
|
}
|