Bugfixing UISP 503 Errors.
Finetuning API Calls
This commit is contained in:
		
							parent
							
								
									f9fa5fe26a
								
							
						
					
					
						commit
						ff5cf755aa
					
				@ -5,14 +5,17 @@
 | 
				
			|||||||
        "APItoken": "UNMS API TOKEN",
 | 
					        "APItoken": "UNMS API TOKEN",
 | 
				
			||||||
        "devicesURL": "https://git.freifunk-rhein-sieg.net/Freifunk-Troisdorf/ubnt-freifunk-map-api/raw/branch/master/example.devices.json"
 | 
					        "devicesURL": "https://git.freifunk-rhein-sieg.net/Freifunk-Troisdorf/ubnt-freifunk-map-api/raw/branch/master/example.devices.json"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "unifi": {
 | 
					    "unifi": [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					        "name": "Unifi Freifunk Troisdorf",
 | 
				
			||||||
        "enabled": false,
 | 
					        "enabled": false,
 | 
				
			||||||
        "displayusers": true,
 | 
					        "displayusers": true,
 | 
				
			||||||
        "APIUrl": "https://unifi.freifunk-troisdorf.de",
 | 
					        "APIUrl": "https://unifi.freifunk-troisdorf.de",
 | 
				
			||||||
        "user": "APIuser",
 | 
					        "user": "APIuser",
 | 
				
			||||||
        "password": "PASSWORD",
 | 
					        "password": "PASSWORD",
 | 
				
			||||||
        "ucDevicesURL": "https://git.freifunk-rhein-sieg.net/Freifunk-Troisdorf/ubnt-freifunk-map-api/raw/branch/master/example.ucDevices.json"
 | 
					        "ucDevicesURL": "https://git.freifunk-rhein-sieg.net/Freifunk-Troisdorf/ubnt-freifunk-map-api/raw/branch/master/example.ucDevices.json"
 | 
				
			||||||
    },
 | 
					        }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
    "meshviewer": {
 | 
					    "meshviewer": {
 | 
				
			||||||
        "enabled": false,
 | 
					        "enabled": false,
 | 
				
			||||||
        "files": [
 | 
					        "files": [
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										20
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								main.go
									
									
									
									
									
								
							@ -9,6 +9,7 @@ import (
 | 
				
			|||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
	"net/http/cookiejar"
 | 
						"net/http/cookiejar"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
 | 
						"sync"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	_ "git.nils.zone/nils/prettify"
 | 
						_ "git.nils.zone/nils/prettify"
 | 
				
			||||||
@ -16,14 +17,20 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
	iso8601       = "2006-01-02T15:04:05-0700"
 | 
						iso8601       = "2006-01-02T15:04:05-0700"
 | 
				
			||||||
 | 
						fetchInterval = 1 * time.Minute
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// flags
 | 
					// flags
 | 
				
			||||||
 | 
					var (
 | 
				
			||||||
 | 
						lastFetchTime time.Time
 | 
				
			||||||
 | 
						cacheMutex    sync.Mutex
 | 
				
			||||||
 | 
						cacheNodes    []node
 | 
				
			||||||
 | 
						cacheLinks    []link
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
var configPath = flag.String("configPath", "config.json", "Path to config.json")
 | 
					var configPath = flag.String("configPath", "config.json", "Path to config.json")
 | 
				
			||||||
var version = "development"
 | 
					var version = "development"
 | 
				
			||||||
var delay time.Duration = 60 * time.Second
 | 
					var delay time.Duration = 60 * time.Second
 | 
				
			||||||
var conf = loadconfig(*configPath)
 | 
					var conf = loadconfig(*configPath)
 | 
				
			||||||
var ucDev = getDevices(conf.Unifi.UCDevicesURL)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main() {
 | 
					func main() {
 | 
				
			||||||
	log.Printf("starting version %s...\n", version)
 | 
						log.Printf("starting version %s...\n", version)
 | 
				
			||||||
@ -71,15 +78,20 @@ func processAPIs() error {
 | 
				
			|||||||
		nodes = append(nodes, uispRouters...)
 | 
							nodes = append(nodes, uispRouters...)
 | 
				
			||||||
		links = append(links, uispLinks...)
 | 
							links = append(links, uispLinks...)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if conf.Unifi.Enabled {
 | 
						if len(conf.Unifi) > 0 {
 | 
				
			||||||
		log.Println("Processing Unifi")
 | 
							log.Println("Anazahl der Unifi Server:", len(conf.Unifi))
 | 
				
			||||||
 | 
							for i := range conf.Unifi {
 | 
				
			||||||
 | 
								if conf.Unifi[i].Enabled {
 | 
				
			||||||
 | 
									log.Println("Processing Unifi-Server: ", conf.Unifi[i].Name)
 | 
				
			||||||
				//Process Unifi Nodes
 | 
									//Process Unifi Nodes
 | 
				
			||||||
		unifiNodes, _, err := processUnifiAPI()
 | 
									unifiNodes, _, err := processUnifiAPI(i)
 | 
				
			||||||
				if err != nil {
 | 
									if err != nil {
 | 
				
			||||||
					return err
 | 
										return err
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				nodes = append(nodes, unifiNodes...)
 | 
									nodes = append(nodes, unifiNodes...)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	if conf.Meshviewer.Enabled {
 | 
						if conf.Meshviewer.Enabled {
 | 
				
			||||||
		log.Println("Processing Meshviewer")
 | 
							log.Println("Processing Meshviewer")
 | 
				
			||||||
		mvNodes, mvLinks := getMeshviewer()
 | 
							mvNodes, mvLinks := getMeshviewer()
 | 
				
			||||||
 | 
				
			|||||||
@ -3,6 +3,7 @@ package main
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
	"log"
 | 
						"log"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func getMeshviewerJSON(url string) (mvDevices, error) {
 | 
					func getMeshviewerJSON(url string) (mvDevices, error) {
 | 
				
			||||||
@ -129,17 +130,31 @@ func addmvDevices(d mvDevices) ([]node, []link) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func getMeshviewer() ([]node, []link) {
 | 
					func getMeshviewer() ([]node, []link) {
 | 
				
			||||||
 | 
						cacheMutex.Lock()
 | 
				
			||||||
 | 
						defer cacheMutex.Unlock()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Überprüfen, ob die Daten kürzlich aktualisiert wurden
 | 
				
			||||||
 | 
						if time.Since(lastFetchTime) < fetchInterval {
 | 
				
			||||||
 | 
							return cacheNodes, cacheLinks
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var nodes []node
 | 
						var nodes []node
 | 
				
			||||||
	var links []link
 | 
						var links []link
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for i := range conf.Meshviewer.Files {
 | 
						for i := range conf.Meshviewer.Files {
 | 
				
			||||||
		m, err := getMeshviewerJSON(conf.Meshviewer.Files[i].URL)
 | 
							m, err := getMeshviewerJSON(conf.Meshviewer.Files[i].URL)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nodes, links
 | 
								return cacheNodes, cacheLinks
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		mvNodes, mvLinks := addmvDevices(m)
 | 
							mvNodes, mvLinks := addmvDevices(m)
 | 
				
			||||||
		nodes = append(nodes, mvNodes...)
 | 
							nodes = append(nodes, mvNodes...)
 | 
				
			||||||
		links = append(links, mvLinks...)
 | 
							links = append(links, mvLinks...)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return nodes, links
 | 
					
 | 
				
			||||||
 | 
						// Cache aktualisieren
 | 
				
			||||||
 | 
						cacheNodes = nodes
 | 
				
			||||||
 | 
						cacheLinks = links
 | 
				
			||||||
 | 
						lastFetchTime = time.Now()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return cacheNodes, cacheLinks
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										19
									
								
								types.go
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								types.go
									
									
									
									
									
								
							@ -23,14 +23,7 @@ type config struct {
 | 
				
			|||||||
		DevicesURL string `json:"devicesURL"`
 | 
							DevicesURL string `json:"devicesURL"`
 | 
				
			||||||
		RouterURL  string `json:"routerURL"`
 | 
							RouterURL  string `json:"routerURL"`
 | 
				
			||||||
	} `json:"unms"`
 | 
						} `json:"unms"`
 | 
				
			||||||
	Unifi struct {
 | 
						Unifi      []UnifiServer `json:"unifi"`
 | 
				
			||||||
		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 {
 | 
						Meshviewer struct {
 | 
				
			||||||
		Enabled bool `json:"enabled"`
 | 
							Enabled bool `json:"enabled"`
 | 
				
			||||||
		Files   []struct {
 | 
							Files   []struct {
 | 
				
			||||||
@ -44,6 +37,16 @@ type config struct {
 | 
				
			|||||||
	} `json:"gateways"`
 | 
						} `json:"gateways"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type UnifiServer struct {
 | 
				
			||||||
 | 
						Name         string `json:"name"`
 | 
				
			||||||
 | 
						Enabled      bool   `json:"enabled"`
 | 
				
			||||||
 | 
						DisplayUsers bool   `json:"displayusers"`
 | 
				
			||||||
 | 
						APIURL       string `json:"APIUrl"`
 | 
				
			||||||
 | 
						User         string `json:"user"`
 | 
				
			||||||
 | 
						Password     string `json:"password"`
 | 
				
			||||||
 | 
						UCDevicesURL string `json:"ucDevicesURL"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type device struct {
 | 
					type device struct {
 | 
				
			||||||
	Name           string `json:"name"`
 | 
						Name           string `json:"name"`
 | 
				
			||||||
	FQDN           string `json:"fqdn"`
 | 
						FQDN           string `json:"fqdn"`
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										15
									
								
								unifi.go
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								unifi.go
									
									
									
									
									
								
							@ -15,14 +15,14 @@ import (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Unifi Controller API processing
 | 
					// Unifi Controller API processing
 | 
				
			||||||
func processUnifiAPI() ([]node, []link, error) {
 | 
					func processUnifiAPI(s int) ([]node, []link, error) {
 | 
				
			||||||
	//get list of Unifi devices to display
 | 
						//get list of Unifi devices to display
 | 
				
			||||||
	var nodes []node
 | 
						var nodes []node
 | 
				
			||||||
	var links []link
 | 
						var links []link
 | 
				
			||||||
	d := getDevices(conf.Unifi.UCDevicesURL)
 | 
						d := getDevices(conf.Unifi[s].UCDevicesURL)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	//call Unifi Controller
 | 
						//call Unifi Controller
 | 
				
			||||||
	ucAPI := UnifiNewAPI(conf.Unifi.User, conf.Unifi.Password, conf.Unifi.APIURL)
 | 
						ucAPI := UnifiNewAPI(conf.Unifi[s].User, conf.Unifi[s].Password, conf.Unifi[s].APIURL)
 | 
				
			||||||
	//login
 | 
						//login
 | 
				
			||||||
	if err := ucAPI.ucLogin(); err != nil {
 | 
						if err := ucAPI.ucLogin(); err != nil {
 | 
				
			||||||
		return nil, nil, err
 | 
							return nil, nil, err
 | 
				
			||||||
@ -49,12 +49,14 @@ func processUnifiAPI() ([]node, []link, error) {
 | 
				
			|||||||
				currentJSONDevice = jsonDevice
 | 
									currentJSONDevice = jsonDevice
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if isRemoteMACpublished(jsonDevice.MAC, d.Devices) {
 | 
							if isRemoteMACpublished(jsonDevice.MAC, d.Devices) {
 | 
				
			||||||
			//hier muss gecheckt werden ob der link valide ist
 | 
								//hier muss gecheckt werden ob der link valide ist
 | 
				
			||||||
			if checkMeshviewerLink(jsonDevice.LinkedTo) {
 | 
								if checkMeshviewerLink(jsonDevice.LinkedTo) {
 | 
				
			||||||
				links = UnifiAddLink(jsonDevice, links)
 | 
									links = UnifiAddLink(jsonDevice, links)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		isOnline := currentDevice.State == 1
 | 
							isOnline := currentDevice.State == 1
 | 
				
			||||||
		var load float64
 | 
							var load float64
 | 
				
			||||||
		var mem float64
 | 
							var mem float64
 | 
				
			||||||
@ -78,7 +80,7 @@ func processUnifiAPI() ([]node, []link, error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		var model = lookupModels(currentDevice.Model)
 | 
							var model = lookupModels(currentDevice.Model)
 | 
				
			||||||
		var clients int
 | 
							var clients int
 | 
				
			||||||
		if conf.Unifi.DisplayUsers {
 | 
							if conf.Unifi[s].DisplayUsers {
 | 
				
			||||||
			clients = currentDevice.Users
 | 
								clients = currentDevice.Users
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -130,7 +132,7 @@ func processUnifiAPI() ([]node, []link, error) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// INFLUX STOP
 | 
							// INFLUX STOP
 | 
				
			||||||
 | 
							//log.Println(currentDevice.Mac)
 | 
				
			||||||
		nodes = append(nodes, node{
 | 
							nodes = append(nodes, node{
 | 
				
			||||||
			Firstseen:      "0",
 | 
								Firstseen:      "0",
 | 
				
			||||||
			Lastseen:       time.Unix(int64(currentDevice.LastSeen), 0).Format(iso8601),
 | 
								Lastseen:       time.Unix(int64(currentDevice.LastSeen), 0).Format(iso8601),
 | 
				
			||||||
@ -268,10 +270,13 @@ func UnifiAddLink(dev device, links []link) []link {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func findNodeID(NodeID string) bool {
 | 
					func findNodeID(NodeID string) bool {
 | 
				
			||||||
 | 
						for s := range conf.Unifi {
 | 
				
			||||||
 | 
							ucDev := getDevices(conf.Unifi[s].UCDevicesURL)
 | 
				
			||||||
		for i := range ucDev.Devices {
 | 
							for i := range ucDev.Devices {
 | 
				
			||||||
			if ucDev.Devices[i].GatewayNexthop == NodeID {
 | 
								if ucDev.Devices[i].GatewayNexthop == NodeID {
 | 
				
			||||||
				return true
 | 
									return true
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return false
 | 
						return false
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										8
									
								
								unms.go
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								unms.go
									
									
									
									
									
								
							@ -33,6 +33,7 @@ func processUISPRiFu() ([]node, []link, error) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for i := range d.Devices {
 | 
						for i := range d.Devices {
 | 
				
			||||||
 | 
							time.Sleep(time.Second)
 | 
				
			||||||
		var dev unifiAPIResponse
 | 
							var dev unifiAPIResponse
 | 
				
			||||||
		var currentDevice device
 | 
							var currentDevice device
 | 
				
			||||||
		for j := range u {
 | 
							for j := range u {
 | 
				
			||||||
@ -104,6 +105,7 @@ func processUISPRiFu() ([]node, []link, error) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func processUISPRouter() ([]node, error) {
 | 
					func processUISPRouter() ([]node, error) {
 | 
				
			||||||
 | 
						time.Sleep(time.Second)
 | 
				
			||||||
	// Variables for runtime
 | 
						// Variables for runtime
 | 
				
			||||||
	var nodes []node
 | 
						var nodes []node
 | 
				
			||||||
	d := getDevices(conf.UISP.RouterURL)
 | 
						d := getDevices(conf.UISP.RouterURL)
 | 
				
			||||||
@ -234,11 +236,12 @@ func processUISPRouter() ([]node, error) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func UnmsCallAPI(url string, i any) error {
 | 
					func UnmsCallAPI(url string, i any) error {
 | 
				
			||||||
 | 
						time.Sleep(time.Second)
 | 
				
			||||||
	request, err := http.NewRequest(http.MethodGet, conf.UISP.UnmsAPIURL+url, nil)
 | 
						request, err := http.NewRequest(http.MethodGet, conf.UISP.UnmsAPIURL+url, nil)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return errors.New(fmt.Sprint("can't set request", conf.UISP.UnmsAPIURL+url))
 | 
							return errors.New(fmt.Sprint("can't set request", conf.UISP.UnmsAPIURL+url))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	log.Println(conf.UISP.UnmsAPIURL + url)
 | 
						//log.Println(conf.UISP.UnmsAPIURL + url)
 | 
				
			||||||
	request.Header.Set("x-auth-token", conf.UISP.APItoken)
 | 
						request.Header.Set("x-auth-token", conf.UISP.APItoken)
 | 
				
			||||||
	client := &http.Client{}
 | 
						client := &http.Client{}
 | 
				
			||||||
	response, err := client.Do(request)
 | 
						response, err := client.Do(request)
 | 
				
			||||||
@ -246,7 +249,8 @@ func UnmsCallAPI(url string, i any) error {
 | 
				
			|||||||
		return fmt.Errorf("can't get request %s with x-auth-token %s", conf.UISP.UnmsAPIURL+url, conf.UISP.APItoken)
 | 
							return fmt.Errorf("can't get request %s with x-auth-token %s", conf.UISP.UnmsAPIURL+url, conf.UISP.APItoken)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if response.StatusCode != 200 {
 | 
						if response.StatusCode != 200 {
 | 
				
			||||||
		log.Fatalln("Can't call UNMS API, check token and URL. HTTP Status: ", response.StatusCode)
 | 
							log.Println("Can't call UNMS API, check token and URL. Skipping device. HTTP Status: ", response.StatusCode)
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	data, err := ioutil.ReadAll(response.Body)
 | 
						data, err := ioutil.ReadAll(response.Body)
 | 
				
			||||||
	defer response.Body.Close()
 | 
						defer response.Body.Close()
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user