diff --git a/pkg/nmlite/dhcp.go b/pkg/nmlite/dhcp.go index fb50d986..2a0c47b5 100644 --- a/pkg/nmlite/dhcp.go +++ b/pkg/nmlite/dhcp.go @@ -9,7 +9,6 @@ import ( "github.com/jetkvm/kvm/pkg/nmlite/jetdhcpc" "github.com/jetkvm/kvm/pkg/nmlite/udhcpc" "github.com/rs/zerolog" - "github.com/vishvananda/netlink" ) // DHCPClient wraps the dhclient package for use in the network manager @@ -19,7 +18,6 @@ type DHCPClient struct { logger *zerolog.Logger client types.DHCPClient clientType string - link netlink.Link // Configuration ipv4Enabled bool @@ -181,7 +179,9 @@ func (dc *DHCPClient) Renew() error { } dc.logger.Info().Msg("renewing DHCP lease") - dc.client.Renew() + if err := dc.client.Renew(); err != nil { + return fmt.Errorf("failed to renew DHCP lease: %w", err) + } return nil } @@ -192,7 +192,9 @@ func (dc *DHCPClient) Release() error { } dc.logger.Info().Msg("releasing DHCP lease") - dc.client.Release() + if err := dc.client.Release(); err != nil { + return fmt.Errorf("failed to release DHCP lease: %w", err) + } return nil } diff --git a/pkg/nmlite/hostname.go b/pkg/nmlite/hostname.go index 5d220176..9083e088 100644 --- a/pkg/nmlite/hostname.go +++ b/pkg/nmlite/hostname.go @@ -256,38 +256,6 @@ func ToValidHostname(hostname string) string { // ValidateHostname validates a hostname func ValidateHostname(hostname string) error { - if hostname == "" { - return fmt.Errorf("hostname cannot be empty") - } - - validHostname := ToValidHostname(hostname) - if validHostname != hostname { - return fmt.Errorf("hostname contains invalid characters: %s", hostname) - } - - if len(hostname) > 253 { - return fmt.Errorf("hostname too long: %d characters (max 253)", len(hostname)) - } - - // Check for valid characters (alphanumeric, hyphens, dots) - for _, char := range hostname { - if !((char >= 'a' && char <= 'z') || - (char >= 'A' && char <= 'Z') || - (char >= '0' && char <= '9') || - char == '-' || char == '.') { - return fmt.Errorf("hostname contains invalid character: %c", char) - } - } - - // Check that it doesn't start or end with hyphen - if strings.HasPrefix(hostname, "-") || strings.HasSuffix(hostname, "-") { - return fmt.Errorf("hostname cannot start or end with hyphen") - } - - // Check that it doesn't start or end with dot - if strings.HasPrefix(hostname, ".") || strings.HasSuffix(hostname, ".") { - return fmt.Errorf("hostname cannot start or end with dot") - } - - return nil -} + _, err := idna.Lookup.ToASCII(hostname) + return err +} \ No newline at end of file diff --git a/pkg/nmlite/interface.go b/pkg/nmlite/interface.go index 4dca6d8d..15ebb1d1 100644 --- a/pkg/nmlite/interface.go +++ b/pkg/nmlite/interface.go @@ -160,7 +160,9 @@ func (im *InterfaceManager) Stop() error { // Stop DHCP client if im.dhcpClient != nil { - im.dhcpClient.Stop() + if err := im.dhcpClient.Stop(); err != nil { + return fmt.Errorf("failed to stop DHCP client: %w", err) + } } im.logger.Info().Msg("interface manager stopped") @@ -241,7 +243,7 @@ func (im *InterfaceManager) GetIPv6Addresses() []string { addresses = append(addresses, addr.Address.String()) } - return []string{} + return addresses } // GetMACAddress returns the MAC address of the interface @@ -544,7 +546,9 @@ func (im *InterfaceManager) applyIPv6SLAACAndDHCP() error { // Enable both SLAAC and DHCPv6 if im.dhcpClient != nil { im.dhcpClient.SetIPv6(true) - im.dhcpClient.Start() + if err := im.dhcpClient.Start(); err != nil { + return fmt.Errorf("failed to start DHCP client: %w", err) + } } return im.staticConfig.EnableIPv6SLAAC() @@ -644,15 +648,23 @@ func (im *InterfaceManager) SendRouterSolicitation() error { func (im *InterfaceManager) handleLinkUp() { im.logger.Info().Msg("link up") - im.applyConfiguration() + if err := im.applyConfiguration(); err != nil { + im.logger.Error().Err(err).Msg("failed to apply configuration") + } if im.config.IPv4Mode.String == "dhcp" { - im.dhcpClient.Renew() + if err := im.dhcpClient.Renew(); err != nil { + im.logger.Error().Err(err).Msg("failed to renew DHCP lease") + } } if im.config.IPv6Mode.String == "slaac" { - im.staticConfig.EnableIPv6SLAAC() - im.SendRouterSolicitation() + if err := im.staticConfig.EnableIPv6SLAAC(); err != nil { + im.logger.Error().Err(err).Msg("failed to enable IPv6 SLAAC") + } + if err := im.SendRouterSolicitation(); err != nil { + im.logger.Error().Err(err).Msg("failed to send router solicitation") + } } } @@ -660,7 +672,9 @@ func (im *InterfaceManager) handleLinkDown() { im.logger.Info().Msg("link down") if im.config.IPv4Mode.String == "dhcp" { - im.dhcpClient.Stop() + if err := im.dhcpClient.Stop(); err != nil { + im.logger.Error().Err(err).Msg("failed to stop DHCP client") + } } netlinkMgr := getNetlinkManager() @@ -694,7 +708,6 @@ func (im *InterfaceManager) monitorInterfaceState() { } } } - } // updateStateFromDHCPLease updates the state from a DHCP lease @@ -707,7 +720,6 @@ func (im *InterfaceManager) updateStateFromDHCPLease(lease *types.DHCPLease) { family = link.AfInet6 } else { im.state.DHCPLease4 = lease - family = link.AfInet } im.stateMu.Unlock() diff --git a/pkg/nmlite/manager.go b/pkg/nmlite/manager.go index 35b8224d..92847176 100644 --- a/pkg/nmlite/manager.go +++ b/pkg/nmlite/manager.go @@ -96,8 +96,7 @@ func (nm *NetworkManager) AddInterface(iface string, config *types.NetworkConfig }) im.SetOnResolvConfChange(func(family int, resolvConf *types.InterfaceResolvConf) error { - nm.resolvConf.SetInterfaceConfig(iface, family, *resolvConf) - return nil + return nm.resolvConf.SetInterfaceConfig(iface, family, *resolvConf) }) nm.interfaces[iface] = im diff --git a/pkg/nmlite/resolvconf.go b/pkg/nmlite/resolvconf.go index 05ccc517..1bacee7a 100644 --- a/pkg/nmlite/resolvconf.go +++ b/pkg/nmlite/resolvconf.go @@ -79,7 +79,9 @@ func (rcm *ResolvConfManager) SetInterfaceConfig(iface string, family int, confi } rcm.mu.Unlock() - rcm.reconcileHostname() + if err := rcm.reconcileHostname(); err != nil { + return fmt.Errorf("failed to reconcile hostname: %w", err) + } return rcm.update() } @@ -99,7 +101,9 @@ func (rcm *ResolvConfManager) SetConfig(resolvConf *types.ResolvConf) error { // Reconcile reconciles the resolv.conf configuration func (rcm *ResolvConfManager) Reconcile() error { - rcm.reconcileHostname() + if err := rcm.reconcileHostname(); err != nil { + return fmt.Errorf("failed to reconcile hostname: %w", err) + } return rcm.update() } diff --git a/pkg/nmlite/static.go b/pkg/nmlite/static.go index e23424b1..9500556b 100644 --- a/pkg/nmlite/static.go +++ b/pkg/nmlite/static.go @@ -182,9 +182,3 @@ func (scm *StaticConfigManager) removeIPv4DefaultRoute() error { netlinkMgr := getNetlinkManager() return netlinkMgr.RemoveDefaultRoute(link.AfInet) } - -// enableIPv6 enables IPv6 on the interface -func (scm *StaticConfigManager) enableIPv6() error { - netlinkMgr := getNetlinkManager() - return netlinkMgr.EnableIPv6(scm.ifaceName) -}