Skip to content
This repository was archived by the owner on Jul 1, 2025. It is now read-only.

Commit 7019893

Browse files
Merge pull request #13 from tomvil/print_received_neighbors_log_with_debug_only
Add logger and move Received neighbor update to debug
2 parents 5ed002c + 3d40384 commit 7019893

File tree

5 files changed

+71
-33
lines changed

5 files changed

+71
-33
lines changed

cmd/neigh2route/main.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,39 @@ package main
22

33
import (
44
"flag"
5-
"log"
65
"os"
76
"os/signal"
87
"syscall"
98

9+
"github.com/tomvil/neigh2route/internal/logger"
1010
"github.com/tomvil/neigh2route/internal/neighbor"
1111
)
1212

1313
var (
1414
listenInterface = flag.String("interface", "", "Interface to monitor for neighbor updates")
15+
debugMode = flag.Bool("debug", false, "Enable debug logging")
1516
)
1617

1718
func main() {
1819
flag.Parse()
1920

21+
logger.Init(*debugMode)
22+
2023
nm, err := neighbor.NewNeighborManager(*listenInterface)
2124
if err != nil {
22-
log.Fatalf("Failed to initialize neighbor manager: %v", err)
25+
logger.Error("Failed to initialize neighbor manager: %v", err)
2326
}
2427

2528
if err := nm.InitializeNeighborTable(); err != nil {
26-
log.Fatalf("Failed to initialize neighbor table: %v", err)
29+
logger.Error("Failed to initialize neighbor table: %v", err)
2730
}
2831

2932
c := make(chan os.Signal, 1)
3033
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
3134

3235
go func() {
3336
sig := <-c
34-
log.Printf("Received signal: %s. Cleaning up and exiting...", sig)
37+
logger.Info("Received signal: %s. Cleaning up and exiting...", sig)
3538
nm.Cleanup()
3639
os.Exit(0)
3740
}()

internal/logger/logger.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package logger
2+
3+
import (
4+
"log"
5+
)
6+
7+
var debugEnabled bool = false
8+
9+
func Init(debug bool) {
10+
debugEnabled = debug
11+
}
12+
13+
func Debug(format string, v ...interface{}) {
14+
if debugEnabled {
15+
log.Printf("[DEBUG] "+format, v...)
16+
}
17+
}
18+
19+
func Info(format string, v ...interface{}) {
20+
log.Printf("[INFO] "+format, v...)
21+
}
22+
23+
func Warn(format string, v ...interface{}) {
24+
log.Printf("[WARN] "+format, v...)
25+
}
26+
27+
func Error(format string, v ...interface{}) {
28+
log.Printf("[ERROR] "+format, v...)
29+
}

internal/neighbor/manager.go

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package neighbor
22

33
import (
4-
"log"
54
"net"
65
"sync"
76
"time"
87

8+
"github.com/tomvil/neigh2route/internal/logger"
99
"github.com/tomvil/neigh2route/pkg/netutils"
1010
"github.com/vishvananda/netlink"
1111
)
@@ -47,7 +47,7 @@ func (nm *NeighborManager) AddNeighbor(ip net.IP, linkIndex int) {
4747
return
4848
}
4949

50-
log.Printf("Neighbor %s link index changed, re-adding neighbor", ip.String())
50+
logger.Info("Neighbor %s link index changed, re-adding neighbor", ip.String())
5151
shouldRemoveNeighbor = true
5252
}
5353

@@ -62,11 +62,11 @@ func (nm *NeighborManager) AddNeighbor(ip net.IP, linkIndex int) {
6262
}
6363

6464
if err := netutils.AddRoute(ip, linkIndex); err != nil {
65-
log.Printf("Failed to add route for neighbor %s: %v", ip.String(), err)
65+
logger.Info("Failed to add route for neighbor %s: %v", ip.String(), err)
6666
return
6767
}
6868

69-
log.Printf("Added neighbor %s", ip.String())
69+
logger.Info("Added neighbor %s", ip.String())
7070
}
7171

7272
func (nm *NeighborManager) RemoveNeighbor(ip net.IP, linkIndex int) {
@@ -76,7 +76,7 @@ func (nm *NeighborManager) RemoveNeighbor(ip net.IP, linkIndex int) {
7676
for i, n := range nm.reachableNeighbors {
7777
if n.ip.Equal(ip) && n.linkIndex == linkIndex {
7878
nm.reachableNeighbors = append(nm.reachableNeighbors[:i], nm.reachableNeighbors[i+1:]...)
79-
log.Printf("Removed neighbor %s", ip.String())
79+
logger.Info("Removed neighbor %s", ip.String())
8080
shouldRemoveRoute = true
8181
break
8282
}
@@ -85,7 +85,7 @@ func (nm *NeighborManager) RemoveNeighbor(ip net.IP, linkIndex int) {
8585

8686
if shouldRemoveRoute {
8787
if err := netutils.RemoveRoute(ip, linkIndex); err != nil {
88-
log.Printf("Failed to remove route for neighbor %s: %v", ip.String(), err)
88+
logger.Info("Failed to remove route for neighbor %s: %v", ip.String(), err)
8989
return
9090
}
9191
}
@@ -115,21 +115,21 @@ func (nm *NeighborManager) InitializeNeighborTable() error {
115115
return err
116116
}
117117

118-
log.Printf("Initializing neighbor table with %d neighbors", len(neighbors))
118+
logger.Info("Initializing neighbor table with %d neighbors", len(neighbors))
119119

120120
for _, n := range neighbors {
121121
if n.IP.IsLinkLocalUnicast() {
122-
log.Printf("Skipping link-local neighbor with IP=%s, LinkIndex=%d", n.IP, n.LinkIndex)
122+
logger.Info("Skipping link-local neighbor with IP=%s, LinkIndex=%d", n.IP, n.LinkIndex)
123123
continue
124124
}
125125

126126
if (n.State&(netlink.NUD_REACHABLE|netlink.NUD_STALE)) != 0 && !nm.isNeighborExternallyLearned(n.Flags) {
127-
log.Printf("Adding neighbor with IP=%s, LinkIndex=%d", n.IP, n.LinkIndex)
127+
logger.Info("Adding neighbor with IP=%s, LinkIndex=%d", n.IP, n.LinkIndex)
128128
nm.AddNeighbor(n.IP, n.LinkIndex)
129129
}
130130
}
131131

132-
log.Printf("Neighbor table initialized finished")
132+
logger.Info("Neighbor table initialized finished")
133133

134134
return nil
135135
}
@@ -140,7 +140,7 @@ func (nm *NeighborManager) MonitorNeighbors() {
140140
defer close(done)
141141

142142
if err := netlink.NeighSubscribe(updates, done); err != nil {
143-
log.Fatalf("Failed to subscribe to neighbor updates: %v (interface: %s, index: %d)",
143+
logger.Error("Failed to subscribe to neighbor updates: %v (interface: %s, index: %d)",
144144
err, nm.targetInterface, nm.targetInterfaceIndex)
145145
}
146146

@@ -153,7 +153,7 @@ func (nm *NeighborManager) MonitorNeighbors() {
153153
continue
154154
}
155155

156-
log.Printf("Received neighbor update: IP=%s, State=%s, Flags=%s, LinkIndex=%d",
156+
logger.Debug("Received neighbor update: IP=%s, State=%s, Flags=%s, LinkIndex=%d",
157157
update.Neigh.IP, neighborStateToString(update.Neigh.State), neighborFlagsToString(update.Neigh.Flags), update.Neigh.LinkIndex)
158158

159159
if (update.Neigh.State&(netlink.NUD_REACHABLE|netlink.NUD_STALE)) != 0 && !nm.isNeighborExternallyLearned(update.Neigh.Flags) {
@@ -180,7 +180,7 @@ func (nm *NeighborManager) SendPings() {
180180
go func(n Neighbor) {
181181
defer wg.Done()
182182
if err := netutils.Ping(n.ip.String()); err != nil {
183-
log.Printf("Failed to ping neighbor %s: %v", n.ip.String(), err)
183+
logger.Info("Failed to ping neighbor %s: %v", n.ip.String(), err)
184184
}
185185
}(n)
186186
}
@@ -196,9 +196,9 @@ func (nm *NeighborManager) Cleanup() {
196196

197197
for _, n := range nm.reachableNeighbors {
198198
if err := netutils.RemoveRoute(n.ip, n.linkIndex); err != nil {
199-
log.Printf("Failed to remove route for neighbor %s: %v", n.ip.String(), err)
199+
logger.Info("Failed to remove route for neighbor %s: %v", n.ip.String(), err)
200200
continue
201201
}
202-
log.Printf("Removed route for neighbor %s", n.ip.String())
202+
logger.Info("Removed route for neighbor %s", n.ip.String())
203203
}
204204
}

pkg/netutils/ping.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
package netutils
22

33
import (
4-
"fmt"
54
"time"
65

76
"github.com/go-ping/ping"
7+
"github.com/tomvil/neigh2route/internal/logger"
88
)
99

1010
func Ping(ip string) error {
1111
pinger, err := ping.NewPinger(ip)
1212
if err != nil {
13-
return fmt.Errorf("failed to create pinger: %w", err)
13+
logger.Error("failed to create pinger: %w", err)
14+
return err
1415
}
1516

1617
pinger.Count = 3
@@ -20,7 +21,8 @@ func Ping(ip string) error {
2021

2122
err = pinger.Run()
2223
if err != nil {
23-
return fmt.Errorf("failed to run pinger: %w", err)
24+
logger.Error("failed to run pinger: %w", err)
25+
return err
2426
}
2527

2628
return nil

pkg/netutils/route.go

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package netutils
22

33
import (
4-
"fmt"
5-
"log"
64
"net"
75

6+
"github.com/tomvil/neigh2route/internal/logger"
87
"github.com/vishvananda/netlink"
98
)
109

@@ -14,15 +13,16 @@ func routeExists(dst *net.IPNet, linkIndex int) (bool, error) {
1413
Dst: dst,
1514
}, netlink.RT_FILTER_DST|netlink.RT_FILTER_OIF)
1615
if err != nil {
17-
return false, fmt.Errorf("failed to list routes for dst %s on link %d: %w", dst.String(), linkIndex, err)
16+
logger.Error("Failed to list routes for dst %s on link %d: %w", dst.String(), linkIndex, err)
17+
return false, err
1818
}
1919

2020
if len(routes) == 0 {
21-
log.Printf("No routes found for dst %s on link index %d", dst.String(), linkIndex)
21+
logger.Info("No routes found for dst %s on link index %d", dst.String(), linkIndex)
2222
return false, nil
2323
}
2424

25-
log.Printf("Found %d routes for dst %s on link index %d", len(routes), dst.String(), linkIndex)
25+
logger.Info("Found %d routes for dst %s on link index %d", len(routes), dst.String(), linkIndex)
2626
return true, nil
2727
}
2828

@@ -36,7 +36,8 @@ func AddRoute(ip net.IP, linkIndex int) error {
3636

3737
exists, err := routeExists(routeDst, linkIndex)
3838
if err != nil {
39-
return fmt.Errorf("failed to check if route exists for %s: %w", ip.String(), err)
39+
logger.Error("Failed to check if route exists for %s: %w", ip.String(), err)
40+
return err
4041
}
4142

4243
if exists {
@@ -50,10 +51,11 @@ func AddRoute(ip net.IP, linkIndex int) error {
5051
}
5152

5253
if err := netlink.RouteAdd(route); err != nil {
53-
return fmt.Errorf("failed to add route for %s: %w", ip.String(), err)
54+
logger.Error("Failed to add route for %s: %w", ip.String(), err)
55+
return err
5456
}
5557

56-
log.Printf("Added route for %s on link index %d", ip.String(), linkIndex)
58+
logger.Info("Added route for %s on link index %d", ip.String(), linkIndex)
5759
return nil
5860
}
5961

@@ -67,7 +69,8 @@ func RemoveRoute(ip net.IP, linkIndex int) error {
6769

6870
exists, err := routeExists(routeDst, linkIndex)
6971
if err != nil {
70-
return fmt.Errorf("failed to check if route exists for %s: %w", ip.String(), err)
72+
logger.Error("Failed to check if route exists for %s: %w", ip.String(), err)
73+
return err
7174
}
7275

7376
if !exists {
@@ -81,9 +84,10 @@ func RemoveRoute(ip net.IP, linkIndex int) error {
8184
}
8285

8386
if err := netlink.RouteDel(route); err != nil {
84-
return fmt.Errorf("failed to remove route for %s: %w", ip.String(), err)
87+
logger.Error("Failed to remove route for %s: %w", ip.String(), err)
88+
return err
8589
}
8690

87-
log.Printf("Removed route for %s on link index %d", ip.String(), linkIndex)
91+
logger.Info("Removed route for %s on link index %d", ip.String(), linkIndex)
8892
return nil
8993
}

0 commit comments

Comments
 (0)