läuft
This commit is contained in:
BIN
duidreader.exe
Normal file
BIN
duidreader.exe
Normal file
Binary file not shown.
5
go.mod
Normal file
5
go.mod
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
module git.send.nrw/sendnrw/duidreader
|
||||||
|
|
||||||
|
go 1.23.1
|
||||||
|
|
||||||
|
require golang.org/x/sys v0.33.0
|
2
go.sum
Normal file
2
go.sum
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
|
||||||
|
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
129
main.go
Normal file
129
main.go
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/hex"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io/fs"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"golang.org/x/sys/windows/registry"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ---------- Linux ----------
|
||||||
|
|
||||||
|
func duidsLinux() (map[string][]byte, error) {
|
||||||
|
candidates := []string{
|
||||||
|
"/var/lib/NetworkManager",
|
||||||
|
"/var/lib/dhcp",
|
||||||
|
"/var/lib/systemd/network",
|
||||||
|
"/run/systemd/netif/leases",
|
||||||
|
}
|
||||||
|
out := map[string][]byte{}
|
||||||
|
|
||||||
|
for _, dir := range candidates {
|
||||||
|
_ = filepath.WalkDir(dir, func(path string, d fs.DirEntry, err error) error {
|
||||||
|
if err != nil || d.IsDir() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// lease/duid files are small, read entire file
|
||||||
|
buf, err := os.ReadFile(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
duid := extractDUID(buf)
|
||||||
|
if len(duid) > 0 {
|
||||||
|
out[path] = duid
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if len(out) == 0 {
|
||||||
|
return nil, errors.New("keine DUID-Datei gefunden")
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// very tolerant parser: tries common patterns
|
||||||
|
func extractDUID(b []byte) []byte {
|
||||||
|
// Pattern „default-duid "\x00\x03\x00\x01\xaa…"“
|
||||||
|
if bytes.Contains(b, []byte("default-duid")) || bytes.Contains(b, []byte("dhclient.duid")) {
|
||||||
|
start := bytes.IndexByte(b, '"')
|
||||||
|
end := bytes.LastIndexByte(b, '"')
|
||||||
|
if start >= 0 && end > start {
|
||||||
|
hexEsc := b[start+1 : end]
|
||||||
|
hexEsc = bytes.ReplaceAll(hexEsc, []byte(`\x`), nil)
|
||||||
|
duid, _ := hex.DecodeString(string(hexEsc))
|
||||||
|
return duid
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// systemd-networkd file: plain hex without 0x
|
||||||
|
if allHex(b) {
|
||||||
|
duid, _ := hex.DecodeString(strings.TrimSpace(string(b)))
|
||||||
|
return duid
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func allHex(b []byte) bool {
|
||||||
|
for _, c := range bytes.TrimSpace(b) {
|
||||||
|
if !strings.ContainsRune("0123456789abcdefABCDEF", rune(c)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- Windows ----------
|
||||||
|
|
||||||
|
func duidsWindows() (map[string][]byte, error) {
|
||||||
|
k, err := registry.OpenKey(registry.LOCAL_MACHINE,
|
||||||
|
`SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters`,
|
||||||
|
registry.READ)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer k.Close()
|
||||||
|
|
||||||
|
val, _, err := k.GetBinaryValue("Dhcpv6DUID")
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return map[string][]byte{"registry": val}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- macOS (scutil) ----------
|
||||||
|
// (Beispielskizze – nicht implementiert)
|
||||||
|
// func duidsDarwin() ...
|
||||||
|
|
||||||
|
// ---------- main ----------
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var duids map[string][]byte
|
||||||
|
var err error
|
||||||
|
|
||||||
|
switch runtime.GOOS {
|
||||||
|
case "windows":
|
||||||
|
duids, err = duidsWindows()
|
||||||
|
default: // linux, darwin, ...
|
||||||
|
duids, err = duidsLinux()
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintln(os.Stderr, "Fehler:", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
hostName, _ := os.Hostname()
|
||||||
|
|
||||||
|
for _, d := range duids {
|
||||||
|
fmt.Printf("%s", hex.EncodeToString(d))
|
||||||
|
fmt.Printf("%s", hostName)
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user