mirror of https://github.com/jetkvm/kvm.git
fix(network): sort IPv6 addresses using wrong references
This commit is contained in:
parent
86be6df1d3
commit
8a76a70d9e
12
cmd/main.go
12
cmd/main.go
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue