Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions dhcp.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,14 @@ func init() {
prometheus.MustRegister(dhcpLeaseTime)
}

func sampleDhcp(iface string, verbose bool) (error, net.IP, int) {
func sampleDhcp(iface string, verbose bool) (net.IP, int, error) {
dhcpRequests.Inc()
client := client.NewClient()
start := time.Now()
conversation, err := client.Exchange(iface)
if err != nil {
dhcpFailures.Inc()
return err, nil, 0
return nil, 0, err
}
dhcpHandshakeLatency.Set(time.Since(start).Seconds())

Expand All @@ -70,5 +70,5 @@ func sampleDhcp(iface string, verbose bool) (error, net.IP, int) {
yourIPAddr = packet.YourIPAddr
}
}
return nil, yourIPAddr, prefixBits
return yourIPAddr, prefixBits, err
}
10 changes: 5 additions & 5 deletions dhcp6.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,19 +39,19 @@ func init() {
prometheus.MustRegister(dhcp6Lifetime)
}

func sampleDhcp6(iface string, verbose bool) (error, net.IP, int) {
func sampleDhcp6(iface string, verbose bool) (net.IP, int, error) {
dhcp6Requests.Inc()
client := client.NewClient()
start := time.Now()
conversation, err := client.Exchange(iface)
if err != nil {
dhcp6Failures.Inc()
return err, nil, 0
return nil, 0, err
}
dhcp6HandshakeLatency.Set(time.Since(start).Seconds())

var yourIPAddr net.IP
var prefixBits int = 128
var prefixBits = 128
for _, packet := range conversation {
if verbose {
fmt.Println(packet.Summary())
Expand All @@ -60,7 +60,7 @@ func sampleDhcp6(iface string, verbose bool) (error, net.IP, int) {
message, err := packet.GetInnerMessage()
if err != nil {
dhcp6Failures.Inc()
return err, nil, 0
return nil, 0, err
}

if message.MessageType == dhcp.MessageTypeReply {
Expand All @@ -73,5 +73,5 @@ func sampleDhcp6(iface string, verbose bool) (error, net.IP, int) {
yourIPAddr = naAddr.IPv6Addr
}
}
return nil, yourIPAddr, prefixBits
return yourIPAddr, prefixBits, err
}
53 changes: 40 additions & 13 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ import (
"flag"
"fmt"
"log"
"log/slog"
"net/http"
"os"
"strconv"
"strings"
"time"
Expand Down Expand Up @@ -40,10 +42,13 @@ func main() {
flag.Parse()

if disable4 && disable6 {
log.Fatalf("You have to leave at least one address family enabled! Exiting")
slog.Error("both disable4 and disable6 flag set, needs at least one")
flag.Usage()
os.Exit(1)
}

fmt.Println("Starting observer.")
slog.Info("starting observer", "iface", iface, "icmp_targets", icmpTargets, "icmp_count", icmpCount, "interval", interval, "disable4", disable4, "disable6", disable6, "dns_qname", dnsQname, "dns_target", dnsTargets)

dnsTargetsList := strings.Split(dnsTargets, ",")
icmpTargetsList := strings.Split(icmpTargets, ",")
http.Handle("/metrics", promhttp.Handler())
Expand All @@ -55,52 +60,74 @@ func main() {

go func() {
for {
sampleDhcp(iface, verbose)
_, _, err := sampleDhcp(iface, verbose)
if err != nil {
slog.Warn("sampling dhcp", "err", err)
}
if len(dnsTargetsList) > 0 {
sampleDns(dnsTargetsList, dnsQname)
}
var addr *netlink.Addr
var addr6 *netlink.Addr
if !disable4 {
err, yourIPAddr, prefixBits := sampleDhcp(iface, verbose)
yourIPAddr, prefixBits, err := sampleDhcp(iface, verbose)
if err != nil {
log.Println("DHCPv4 check reported an error: ", err)
slog.Warn("sampling dhcp v4", "iface", iface, "err", err)
}

addr, err = netlink.ParseAddr(yourIPAddr.String() + "/" + strconv.Itoa(prefixBits))
if err != nil {
log.Fatalln(err)
}
netlink.AddrAdd(link, addr)

err = netlink.AddrAdd(link, addr)
if err != nil {
slog.Warn("adding netlink", "link", link, "addr", addr, "err", err)
}
}

if !disable6 {
err, yourIP6Addr, prefix6Bits := sampleDhcp6(iface, verbose)
yourIP6Addr, prefix6Bits, err := sampleDhcp6(iface, verbose)
if err != nil {
log.Println("DHCPv6 check reported an error: ", err)
slog.Warn("sampling dhcp v6", "iface", iface, "err", err)
}

addr6, err = netlink.ParseAddr(yourIP6Addr.String() + "/" + strconv.Itoa(prefix6Bits))
if err != nil {
log.Fatalln(err)
slog.Error("adding link", "addr6", addr6, "err", err)
os.Exit(1)
}

err = netlink.AddrAdd(link, addr6)
if err != nil {
slog.Warn("could not add netlink address", "link", link, "addr6", addr6, "err", err)
}
netlink.AddrAdd(link, addr6)
}

if icmpTargets != "" && len(icmpTargetsList) > 0 {
sampleIcmp(icmpTargetsList, icmpCount)
}

if !disable4 {
netlink.AddrDel(link, addr)
err := netlink.AddrDel(link, addr)
if err != nil {
slog.Warn("deleting v4 netlink", "link", link, "addr", addr, "err", err)
}
}

if !disable6 {
netlink.AddrDel(link, addr6)
err := netlink.AddrDel(link, addr6)
if err != nil {
slog.Warn("deleting v6 netlink", "link", link, "addr", addr, "err", err)
}
}

time.Sleep(interval)
}
}()

hostAddress := fmt.Sprintf(":%d", hostPort)
fmt.Println(hostAddress)
slog.Info("starting observer", "host_address", hostAddress)
err = http.ListenAndServe(hostAddress, nil)
if err != nil {
panic(err)
Expand Down