Skip to content
Snippets Groups Projects
netboxManager.go 12.2 KiB
Newer Older
  • Learn to ignore specific revisions
  • package netboxManager
    
    import (
    	"bytes"
    	"encoding/json"
    	"flag"
    	"io"
    	"log"
    	"net/http"
    	"os"
    	"strconv"
    
    	"code.fbi.h-da.de/danet/gosdn/api/go/gosdn/networkelement"
    	"code.fbi.h-da.de/danet/gosdn/applications/inventory-manager-netbox/config"
    	"gopkg.in/yaml.v3"
    )
    
    func gehMirNichtAufdenSack() {
    	var device map[string]interface{}
    	device = createDevice()
    	log.Printf("Irgendwas:  %v", device)
    	device = createDeviceWithParameter("name", "deviceTypeID", "deviceRoleID", "siteID", "serial", "description", "active")
    	log.Printf("Irgendwas:  %v", device)
    	device = createTag()
    	log.Printf("Irgendwas:  %v", device)
    	device = createTagWithParameter("name", "slug", "description")
    	log.Printf("Irgendwas:  %v", device)
    	device = createModultyp("10")
    	log.Printf("Irgendwas:  %v", device)
    	device = createModultypWithParameter("model", "partNumber", "description", "comments", "manufacturerID")
    	log.Printf("Irgendwas:  %v", device)
    	device = createdeviceType("10")
    	log.Printf("Irgendwas:  %v", device)
    	device = createdeviceTypeWithParameter("manufacturerID", "model", "slug", "1")
    	log.Printf("Irgendwas:  %v", device)
    	device = createManufacturer()
    	log.Printf("Irgendwas:  %v", device)
    	device = createManufacturerWithParameter("name", "slug", "description")
    	log.Printf("Irgendwas:  %v", device)
    	device = createDeviceRole()
    	log.Printf("Irgendwas:  %v", device)
    	device = createDeviceRoleWithParameter("name", "slug", "description", "ff0000", "offline")
    	log.Printf("Irgendwas:  %v", device)
    	device = createSite()
    	log.Printf("Irgendwas:  %v", device)
    	device = createSiteWithParameter("name", "slug", "description", "physicalAddress", "shippingAddress", "comments", "status")
    	log.Printf("%v", device)
    
    }
    
    // create one Device in Netbox with JSON and HTTP
    func Netboxmanager() error {
    	var device map[string]interface{}
    	//gehMirNichtAufdenSack()
    	// Configpfad aus CLI-Flag holen
    	configFileNetbox := flag.String("configNetbox", "config/configNetbox.yaml", "Pfad zur NetBox-Konfigurationsdatei")
    	flag.Parse()
    	log.Printf("Config-Pfad: %s", *configFileNetbox)
    
    	// Datei lesen
    	data, err := os.ReadFile(*configFileNetbox)
    	if err != nil {
    		log.Printf("Fehler beim Lesen der Konfigurationsdatei: %v", err)
    		return err
    	}
    
    	// YAML in Config-Struct einlesen
    	netboxconfig := &config.NetboxConfig{}
    	if err := yaml.Unmarshal(data, netboxconfig); err != nil {
    		log.Printf("Fehler beim Parsen der YAML-Datei: %v", err)
    		return err
    	}
    	log.Printf("Netbox Config Adresse: %v", netboxconfig.NetboxAddress)
    	log.Printf("Netbox Config Token: %v", netboxconfig.ApiToken)
    
    	//Manufacturers Hersteller
    	device = createManufacturerWithParameter("HerstellerName2", "slug2", "description")
    	id, err := Netzworhandling(netboxconfig.NetboxAddress, netboxconfig.ApiToken, "/dcim/manufacturers/", device)
    	if err != nil {
    		log.Printf("Fehler beim erstellen eines Herstellers: %v", err)
    		return err
    	}
    	manufacturerID := id
    	log.Printf("Hersteller erfolgreich erstellt oder gefunden mit der manufacturerID: %d\n", manufacturerID)
    
    	//Device Types Gerätetyp device_type
    	device = createdeviceTypeWithParameter(strconv.FormatInt(manufacturerID, 10), "model5", "slug5", "1")
    	id, err = Netzworhandling(netboxconfig.NetboxAddress, netboxconfig.ApiToken, "/dcim/device-types/", device)
    	if err != nil {
    		log.Printf("Fehler beim erstellen des Gerätetyps: %v", err)
    		return err
    	}
    	deviceTypeID := id
    	log.Printf("Gerätetyp erfolgreich erstellt oder gefunden mit der deviceTypeID: %d\n", deviceTypeID)
    
    
    	//deviceTypeID = 16
    	//log.Printf("Hacki lösung DeviceRoleID manuell ändern: %d\n", deviceTypeID) //TODO
    
    
    	//device-roles	Geräterolle
    	device = createDeviceRoleWithParameter("name2", "slug5", "description", "ff0000", "offline")
    	id, err = Netzworhandling(netboxconfig.NetboxAddress, netboxconfig.ApiToken, "/dcim/device-roles/", device)
    	if err != nil {
    		log.Printf("Fehler beim erstellen der Geräterolle: %v", err)
    		return err
    	}
    	deviceRoleID := id
    	log.Printf("Geräterolle erfolgreich erstellt oder gefunden mit der deviceRoleID: %d\n", deviceRoleID)
    
    	device = createSiteWithParameter("Darmstadt", "darmstadt", "description", "physicalAddress", "shippingAddress", "comments", "active")
    	id, err = Netzworhandling(netboxconfig.NetboxAddress, netboxconfig.ApiToken, "/dcim/sites/", device)
    	if err != nil {
    		log.Printf("Fehler beim erstellen der Geräterolle: %v", err)
    		return err
    	}
    	siteID := id
    	log.Printf("Geräterolle erfolgreich erstellt oder gefunden mit der siteID: %d\n", siteID)
    
    	device = createDeviceWithParameter("name", strconv.FormatInt(deviceTypeID, 10), strconv.FormatInt(deviceRoleID, 10), strconv.FormatInt(siteID, 10), "serial", "description", "active")
    	id, err = Netzworhandling(netboxconfig.NetboxAddress, netboxconfig.ApiToken, "/dcim/devices/", device)
    	if err != nil {
    		log.Printf("Fehler beim erstellen des Gerätes: %v", err)
    		return err
    	}
    	deviceID := id
    	log.Printf("Gerät erfolgreich erstellt oder gefunden mit der deviceID: %d\n", deviceID)
    
    	return nil
    }
    
    func Netzworhandling(netboxURL, apiToken, api string, device map[string]interface{}) (int64, error) {
    	// Ziel-URL vorbereiten
    	url := "http://" + netboxURL + "/api" + api
    	log.Printf("Die URL lautet: %s", url)
    
    	// JSON kodieren
    	body, err := json.Marshal(device)
    	if err != nil {
    
    		log.Fatalf("JSON-Fehler: %v", err)
    
    		return 0, err
    	}
    
    	// HTTP-Request vorbereiten
    	req, err := http.NewRequest("POST", url, bytes.NewReader(body))
    	if err != nil {
    
    		log.Fatalf("Request-Fehler: %v", err)
    
    		return 0, err
    	}
    
    	req.Header.Set("Content-Type", "application/json")
    	req.Header.Set("Authorization", "Token "+apiToken)
    
    	// Request senden
    	resp, err := http.DefaultClient.Do(req)
    	if err != nil {
    
    		log.Fatalf("Sende-Fehler: %v", err)
    
    		return 0, err
    	}
    	defer resp.Body.Close()
    
    	// Überprüfe den Statuscode
    	if resp.StatusCode < 200 || resp.StatusCode >= 300 {
    		bodyBytes, _ := io.ReadAll(resp.Body)
    		log.Printf("HTTP Fehler: %d - %s", resp.StatusCode, string(bodyBytes))
    		//return 0, err
    	}
    
    	// Antwort dekodieren
    	var result map[string]interface{}
    	if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
    		log.Printf("Antwort-Parsing: %v", err)
    		//return 0, err
    	}
    
    	// ID extrahieren
    	if id, ok := result["id"].(float64); ok {
    		return int64(id), nil
    	}
    
    	// Wenn ID fehlt: Fallback → über Gerätename suchen
    	if name, ok := device["name"].(string); ok {
    
    
    		//log.Println("Kein Gerät mit dem Namen gefunden:", name)
    		//log.Println("Keine ID erhalten – versuche bestehendes Gerät mit Namen zu finden:", name)
    
    
    		queryURL := "http://" + netboxURL + "/api" + api + "?name=" + name
    		log.Println("url zum namen suchen lautet: ", queryURL)
    
    		reqGet, err := http.NewRequest("GET", queryURL, nil)
    		if err != nil {
    			log.Printf("GET-Request-Fehler: %v", err)
    			return 0, err
    		}
    		reqGet.Header.Set("Authorization", "Token "+apiToken)
    
    		respGet, err := http.DefaultClient.Do(reqGet)
    		if err != nil {
    			log.Printf("GET-Fehler: %v", err)
    			return 0, err
    		}
    		defer respGet.Body.Close()
    
    		var getResult map[string]interface{}
    		if err := json.NewDecoder(respGet.Body).Decode(&getResult); err != nil {
    			log.Printf("GET-Antwort-Parsing: %v", err)
    			return 0, err
    		}
    
    		if results, ok := getResult["results"].([]interface{}); ok && len(results) > 0 {
    			if first, ok := results[0].(map[string]interface{}); ok {
    				if id, ok := first["id"].(float64); ok {
    					log.Printf("Bestehendes Gerät gefunden mit ID: %d", int64(id))
    					return int64(id), nil
    				}
    			}
    		}
    
    
    		log.Printf("Kein Gerät mit dem Namen gefunden.")
    
    	} else {
    
    		if model, ok := device["model"].(string); ok {
    			//log.Println("Kein Gerät mit dem Model gefunden:", model)
    			//log.Println("Keine ID erhalten – versuche bestehendes Gerät mit Model zu finden:", model)
    
    			queryURL := "http://" + netboxURL + "/api" + api + "?model=" + model
    			log.Println("url zum model suchen lautet: ", queryURL)
    
    			reqGet, err := http.NewRequest("GET", queryURL, nil)
    			if err != nil {
    				log.Printf("GET-Request-Fehler: %v", err)
    				return 0, err
    			}
    			reqGet.Header.Set("Authorization", "Token "+apiToken)
    
    			respGet, err := http.DefaultClient.Do(reqGet)
    			if err != nil {
    				log.Printf("GET-Fehler: %v", err)
    				return 0, err
    			}
    			defer respGet.Body.Close()
    
    			var getResult map[string]interface{}
    			if err := json.NewDecoder(respGet.Body).Decode(&getResult); err != nil {
    				log.Printf("GET-Antwort-Parsing: %v", err)
    				return 0, err
    			}
    
    			if results, ok := getResult["results"].([]interface{}); ok && len(results) > 0 {
    				if first, ok := results[0].(map[string]interface{}); ok {
    					if id, ok := first["id"].(float64); ok {
    						log.Printf("Bestehendes Gerät gefunden mit ID: %d", int64(id))
    						return int64(id), nil
    					}
    				}
    			}
    			log.Printf("Kein Gerät mit dem Model gefunden.")
    		}
    
    	}
    
    	log.Printf("keine ID in Antwort gefunden und kein Gerät per Namen auffindbar")
    	return 0, nil
    }
    
    
    func FeedNetbox(elements *networkelement.GetAllResponse, configPathNetbox *string) error {
    
    	var device map[string]interface{}
    
    	flag.Parse()
    
    
    	log.Printf("Config-Pfad: %s", *configPathNetbox)
    
    
    	// Config Datei lesen
    
    	data, err := os.ReadFile(*configPathNetbox)
    
    	if err != nil {
    		log.Printf("Fehler beim Lesen der Konfigurationsdatei: %v", err)
    		return err
    	}
    
    	// YAML in Config-Struct einlesen
    	netboxconfig := &config.NetboxConfig{}
    	if err := yaml.Unmarshal(data, netboxconfig); err != nil {
    		log.Printf("Fehler beim Parsen der YAML-Datei: %v", err)
    		return err
    	}
    
    	log.Printf("Netbox Config Adresse: %v", netboxconfig.NetboxAddress)
    	log.Printf("Netbox Config Token: %v", netboxconfig.ApiToken)
    
    
    	//Manufacturers Hersteller
    
    	device = createManufacturerWithParameter("Uni Controller", "Uni-Controller", "Die Wichtige große Box. nicht ausschalten")
    
    	id, err := Netzworhandling(netboxconfig.NetboxAddress, netboxconfig.ApiToken, "/dcim/manufacturers/", device)
    	if err != nil {
    		log.Printf("Fehler beim erstellen eines Herstellers: %v", err)
    		return err
    	}
    	manufacturerID := id
    	log.Printf("Hersteller erfolgreich erstellt oder gefunden mit der manufacturerID: %d\n", manufacturerID)
    
    	//Device Types Gerätetyp device_type
    
    	device = createdeviceTypeWithParameter(strconv.FormatInt(manufacturerID, 10), "Main Controller", "Main-Controller", "1")
    
    	id, err = Netzworhandling(netboxconfig.NetboxAddress, netboxconfig.ApiToken, "/dcim/device-types/", device)
    	if err != nil {
    		log.Printf("Fehler beim erstellen des Gerätetyps: %v", err)
    		return err
    	}
    	deviceTypeID := id
    	log.Printf("Gerätetyp erfolgreich erstellt oder gefunden mit der deviceTypeID: %d\n", deviceTypeID)
    
    	//device-roles	Geräterolle
    
    	device = createDeviceRoleWithParameter("Haupt Controller", "Haupt-Controller", "Ganz wichtig Kiste", "ff0000", "offline")
    
    	id, err = Netzworhandling(netboxconfig.NetboxAddress, netboxconfig.ApiToken, "/dcim/device-roles/", device)
    	if err != nil {
    		log.Printf("Fehler beim erstellen der Geräterolle: %v", err)
    		return err
    	}
    	deviceRoleID := id
    	log.Printf("Geräterolle erfolgreich erstellt oder gefunden mit der deviceRoleID: %d\n", deviceRoleID)
    
    
    	device = createSiteWithParameter("Darmstadt V1", "darmstadt-v1", "description", "physicalAddress", "shippingAddress", "comments", "active")
    
    	id, err = Netzworhandling(netboxconfig.NetboxAddress, netboxconfig.ApiToken, "/dcim/sites/", device)
    	if err != nil {
    		log.Printf("Fehler beim erstellen der Geräterolle: %v", err)
    		return err
    	}
    	siteID := id
    	log.Printf("Geräterolle erfolgreich erstellt oder gefunden mit der siteID: %d\n", siteID)
    
    	/*
    		for _, element := range elements.Mne {
    			log.Printf("element.Name: %v", element.Name)
    			log.Printf("element.Id: %v", element.Id)
    			log.Printf("element.Plugin: %v", element.Plugin)
    		}
    	*/
    	log.Printf(" ")
    	log.Printf(" ")
    	if elements != nil {
    		for _, element := range elements.Mne {
    
    
    			//deviceTypeID = 3
    
    			device = createDeviceWithParameter(element.Name, strconv.FormatInt(deviceTypeID, 10), strconv.FormatInt(deviceRoleID, 10), strconv.FormatInt(siteID, 10), element.Id, element.Plugin.String(), "active")
    			id, err = Netzworhandling(netboxconfig.NetboxAddress, netboxconfig.ApiToken, "/dcim/devices/", device)
    			if err != nil {
    				log.Printf("Fehler beim erstellen des Gerätes: %v", err)
    				return err
    			} else {
    
    				log.Printf("Gerät erfolgreich erstellt oder gefunden mit der deviceID: %d\n", id)
    			}
    
    		}
    	} else {
    		log.Fatalf("Der Controller hat keine Daten für mich. Weiter machen Sinnlos^^ elementss ist leer")
    	}
    	return nil
    }