- conntrack/event.go: TrafficEvent type - conntrack/filter.go: WG subnet filter, IsExternal, ProtoName - conntrack/subscriber.go: netlink conntrack DESTROY subscriber - writer/log.go: JSON line writer with mutex - resolver/peers.go: WG IP → peer name from conf files + endpoint index - resolver/services.go: IP:port → service name from services.json - config/config.go: reads wgctl.json, sensible defaults - cmd/root.go: CLI flags - main.go: wires everything together - DESTROY events only: full byte/packet counts per connection - filters to WireGuard subnet, marks external traffic
47 lines
No EOL
830 B
Go
47 lines
No EOL
830 B
Go
package writer
|
|
|
|
import (
|
|
"encoding/json"
|
|
"log"
|
|
"os"
|
|
"sync"
|
|
|
|
"git.krilio.net/nuno/wgctl-conntrack/conntrack"
|
|
)
|
|
|
|
// LogWriter writes TrafficEvents as JSON lines to a file
|
|
type LogWriter struct {
|
|
path string
|
|
mu sync.Mutex
|
|
}
|
|
|
|
func NewLogWriter(path string) *LogWriter {
|
|
return &LogWriter{path: path}
|
|
}
|
|
|
|
func (w *LogWriter) Write(ev conntrack.TrafficEvent) error {
|
|
w.mu.Lock()
|
|
defer w.mu.Unlock()
|
|
|
|
f, err := os.OpenFile(w.path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer f.Close()
|
|
|
|
data, err := json.Marshal(ev)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
_, err = f.Write(append(data, '\n'))
|
|
return err
|
|
}
|
|
|
|
func (w *LogWriter) Run(events <-chan conntrack.TrafficEvent) {
|
|
for ev := range events {
|
|
if err := w.Write(ev); err != nil {
|
|
log.Printf("error writing event: %v", err)
|
|
}
|
|
}
|
|
} |