Anpassungen für DHCPv6
All checks were successful
release-tag / release-image (push) Successful in 1m51s
All checks were successful
release-tag / release-image (push) Successful in 1m51s
This commit is contained in:
136
main.go
136
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 = `<!DOCTYPE html>
|
||||
{{end}}
|
||||
{{if .Error}}<p style="color:#b00">Fehler: {{.Error}}</p>{{end}}
|
||||
</body></html>`
|
||||
|
||||
var rangeDHCP6HTML = `<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<title>DHCP-IPv6</title>
|
||||
<style>
|
||||
body{font-family:system-ui,sans-serif;margin:2rem}
|
||||
table{border-collapse:collapse;width:100%}
|
||||
th,td{border:1px solid #ccc;padding:.4rem;text-align:left;font-family:monospace}
|
||||
form{display:flex;gap:.5rem;flex-wrap:wrap;margin-bottom:1rem}
|
||||
input[type=text]{padding:.4rem;font-size:1rem;border:1px solid #ccc;border-radius:4px;flex:1}
|
||||
button{padding:.5rem 1rem;font-size:1rem;cursor:pointer;border-radius:4px;border:1px solid #666;background:#eee}
|
||||
</style>
|
||||
</head><body>
|
||||
<h1>DHCPv6 - DUID-Registrierung</h1>
|
||||
<table>
|
||||
<tr><th>Hostname</th><th>Duid</th><th>IPv4</th><th>IPv6</th><th>DHCP6</th></tr>
|
||||
{{range .}}<tr><td>{{.Hostname}}</td><td>{{.DUID}}</td><td>{{.CalculatedIPv4}}</td><td>{{.CalculatedIPv6}}</td><td>Add-DhcpServerv6Reservation -ComputerName {{.DhcpServer}} -Prefix {{.Dhcp6Scope}} -IPAddress {{.CalculatedIPv6}} -ClientDuid {{.DUID}} -Iaid {{.IAID}} -Name {{.Hostname}}.{{.DomainName}} -Description "Auto-reserved after rollout"</td></tr>{{end}}
|
||||
</table>
|
||||
</body></html>`
|
||||
|
||||
//Add-DhcpServerv6Reservation -ComputerName $Srv -Prefix $Prefix -IPAddress IPv6Address -ClientDuid $l.ClientDuid -Iaid $l.Iaid -Name $l.HostName -Description "Auto-reserved after rollout"
|
||||
|
Reference in New Issue
Block a user