package main import ( "encoding/json" "fmt" "io/ioutil" "net/http" "os" "time" ) type config struct { General struct { InfluxEnabled bool `json:"influx_enabled"` FreifunkInfluxPort string `json:"freifunk_influx_port"` ProxmoxInfluxPort string `json:"proxmox_influx_port"` InfluxURL string `json:"influx_url"` } UISP struct { Enabled bool `json:"enabled"` UnmsAPIURL string `json:"unmsAPIUrl"` APItoken string `json:"APItoken"` DevicesURL string `json:"devicesURL"` RouterURL string `json:"routerURL"` } `json:"unms"` Unifi struct { Enabled bool `json:"enabled"` DisplayUsers bool `json:"displayusers"` APIURL string `json:"APIUrl"` User string `json:"user"` Password string `json:"password"` UCDevicesURL string `json:"ucDevicesURL"` } `json:"unifi"` Meshviewer struct { Enabled bool `json:"enabled"` Files []struct { Name string `json:"name"` URL string `json:"URL"` } `json:"files"` } `json:"meshviewer"` Gateways struct { Enabled bool `json:"enabled"` GatewaysURL string `json:"gatewaysurl"` } `json:"gateways"` } type device struct { Name string `json:"name"` FQDN string `json:"fqdn"` MAC string `json:"mac"` GatewayNexthop string `json:"gateway_nexthop"` LinkedTo string `json:"linked_to"` Gateway string `json:"gateway"` Domain string `json:"domain"` Location struct { Longitude float64 `json:"longitude"` Latitude float64 `json:"latitude"` } `json:"location"` Adresses []string `json:"adresses"` } type devices struct { Devices []device `json:"devices"` } type unifiAPIResponse struct { Identification struct { ID string `json:"id"` MAC string `json:"mac"` Started time.Time `json:"started"` } `json:"identification"` Overview struct { LastSeen time.Time `json:"lastSeen"` CreatedAt time.Time `json:"createdAt"` Status string `json:"status"` } `json:"overview"` } type unifiAPIDetails struct { Identification struct { Name string `json:"name"` Model string `json:"model"` } `json:"identification"` Firmware struct { Current string `json:"current"` } `json:"firmware"` Overview struct { CPU float64 `json:"cpu"` RAM float64 `json:"ram"` } `json:"overview"` IPAddress string `json:"ipAddress"` Location struct { Latitude float64 `json:"latitude"` Longitude float64 `json:"longitude"` Altitude int `json:"altitude"` } `json:"location"` Interfaces []struct { Identification struct { Type string `json:"type"` Name string `json:"name"` Description string `json:"description"` Mac string `json:"mac"` DisplayName string `json:"displayName"` } `json:"identification"` Statistics struct { Rxrate int `json:"rxrate"` Txrate int `json:"txrate"` Rxbytes int64 `json:"rxbytes"` Txbytes int64 `json:"txbytes"` PoePower int `json:"poePower"` Dropped int `json:"dropped"` Errors int `json:"errors"` } `json:"statistics"` } `json:"interfaces"` } type unifiAPIAirmax struct { DeviceIdentification struct { MAC string `json:"mac"` } `json:"deviceidentification"` Statistics struct { LinkScore float64 `json:"linkScore"` } `json:"statistics"` } type link struct { Type string `json:"type"` Source string `json:"source"` Target string `json:"target"` SourceTQ float64 `json:"source_tq"` TargetTQ float64 `json:"target_tq"` SourceAddr string `json:"source_addr"` TargetAddr string `json:"target_addr"` } type node struct { Firstseen string `json:"firstseen"` Lastseen string `json:"lastseen"` IsOnline bool `json:"is_online"` IsGateway bool `json:"is_gateway,omitempty"` Clients int `json:"clients"` ClientsWifi24 int `json:"clients_wifi24"` ClientsWifi5 int `json:"clients_wifi5"` ClientsOther int `json:"clients_other"` RootFSUsage int `json:"rootfs_usage,omitempty"` LoadAVG float64 `json:"loadavg"` MemoryUsage float64 `json:"memory_usage"` Uptime string `json:"uptime"` GatewayNexthop string `json:"gateway_nexthop"` Gateway string `json:"gateway"` Location *struct { Longitude float64 `json:"longitude"` Latitude float64 `json:"latitude"` } `json:"location,omitempty"` NodeID string `json:"node_id"` MAC string `json:"mac"` Adresses []string `json:"addresses"` Domain string `json:"domain"` Hostname string `json:"hostname"` Owner string `json:"owner"` Firmware firmware `json:"firmware"` Autoupdater autoupdater `json:"autoupdater"` NProc int `json:"nproc"` Model string `json:"model"` } type firmware struct { Base string `json:"base"` Release string `json:"release"` } type autoupdater struct { Enabled bool `json:"enabled"` Branch string `json:"branch"` } type output struct { Timestamp string `json:"timestamp"` Nodes []node `json:"nodes"` Links []link `json:"links"` } func (o *output) writeToFile() error { file, err := json.MarshalIndent(o, "", " ") if err != nil { return fmt.Errorf("can't marshal to json: %+v", o) } // write to file if _, err := os.Stat("output"); os.IsNotExist(err) { err = os.Mkdir("output", 0755) if err != nil { return fmt.Errorf("can't create output folder") } } err = ioutil.WriteFile("output/meshviewer.json", file, 0644) if err != nil { return fmt.Errorf("can't write to json file meshviewer.json") } return nil } type ucSite struct { Name string `json:"desc"` ID string `json:"name"` } type ucDevice struct { IP string `json:"ip"` Mac string `json:"mac"` Model string `json:"model"` Version string `json:"version"` Gateway string `json:"gateway_mac"` Name string `json:"name"` State int `json:"state"` LastSeen int `json:"last_seen"` Uptime int `json:"uptime"` Users int `json:"user-wlan-num_sta"` Sysstats struct { CPU string `json:"cpu"` Memory string `json:"mem"` } `json:"system-stats"` } type UnifiAPIData struct { user string pass string baseURL string client *http.Client } type mvDevices struct { Nodes []struct { Firstseen string `json:"firstseen"` Lastseen string `json:"lastseen"` IsOnline bool `json:"is_online"` IsGateway bool `json:"is_gateway"` Clients int `json:"clients"` ClientsWifi24 int `json:"clients_wifi24"` ClientsWifi5 int `json:"clients_wifi5"` ClientsOther int `json:"clients_other"` RootfsUsage float64 `json:"rootfs_usage"` Loadavg float64 `json:"loadavg"` MemoryUsage float64 `json:"memory_usage"` Uptime string `json:"uptime"` GatewayNexthop string `json:"gateway_nexthop,omitempty"` Gateway string `json:"gateway,omitempty"` NodeID string `json:"node_id"` Mac string `json:"mac"` Addresses []string `json:"addresses"` Domain string `json:"domain"` Hostname string `json:"hostname"` Owner string `json:"owner,omitempty"` Location struct { Longitude float64 `json:"longitude"` Latitude float64 `json:"latitude"` } `json:"location,omitempty"` Firmware struct { Base string `json:"base"` Release string `json:"release"` } `json:"firmware"` Autoupdater struct { Enabled bool `json:"enabled"` Branch string `json:"branch"` } `json:"autoupdater,omitempty"` Nproc int `json:"nproc"` Model string `json:"model,omitempty"` } `json:"nodes"` Links []struct { Type string `json:"type"` Source string `json:"source"` Target string `json:"target"` SourceTq float64 `json:"source_tq"` TargetTq float64 `json:"target_tq"` SourceAddr string `json:"source_addr"` TargetAddr string `json:"target_addr"` } `json:"links"` } // switch Unifi AP Mod IDs to Names func lookupModels(model string) string { switch model { case "BZ2", "U2S48", "U2Sv2": return "Unifi AP" case "BZ2LR", "U2L48", "U2Lv2": return "UniFi AP-LR" case "U7E", "U7Ev2": return "UniFi AP-AC" case "U7HD", "U7SHD": return "UniFi AP-HD" case "UXSDM": return "UniFi AP-BaseStationXG" case "UCMSH": return "AP-MeshXG" case "U7MP": return "AP-AC-Mesh-Pro" case "U7LR": return "UniFi AP-AC-LR" case "U7LT": return "UniFi AP-AC-Lite" case "U7P": return "UniFi AP-Pro" case "U7MSH": return "UniFi AP-AC-Mesh" case "U7PG2": return "UniFi AP-AC-Pro" default: return "Unifi Gerät" } } type UNMSLogResponse struct { Items []struct { ID string `json:"id"` StartTime time.Time `json:"startTimestamp"` EndTime time.Time `json:"endTimestamp"` Type string `json:"type"` Site struct { Name string `json:"name"` } `json:"site"` Device struct { ModelName string `json:"modelName"` Name string `json:"name"` DisplayName string `json:"displayName"` } `json:"device"` } `json:"items"` } type XY struct { X int `json:"x"` Y int `json:"y"` } type AvgMax struct { AVG []XY `json:"avg"` MAX []XY `json:"max"` } type UNMSstatistics struct { Period int `json:"period"` Interval struct { Start int `json:"start"` End int `json:"end"` } `json:"interval"` CPU AvgMax `json:"cpu"` RAM AvgMax `json:"ram"` Errors AvgMax `json:"errors"` Interfaces []struct { ID string `json:"id"` Priority int `json:"priority"` Name string `json:"name"` Receive AvgMax `json:"receive"` Transmit AvgMax `json:"transmit"` } `json:"interfaces"` } type UNMSdhcp []struct { Address string `json:"address"` Hostname string `json:"hostname"` Type string `json:"type"` }