Improve log

pull/165/head
Joseph Ligier 1 month ago
parent 5763a0c270
commit fbbd45e830

@ -1,18 +1,18 @@
package main package main
import ( import (
"context"
"fmt"
"log"
"net"
"os"
"os/signal"
"syscall"
"bytes" "bytes"
"context"
"github.com/cilium/ebpf" "fmt"
"github.com/cilium/ebpf/link" "log"
"github.com/cilium/ebpf/ringbuf" "net"
"os"
"os/signal"
"syscall"
"github.com/cilium/ebpf"
"github.com/cilium/ebpf/link"
"github.com/cilium/ebpf/ringbuf"
_ "embed" _ "embed"
) )
@ -22,75 +22,98 @@ const progName = "{{crate_name}}"
//go:embed .ebpf/{{project-name}} //go:embed .ebpf/{{project-name}}
var ebpfBytes []byte var ebpfBytes []byte
func extractPrintableStrings(raw []byte) []string {
var result []string
var current []byte
for _, b := range raw {
if b >= 0x20 && b <= 0x7E {
current = append(current, b)
} else {
if len(current) > 0 {
result = append(result, string(current))
current = nil
}
}
}
if len(current) > 0 {
result = append(result, string(current))
}
return result
}
func main() { func main() {
defaultIface := "{{default_iface}}" defaultIface := "{{default_iface}}"
ifaceName := defaultIface ifaceName := defaultIface
if len(os.Args) > 1 { if len(os.Args) > 1 {
ifaceName = os.Args[1] ifaceName = os.Args[1]
} }
spec, err := ebpf.LoadCollectionSpecFromReader(bytes.NewReader(ebpfBytes)) spec, err := ebpf.LoadCollectionSpecFromReader(bytes.NewReader(ebpfBytes))
if err != nil { if err != nil {
log.Fatalf("LoadCollectionSpec failed: %v", err) log.Fatalf("LoadCollectionSpec failed: %v", err)
} }
coll, err := ebpf.NewCollection(spec) coll, err := ebpf.NewCollection(spec)
if err != nil { if err != nil {
log.Fatalf("NewCollection failed: %v", err) log.Fatalf("NewCollection failed: %v", err)
} }
defer coll.Close() defer coll.Close()
prog := coll.Programs[progName] prog := coll.Programs[progName]
if prog == nil { if prog == nil {
log.Fatalf("Program %s not found", progName) log.Fatalf("Program %s not found", progName)
} }
iface, err := net.InterfaceByName(ifaceName) iface, err := net.InterfaceByName(ifaceName)
if err != nil { if err != nil {
log.Fatalf("Interface not found: %v", err) log.Fatalf("Interface not found: %v", err)
} }
l, err := link.AttachXDP(link.XDPOptions{ l, err := link.AttachXDP(link.XDPOptions{
Program: prog, Program: prog,
Interface: iface.Index, Interface: iface.Index,
}) })
if err != nil { if err != nil {
log.Fatalf("AttachXDP failed: %v", err) log.Fatalf("AttachXDP failed: %v", err)
} }
defer l.Close() defer l.Close()
fmt.Printf("✅ Program '%s' attached to %s\n", progName, ifaceName) fmt.Printf("✅ Program '%s' attached to %s\n", progName, ifaceName)
logMap, ok := coll.Maps["AYA_LOGS"] logMap, ok := coll.Maps["AYA_LOGS"]
if !ok { if !ok {
log.Fatal("AYA_LOGS map not found") log.Fatal("AYA_LOGS map not found")
} }
reader, err := ringbuf.NewReader(logMap) reader, err := ringbuf.NewReader(logMap)
if err != nil { if err != nil {
log.Fatalf("failed to create ringbuf reader: %v", err) log.Fatalf("failed to create ringbuf reader: %v", err)
} }
defer reader.Close() defer reader.Close()
ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
defer stop() defer stop()
go func() { go func() {
fmt.Println("Listening to Aya logs...") fmt.Println("Listening to Aya logs...")
for { for {
select { select {
case <-ctx.Done(): case <-ctx.Done():
return return
default: default:
record, err := reader.Read() record, err := reader.Read()
if err != nil { if err != nil {
continue continue
} }
fmt.Printf("Aya log: %s\n", string(record.RawSample)) msg := extractPrintableStrings(record.RawSample)
} fmt.Printf("[INFO %s] %s\n", msg[1], msg[len(msg)-1])
} }
}() }
}()
<-ctx.Done()
fmt.Println("Shutting down...") <-ctx.Done()
fmt.Println("Shutting down...")
} }

Loading…
Cancel
Save