From 4558cb61b48bf84cee2fb721856a78fd3930cad5 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Fri, 31 Jan 2020 18:30:18 +0100 Subject: [PATCH] dhcp4d: serve lease json data at /lease/ --- cmd/dhcp4d/dhcp4d.go | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/cmd/dhcp4d/dhcp4d.go b/cmd/dhcp4d/dhcp4d.go index 69dab3a..88b5039 100644 --- a/cmd/dhcp4d/dhcp4d.go +++ b/cmd/dhcp4d/dhcp4d.go @@ -21,12 +21,14 @@ import ( "flag" "fmt" "html/template" + "io" "io/ioutil" "net" "net/http" "os" "os/signal" "sort" + "strings" "sync" "syscall" "time" @@ -249,6 +251,36 @@ func logic() error { return err } + http.HandleFunc("/lease/", func(w http.ResponseWriter, r *http.Request) { + hostname := strings.TrimPrefix(r.URL.Path, "/lease/") + if hostname == "" { + http.Error(w, "syntax: /lease/", http.StatusBadRequest) + return + } + leasesMu.Lock() + defer leasesMu.Unlock() + var lease *dhcp4d.Lease + for _, l := range leases { + if l.Hostname != hostname { + continue + } + lease = l + break + } + if lease == nil { + http.Error(w, "no lease found", http.StatusNotFound) + return + } + b, err := json.Marshal(lease) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + if _, err := io.Copy(w, bytes.NewReader(b)); err != nil { + log.Printf("/lease/%s: %v", hostname, err) + } + }) + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { host, _, err := net.SplitHostPort(r.RemoteAddr) if err != nil {