From 518b9f843c97b21233a2781082b98359a141b6a2 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sun, 3 Jun 2018 20:04:11 +0200 Subject: [PATCH] add the diagnostics daemon --- cmd/diagd/diagd.go | 63 +++++++++ internal/diag/dhcp.go | 79 ++++++++++++ internal/diag/diag.go | 54 ++++++++ internal/diag/diag_test.go | 39 ++++++ internal/diag/ipv6.go | 12 ++ internal/diag/link.go | 47 +++++++ internal/diag/ping.go | 254 +++++++++++++++++++++++++++++++++++++ internal/diag/ra6.go | 71 +++++++++++ internal/diag/tcp.go | 71 +++++++++++ 9 files changed, 690 insertions(+) create mode 100644 cmd/diagd/diagd.go create mode 100644 internal/diag/dhcp.go create mode 100644 internal/diag/diag.go create mode 100644 internal/diag/diag_test.go create mode 100644 internal/diag/ipv6.go create mode 100644 internal/diag/link.go create mode 100644 internal/diag/ping.go create mode 100644 internal/diag/ra6.go create mode 100644 internal/diag/tcp.go diff --git a/cmd/diagd/diagd.go b/cmd/diagd/diagd.go new file mode 100644 index 0000000..e46c1b3 --- /dev/null +++ b/cmd/diagd/diagd.go @@ -0,0 +1,63 @@ +// Binary diagd provides automated network diagnostics. +package main + +import ( + "flag" + "fmt" + "html" + "io" + "log" + "net/http" + "sync" + + "router7/internal/diag" +) + +func dump(w io.Writer, re *diag.EvalResult) { + symbol := "āœ”" + if re.Error { + symbol = "āœ˜" + } + fmt.Fprintf(w, "
  • %s %s: %s
  • ") +} + +func logic() error { + const ( + uplink = "uplink0" /* enp0s31f6 */ + ip6allrouters = "ff02::2" // no /etc/hosts on gokrazy + ) + m := diag.NewMonitor(diag.Link(uplink). + Then(diag.DHCPv4(). + Then(diag.Ping4Gateway(). + Then(diag.Ping4("google.ch"). + Then(diag.TCP4("www.google.ch:80"))))). + Then(diag.DHCPv6(). + Then(diag.Ping6("lan0", "google.ch"))). + Then(diag.RouterAdvertisments(uplink). + Then(diag.Ping6Gateway(). + Then(diag.Ping6(uplink, "google.ch"). + Then(diag.TCP6("www.google.ch:80"))))). + Then(diag.Ping6("", ip6allrouters+"%"+uplink))) + var mu sync.Mutex + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + mu.Lock() + re := m.Evaluate() + mu.Unlock() + fmt.Fprintf(w, `