package main import ( "fmt" "net/http" "os" "strings" "testing" "time" ) // Opt-in local visual fixture; never included in production binaries. func TestTrafficPreview(t *testing.T) { if os.Getenv("DASHBOARD_TRAFFIC_PREVIEW") != "1" { t.Skip("manual visual preview") } s, a := trafficFixture(t) s.SaveTrafficSettings(TrafficSettings{Enabled: true, NetworkEnabled: true, MonitoringRules: []MonitoringRule{{IP: "192.168.0.10"}}, AgentID: a.ID, ServerCountry: "RU"}) mux := http.NewServeMux() trafficRoutes(mux, s) mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html; charset=utf-8") w.Write([]byte(dashboardHTML)) }) mux.HandleFunc("/api/agents", func(w http.ResponseWriter, r *http.Request) { items, _ := s.Agents(); writeJSON(w, items, nil) }) go func() { i := 0 for { i++ events := []TrafficEvent{} for j, ip := range []string{"8.8.8.8", "1.1.1.1", "20.194.96.114", "192.168.0.10", "77.83.39.94", "51.158.145.102", "123.56.127.23"} { kind := "request" if j == 4 { kind = "alert" } if j == 5 { kind = "decision" } events = append(events, TrafficEvent{ID: fmt.Sprintf("preview-%d-%d", i, j), Time: time.Now().Unix(), Kind: kind, IP: ip, Domain: "demo.example", Method: "GET", Path: "/demo", Status: 200, Reason: "ДЕМО · crowdsecurity/http-probing"}) } flows := []NetworkFlow{} for k := 0; k < 32; k++ { f, _ := parseNetworkFlow(networkNATLine) f.SourcePort = 51000 + k f.ReplyDestinationPort = f.SourcePort f.Source = []string{"8.8.8.8", "1.1.1.1", "20.194.96.114", "192.168.0.10", "51.158.145.102", "2001:4860:4860::8888"}[k%6] f.ReplyDestination = f.Source if k%3 == 0 { f.Protocol = "udp" f.State = "ASSURED" f.DestinationPort = 53 f.ReplySourcePort = 53 } if k%5 == 0 && f.Protocol == "tcp" { f.State = "SYN_SENT" } if k%7 == 0 { f.Protocol = "icmp" f.State = "TRACKED" f.SourcePort = 0 f.DestinationPort = 0 f.ReplySourcePort = 0 f.ReplyDestinationPort = 0 } if k == 11 { f.Source = "192.168.0.12" f.Destination = "1.1.1.1" f.ReplySource = "1.1.1.1" f.ReplyDestination = "192.168.0.12" } flows = append(flows, f) } s.SaveNetwork(a.ID, NetworkSnapshot{At: time.Now().Unix(), Flows: flows, FirewallAt: time.Now().Unix(), Firewall: []FirewallCounter{{Name: "DEMO ip/crowdsec/drop #3", Packets: 12345, Bytes: 654321}}}) s.SaveTraffic(a.ID, TrafficBatch{Events: events, Files: 22, StartedAt: time.Now().Add(-time.Hour).Unix(), CrowdSecAt: time.Now().Unix()}) time.Sleep(3 * time.Second) } }() handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path == "/network" { w.Header().Set("Content-Type", "text/html; charset=utf-8") w.Write([]byte(strings.Replace(networkHTML, "PROXMOX / NETWORK OBSERVATORY", "ДЕМО / ИСКУССТВЕННЫЕ ДАННЫЕ", 1))) return } if r.URL.Path == "/traffic" { w.Header().Set("Content-Type", "text/html; charset=utf-8") w.Write([]byte(strings.Replace(trafficHTML, "PROXMOX / LIVE OBSERVATORY", "ДЕМО / ИСКУССТВЕННЫЕ ДАННЫЕ", 1))) return } mux.ServeHTTP(w, r) }) t.Fatal(http.ListenAndServe("127.0.0.1:19105", handler)) }