113 lines
2.5 KiB
Go
113 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"html/template"
|
|
"net/http"
|
|
|
|
"git.faercol.me/faercol/topology-map/internal/cache"
|
|
"git.faercol.me/faercol/topology-map/internal/models"
|
|
"git.faercol.me/faercol/topology-map/internal/netbox"
|
|
)
|
|
|
|
const apiKey = "4e75b8927940adc29e2e1eac042bf92bcddd57fe"
|
|
const netboxBaseURL = "https://netbox.internal.faercol.me/api/"
|
|
|
|
func main() {
|
|
|
|
fmt.Println("Initializing data")
|
|
dataCache := cache.NewDataCache()
|
|
netboxClt := netbox.NewClient(netboxBaseURL, apiKey)
|
|
|
|
fmt.Println("Getting devices")
|
|
devices, err := netboxClt.GetDevices()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
for _, d := range devices {
|
|
dataCache.AddDevice(d)
|
|
}
|
|
|
|
fmt.Println("Getting VMs")
|
|
vms, err := netboxClt.GetVMs()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
for _, v := range vms {
|
|
dataCache.AddVM(v)
|
|
}
|
|
|
|
fmt.Println("Getting cables")
|
|
cables, err := netboxClt.GetCables()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
for _, c := range cables {
|
|
dataCache.AddCable(c)
|
|
}
|
|
|
|
fmt.Println("Getting interfaces")
|
|
interfaces, err := netboxClt.GetInterfaces()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
for _, i := range interfaces {
|
|
dataCache.AddInterface(i)
|
|
}
|
|
|
|
fmt.Println("Reconciling data")
|
|
dataCache.ReconcileData()
|
|
fmt.Println("Done")
|
|
|
|
srv := http.NewServeMux()
|
|
|
|
srv.HandleFunc("/static/", func(w http.ResponseWriter, r *http.Request) {
|
|
fmt.Println("Serving static file")
|
|
fs := http.FileServer(http.Dir("./static"))
|
|
http.StripPrefix("/static", fs).ServeHTTP(w, r)
|
|
})
|
|
srv.HandleFunc("/api/data", func(w http.ResponseWriter, r *http.Request) {
|
|
fmt.Println("Serving API route")
|
|
|
|
resp := []models.Element{}
|
|
for _, d := range dataCache.GetDevices() {
|
|
resp = append(resp, d.Element())
|
|
}
|
|
for _, c := range dataCache.GetCables() {
|
|
resp = append(resp, c.Element())
|
|
}
|
|
for _, v := range dataCache.GetVMs() {
|
|
resp = append(resp, v.Elements()...)
|
|
}
|
|
|
|
respBody, err := json.Marshal(resp)
|
|
if err != nil {
|
|
fmt.Printf("Failed to serialize data: %s\n", err)
|
|
w.WriteHeader(500)
|
|
return
|
|
}
|
|
|
|
w.Header().Add("Content-Type", "application/json")
|
|
w.Write(respBody)
|
|
})
|
|
srv.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
|
fmt.Println("Serving main root")
|
|
tpl, err := template.New("index.html").ParseFiles("templates/index.html")
|
|
if err != nil {
|
|
fmt.Printf("Failed to read template: %s\n", err)
|
|
w.WriteHeader(500)
|
|
return
|
|
}
|
|
|
|
if err := tpl.Execute(w, nil); err != nil {
|
|
fmt.Printf("Failed to execute template: %s\n", err)
|
|
w.WriteHeader(500)
|
|
return
|
|
}
|
|
})
|
|
|
|
if err := http.ListenAndServe("0.0.0.0:5000", srv); err != nil {
|
|
panic(err)
|
|
}
|
|
}
|