From c0db9f2f14119aa2f77bc118d49b19c828e53009 Mon Sep 17 00:00:00 2001 From: jbergner Date: Fri, 9 May 2025 22:48:51 +0200 Subject: [PATCH] =?UTF-8?q?Anpassungen=20f=C3=BCr=20DHCPv6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.go | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 132 insertions(+), 4 deletions(-) diff --git a/main.go b/main.go index 4cae7ba..b5be5bc 100644 --- a/main.go +++ b/main.go @@ -20,12 +20,14 @@ package main import ( + "encoding/json" "fmt" "html/template" "log" "net" "net/http" "os" + "sort" "strconv" "strings" ) @@ -47,6 +49,7 @@ var ( rangeLimit int singleTemplate *template.Template rangeTemplate *template.Template + dhcpTemplate *template.Template dhcpServer string dhcpScope string dhcpNamePrefix string @@ -71,6 +74,105 @@ type rangeData struct { HaveResult bool } +var DuidHostnameList []payload + +type payload struct { + Hostname string `json:"hostname"` + DUIDs []string `json:"duids"` + IAIDs []uint32 `json:"iaids"` +} + +type payloadHelper struct { + Hostname string + DomainName string + DhcpServer string + DUID string + IAID string + CalculatedIPv4 string + Dhcp4Scope string + CalculatedIPv6 string + Dhcp6Scope string +} + +func octetsRaw(ip string) ([]string, error) { + parts := strings.Split(ip, ".") + if len(parts) != 4 { + return nil, fmt.Errorf("ungültige IPv4-Adresse: %q", ip) + } + return parts, nil +} + +func DhcpHelperFunc(xHostname string, xDUIDs []string, xIAIDs []uint32) []payloadHelper { + /*IPv4*/ + Ipv4Octets, _ := octetsRaw(defaultIP) + + rHostname := []rune(xHostname) + qDUID := xDUIDs[0] + qSegment1 := string(rHostname[2:4]) + qSegment2 := string(rHostname[4:]) + + qCalculatedIPv4 := Ipv4Octets[0] + "." + Ipv4Octets[1] + "." + qSegment1 + "." + qSegment2 + qCalculatedIPv6, _ := embedIPv4(qCalculatedIPv4) + var res []payloadHelper + for _, t := range xIAIDs { + r := payloadHelper{ + Hostname: xHostname, + DUID: qDUID, + CalculatedIPv4: qCalculatedIPv4, + CalculatedIPv6: qCalculatedIPv6, + Dhcp4Scope: dhcpScope, + Dhcp6Scope: ulaPrefix, + DomainName: dhcpDomain, + DhcpServer: dhcpServer, + IAID: fmt.Sprintf("%d", t), + } + res = append(res, r) + } + + return res +} + +func getDhcp() []payloadHelper { + var result []payloadHelper + sortByHostname(DuidHostnameList) + for _, b := range DuidHostnameList { + result = append(result, DhcpHelperFunc(b.Hostname, b.DUIDs, b.IAIDs)...) + } + return result +} + +func register(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + http.Error(w, "nur POST erlaubt", http.StatusMethodNotAllowed) + return + } + var p payload + if err := json.NewDecoder(r.Body).Decode(&p); err != nil { + http.Error(w, "ungültiges JSON", http.StatusBadRequest) + return + } + + // --- hier kannst du speichern, weiterverarbeiten, loggen … --- + log.Printf("neuer Client: %s → DUIDs=%v", p.Hostname, p.DUIDs) + DuidHostnameList = append(DuidHostnameList, p) + + w.WriteHeader(http.StatusNoContent) // 204 +} + +func getdhcp6(w http.ResponseWriter, r *http.Request) { + temp := getDhcp() + + w.Header().Set("Content-Type", "text/html; charset=utf-8") + _ = dhcpTemplate.Execute(w, temp) +} + +func sortByHostname(p []payload) { + sort.Slice(p, func(i, j int) bool { + // Optional: case-insensitiv vergleichen + return strings.ToLower(p[i].Hostname) < strings.ToLower(p[j].Hostname) + }) +} + // --------------------------------------------------------------------------- // main – HTTP routing // --------------------------------------------------------------------------- @@ -80,6 +182,8 @@ func main() { http.HandleFunc("/", handleSingle) http.HandleFunc("/convert", handleSingleConvert) http.HandleFunc("/range", handleRange) + http.HandleFunc("/register", register) + http.HandleFunc("/dhcp6", getdhcp6) log.Printf("Server läuft auf http://localhost%s (Präfix %s, DNS1 %s, DNS2 %s, Limit %d)", listenAddr, ulaPrefix, dns1, dns2, rangeLimit) log.Fatal(http.ListenAndServe(listenAddr, nil)) @@ -132,8 +236,8 @@ func handleRange(w http.ResponseWriter, r *http.Request) { d.Error = err.Error() } else { d.HaveResult = true - for a, b := range rows { - fmt.Println(a, b) + for _, b := range rows { + //fmt.Println(a, b) octets := strings.Split(b.IPv4, ".") if len(octets) != 4 { fmt.Println("Ungültige IP-Adresse!") @@ -262,10 +366,11 @@ func initConfigAndTemplates() { rangeHTML := rangePageHTML singleTemplate = template.Must(template.New("single").Parse(singleHTML)) rangeTemplate = template.Must(template.New("range").Parse(rangeHTML)) + dhcpTemplate = template.Must(template.New("range").Parse(rangeDHCP6HTML)) fmt.Println(ulaPrefix, dns1, dns2, pageIP, dhcpServer, dhcpScope, rangeLimit) - fmt.Println(singleHTML) - fmt.Println(rangeHTML) + //fmt.Println(singleHTML) + //fmt.Println(rangeHTML) } // --------------------------------------------------------------------------- @@ -349,3 +454,26 @@ var rangePageHTML = ` {{end}} {{if .Error}}

Fehler: {{.Error}}

{{end}} ` + +var rangeDHCP6HTML = ` + + + +DHCP-IPv6 + + +

DHCPv6 - DUID-Registrierung

+ + + {{range .}}{{end}} +
HostnameDuidIPv4IPv6DHCP6
{{.Hostname}}{{.DUID}}{{.CalculatedIPv4}}{{.CalculatedIPv6}}Add-DhcpServerv6Reservation -ComputerName {{.DhcpServer}} -Prefix {{.Dhcp6Scope}} -IPAddress {{.CalculatedIPv6}} -ClientDuid {{.DUID}} -Iaid {{.IAID}} -Name {{.Hostname}}.{{.DomainName}} -Description "Auto-reserved after rollout"
+` + +//Add-DhcpServerv6Reservation -ComputerName $Srv -Prefix $Prefix -IPAddress IPv6Address -ClientDuid $l.ClientDuid -Iaid $l.Iaid -Name $l.HostName -Description "Auto-reserved after rollout"