fix(network): sort IPv6 addresses using wrong references

This commit is contained in:
Siyuan 2025-11-20 20:39:23 +00:00
parent 86be6df1d3
commit 8a76a70d9e
3 changed files with 36 additions and 20 deletions

View File

@ -105,18 +105,6 @@ func supervise() error {
return fmt.Errorf("failed to create log file: %w", err) return fmt.Errorf("failed to create log file: %w", err)
} }
logFileName := logFile.Name()
defer func() {
// Close file if it's still open (safe to call even if already closed)
if logFile != nil {
_ = logFile.Close()
}
// Only remove if file still exists at original location (wasn't renamed)
if _, err := os.Stat(logFileName); err == nil {
_ = os.Remove(logFileName)
}
}()
// Use io.MultiWriter to write to both the original streams and our buffers // Use io.MultiWriter to write to both the original streams and our buffers
cmd.Stdout = io.MultiWriter(os.Stdout, logFile) cmd.Stdout = io.MultiWriter(os.Stdout, logFile)
cmd.Stderr = io.MultiWriter(os.Stderr, logFile) cmd.Stderr = io.MultiWriter(os.Stderr, logFile)

View File

@ -16,7 +16,10 @@ func (im *InterfaceManager) updateInterfaceState() error {
return fmt.Errorf("failed to get interface: %w", err) return fmt.Errorf("failed to get interface: %w", err)
} }
var stateChanged bool var (
stateChanged bool
changeReason string
)
attrs := nl.Attrs() attrs := nl.Attrs()
@ -29,6 +32,7 @@ func (im *InterfaceManager) updateInterfaceState() error {
if im.state.Up != isUp { if im.state.Up != isUp {
im.state.Up = isUp im.state.Up = isUp
stateChanged = true stateChanged = true
changeReason = "oper state changed"
} }
// Check if the interface is online // Check if the interface is online
@ -36,12 +40,14 @@ func (im *InterfaceManager) updateInterfaceState() error {
if im.state.Online != isOnline { if im.state.Online != isOnline {
im.state.Online = isOnline im.state.Online = isOnline
stateChanged = true stateChanged = true
changeReason = "online state changed"
} }
// Check if the MAC address has changed // Check if the MAC address has changed
if im.state.MACAddress != attrs.HardwareAddr.String() { if im.state.MACAddress != attrs.HardwareAddr.String() {
im.state.MACAddress = attrs.HardwareAddr.String() im.state.MACAddress = attrs.HardwareAddr.String()
stateChanged = true stateChanged = true
changeReason = "MAC address changed"
} }
// Update IP addresses // Update IP addresses
@ -49,6 +55,7 @@ func (im *InterfaceManager) updateInterfaceState() error {
im.logger.Error().Err(err).Msg("failed to update IP addresses") im.logger.Error().Err(err).Msg("failed to update IP addresses")
} else if ipChanged { } else if ipChanged {
stateChanged = true stateChanged = true
changeReason = "IP addresses changed"
} }
im.state.LastUpdated = time.Now() im.state.LastUpdated = time.Now()
@ -56,7 +63,10 @@ func (im *InterfaceManager) updateInterfaceState() error {
// Notify callback if state changed // Notify callback if state changed
if stateChanged && im.onStateChange != nil { if stateChanged && im.onStateChange != nil {
im.logger.Debug().Interface("state", im.state).Msg("notifying state change") im.logger.Debug().
Str("changeReason", changeReason).
Interface("state", im.state).
Msg("notifying state change")
im.onStateChange(*im.state) im.onStateChange(*im.state)
} }
@ -80,6 +90,7 @@ func (im *InterfaceManager) updateInterfaceStateAddresses(nl *link.Link) (bool,
ipv6Gateway string ipv6Gateway string
ipv4Ready, ipv6Ready = false, false ipv4Ready, ipv6Ready = false, false
stateChanged = false stateChanged = false
stateChangeReason string
) )
routes, _ := mgr.ListDefaultRoutes(link.AfInet6) routes, _ := mgr.ListDefaultRoutes(link.AfInet6)
@ -123,40 +134,55 @@ func (im *InterfaceManager) updateInterfaceStateAddresses(nl *link.Link) (bool,
if !sortAndCompareStringSlices(im.state.IPv4Addresses, ipv4Addresses) { if !sortAndCompareStringSlices(im.state.IPv4Addresses, ipv4Addresses) {
im.state.IPv4Addresses = ipv4Addresses im.state.IPv4Addresses = ipv4Addresses
stateChanged = true stateChanged = true
stateChangeReason = "IPv4 addresses changed"
} }
if !sortAndCompareIPv6AddressSlices(im.state.IPv6Addresses, ipv6Addresses) { if !sortAndCompareIPv6AddressSlices(im.state.IPv6Addresses, ipv6Addresses) {
im.state.IPv6Addresses = ipv6Addresses im.state.IPv6Addresses = ipv6Addresses
stateChanged = true stateChanged = true
stateChangeReason = "IPv6 addresses changed"
} }
if im.state.IPv4Address != ipv4Addr { if im.state.IPv4Address != ipv4Addr {
im.state.IPv4Address = ipv4Addr im.state.IPv4Address = ipv4Addr
stateChanged = true stateChanged = true
stateChangeReason = "IPv4 address changed"
} }
if im.state.IPv6Address != ipv6Addr { if im.state.IPv6Address != ipv6Addr {
im.state.IPv6Address = ipv6Addr im.state.IPv6Address = ipv6Addr
stateChanged = true stateChanged = true
stateChangeReason = "IPv6 address changed"
} }
if im.state.IPv6LinkLocal != ipv6LinkLocal { if im.state.IPv6LinkLocal != ipv6LinkLocal {
im.state.IPv6LinkLocal = ipv6LinkLocal im.state.IPv6LinkLocal = ipv6LinkLocal
stateChanged = true stateChanged = true
stateChangeReason = "IPv6 link local address changed"
} }
if im.state.IPv6Gateway != ipv6Gateway { if im.state.IPv6Gateway != ipv6Gateway {
im.state.IPv6Gateway = ipv6Gateway im.state.IPv6Gateway = ipv6Gateway
stateChanged = true stateChanged = true
stateChangeReason = "IPv6 gateway changed"
} }
if im.state.IPv4Ready != ipv4Ready { if im.state.IPv4Ready != ipv4Ready {
im.state.IPv4Ready = ipv4Ready im.state.IPv4Ready = ipv4Ready
stateChanged = true stateChanged = true
stateChangeReason = "IPv4 ready state changed"
} }
if im.state.IPv6Ready != ipv6Ready { if im.state.IPv6Ready != ipv6Ready {
im.state.IPv6Ready = ipv6Ready im.state.IPv6Ready = ipv6Ready
stateChanged = true stateChanged = true
stateChangeReason = "IPv6 ready state changed"
}
if stateChanged {
im.logger.Trace().
Str("changeReason", stateChangeReason).
Interface("state", im.state).
Msg("interface state changed")
} }
return stateChanged, nil return stateChanged, nil

View File

@ -42,17 +42,19 @@ func sortAndCompareStringSlices(a, b []string) bool {
return true return true
} }
func sortIPv6AddressSlicesStable(a []types.IPv6Address) {
sort.SliceStable(a, func(i, j int) bool {
return a[i].Address.String() < a[j].Address.String()
})
}
func sortAndCompareIPv6AddressSlices(a, b []types.IPv6Address) bool { func sortAndCompareIPv6AddressSlices(a, b []types.IPv6Address) bool {
if len(a) != len(b) { if len(a) != len(b) {
return false return false
} }
sort.SliceStable(a, func(i, j int) bool { sortIPv6AddressSlicesStable(a)
return a[i].Address.String() < b[j].Address.String() sortIPv6AddressSlicesStable(b)
})
sort.SliceStable(b, func(i, j int) bool {
return b[i].Address.String() < a[j].Address.String()
})
for i := range a { for i := range a {
if a[i].Address.String() != b[i].Address.String() { if a[i].Address.String() != b[i].Address.String() {