dhcp4d: move http.HandleFunc into logic

This commit is contained in:
Michael Stapelberg 2020-01-31 18:25:02 +01:00
parent 41985d6378
commit 3707ba290c

View File

@ -198,6 +198,57 @@ func loadLeases(h *dhcp4d.Handler, fn string) error {
h.SetLeases(leases) h.SetLeases(leases)
updateNonExpired(leases) updateNonExpired(leases)
return nil
}
var httpListeners = multilisten.NewPool()
func updateListeners() error {
hosts, err := gokrazy.PrivateInterfaceAddrs()
if err != nil {
return err
}
if net1, err := multilisten.IPv6Net1("/perm"); err == nil {
hosts = append(hosts, net1)
}
httpListeners.ListenAndServe(hosts, func(host string) multilisten.Listener {
return &http.Server{Addr: net.JoinHostPort(host, "8067")}
})
return nil
}
func logic() error {
http.Handle("/metrics", promhttp.Handler())
if err := updateListeners(); err != nil {
return err
}
go func() {
ch := make(chan os.Signal, 1)
signal.Notify(ch, syscall.SIGUSR1)
for range ch {
if err := updateListeners(); err != nil {
log.Printf("updateListeners: %v", err)
}
}
}()
if err := os.MkdirAll("/perm/dhcp4d", 0755); err != nil {
return err
}
errs := make(chan error)
ifc, err := net.InterfaceByName(*iface)
if err != nil {
return err
}
handler, err := dhcp4d.NewHandler("/perm", ifc, *iface, nil)
if err != nil {
return err
}
if err := loadLeases(handler, "/perm/dhcp4d/leases.json"); err != nil {
return err
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
host, _, err := net.SplitHostPort(r.RemoteAddr) host, _, err := net.SplitHostPort(r.RemoteAddr)
if err != nil { if err != nil {
@ -259,56 +310,6 @@ func loadLeases(h *dhcp4d.Handler, fn string) error {
} }
}) })
return nil
}
var httpListeners = multilisten.NewPool()
func updateListeners() error {
hosts, err := gokrazy.PrivateInterfaceAddrs()
if err != nil {
return err
}
if net1, err := multilisten.IPv6Net1("/perm"); err == nil {
hosts = append(hosts, net1)
}
httpListeners.ListenAndServe(hosts, func(host string) multilisten.Listener {
return &http.Server{Addr: net.JoinHostPort(host, "8067")}
})
return nil
}
func logic() error {
http.Handle("/metrics", promhttp.Handler())
if err := updateListeners(); err != nil {
return err
}
go func() {
ch := make(chan os.Signal, 1)
signal.Notify(ch, syscall.SIGUSR1)
for range ch {
if err := updateListeners(); err != nil {
log.Printf("updateListeners: %v", err)
}
}
}()
if err := os.MkdirAll("/perm/dhcp4d", 0755); err != nil {
return err
}
errs := make(chan error)
ifc, err := net.InterfaceByName(*iface)
if err != nil {
return err
}
handler, err := dhcp4d.NewHandler("/perm", ifc, *iface, nil)
if err != nil {
return err
}
if err := loadLeases(handler, "/perm/dhcp4d/leases.json"); err != nil {
return err
}
handler.Leases = func(newLeases []*dhcp4d.Lease, latest *dhcp4d.Lease) { handler.Leases = func(newLeases []*dhcp4d.Lease, latest *dhcp4d.Lease) {
leasesMu.Lock() leasesMu.Lock()
defer leasesMu.Unlock() defer leasesMu.Unlock()