diff --git a/internal/network/config.go b/internal/network/config.go index 8a28d51..da99496 100644 --- a/internal/network/config.go +++ b/internal/network/config.go @@ -56,13 +56,12 @@ type NetworkConfig struct { } func (c *NetworkConfig) GetMDNSMode() *mdns.MDNSListenOptions { - mode := c.MDNSMode.String listenOptions := &mdns.MDNSListenOptions{ - IPv4: true, - IPv6: true, + IPv4: c.IPv4Mode.String != "disabled", + IPv6: c.IPv6Mode.String != "disabled", } - switch mode { + switch c.MDNSMode.String { case "ipv4_only": listenOptions.IPv6 = false case "ipv6_only": diff --git a/internal/network/netif.go b/internal/network/netif.go index 5a8dab6..282f29b 100644 --- a/internal/network/netif.go +++ b/internal/network/netif.go @@ -239,6 +239,10 @@ func (s *NetworkInterfaceState) update() (DhcpTargetState, error) { ipv4Addresses = append(ipv4Addresses, addr.IP) ipv4AddressesString = append(ipv4AddressesString, addr.IPNet.String()) } else if addr.IP.To16() != nil { + if s.config.IPv6Mode.String == "disabled" { + continue + } + scopedLogger := s.l.With().Str("ipv6", addr.IP.String()).Logger() // check if it's a link local address if addr.IP.IsLinkLocalUnicast() { @@ -287,35 +291,37 @@ func (s *NetworkInterfaceState) update() (DhcpTargetState, error) { } s.ipv4Addresses = ipv4AddressesString - if ipv6LinkLocal != nil { - if s.ipv6LinkLocal == nil || s.ipv6LinkLocal.String() != ipv6LinkLocal.String() { - scopedLogger := s.l.With().Str("ipv6", ipv6LinkLocal.String()).Logger() - if s.ipv6LinkLocal != nil { - scopedLogger.Info(). - Str("old_ipv6", s.ipv6LinkLocal.String()). - Msg("IPv6 link local address changed") - } else { - scopedLogger.Info().Msg("IPv6 link local address found") + if s.config.IPv6Mode.String != "disabled" { + if ipv6LinkLocal != nil { + if s.ipv6LinkLocal == nil || s.ipv6LinkLocal.String() != ipv6LinkLocal.String() { + scopedLogger := s.l.With().Str("ipv6", ipv6LinkLocal.String()).Logger() + if s.ipv6LinkLocal != nil { + scopedLogger.Info(). + Str("old_ipv6", s.ipv6LinkLocal.String()). + Msg("IPv6 link local address changed") + } else { + scopedLogger.Info().Msg("IPv6 link local address found") + } + s.ipv6LinkLocal = ipv6LinkLocal + changed = true } - s.ipv6LinkLocal = ipv6LinkLocal - changed = true } - } - s.ipv6Addresses = ipv6Addresses + s.ipv6Addresses = ipv6Addresses - if len(ipv6Addresses) > 0 { - // compare the addresses to see if there's a change - if s.ipv6Addr == nil || s.ipv6Addr.String() != ipv6Addresses[0].Address.String() { - scopedLogger := s.l.With().Str("ipv6", ipv6Addresses[0].Address.String()).Logger() - if s.ipv6Addr != nil { - scopedLogger.Info(). - Str("old_ipv6", s.ipv6Addr.String()). - Msg("IPv6 address changed") - } else { - scopedLogger.Info().Msg("IPv6 address found") + if len(ipv6Addresses) > 0 { + // compare the addresses to see if there's a change + if s.ipv6Addr == nil || s.ipv6Addr.String() != ipv6Addresses[0].Address.String() { + scopedLogger := s.l.With().Str("ipv6", ipv6Addresses[0].Address.String()).Logger() + if s.ipv6Addr != nil { + scopedLogger.Info(). + Str("old_ipv6", s.ipv6Addr.String()). + Msg("IPv6 address changed") + } else { + scopedLogger.Info().Msg("IPv6 address found") + } + s.ipv6Addr = &ipv6Addresses[0].Address + changed = true } - s.ipv6Addr = &ipv6Addresses[0].Address - changed = true } } diff --git a/internal/network/rpc.go b/internal/network/rpc.go index 32f34f5..62f21be 100644 --- a/internal/network/rpc.go +++ b/internal/network/rpc.go @@ -65,7 +65,7 @@ func (s *NetworkInterfaceState) IPv6LinkLocalAddress() string { func (s *NetworkInterfaceState) RpcGetNetworkState() RpcNetworkState { ipv6Addresses := make([]RpcIPv6Address, 0) - if s.ipv6Addresses != nil { + if s.ipv6Addresses != nil && s.config.IPv6Mode.String != "disabled" { for _, addr := range s.ipv6Addresses { ipv6Addresses = append(ipv6Addresses, RpcIPv6Address{ Address: addr.Prefix.String(), diff --git a/mdns.go b/mdns.go index d7a3b55..4f9b49b 100644 --- a/mdns.go +++ b/mdns.go @@ -13,10 +13,7 @@ func initMdns() error { networkState.GetHostname(), networkState.GetFQDN(), }, - ListenOptions: &mdns.MDNSListenOptions{ - IPv4: true, - IPv6: true, - }, + ListenOptions: config.NetworkConfig.GetMDNSMode(), }) if err != nil { return err diff --git a/ui/src/components/Ipv6NetworkCard.tsx b/ui/src/components/Ipv6NetworkCard.tsx index a31b78e..0cfacc6 100644 --- a/ui/src/components/Ipv6NetworkCard.tsx +++ b/ui/src/components/Ipv6NetworkCard.tsx @@ -17,7 +17,7 @@ export default function Ipv6NetworkCard({
- {networkState?.dhcp_lease?.ip && ( + {networkState?.ipv6_link_local && (
Link-local diff --git a/ui/src/routes/devices.$id.settings.network.tsx b/ui/src/routes/devices.$id.settings.network.tsx index d87eb2b..d1ac696 100644 --- a/ui/src/routes/devices.$id.settings.network.tsx +++ b/ui/src/routes/devices.$id.settings.network.tsx @@ -166,11 +166,11 @@ export default function SettingsNetworkRoute() { }, [getNetworkState, getNetworkSettings]); const handleIpv4ModeChange = (value: IPv4Mode | string) => { - setNetworkSettings({ ...networkSettings, ipv4_mode: value as IPv4Mode }); + setNetworkSettingsRemote({ ...networkSettings, ipv4_mode: value as IPv4Mode }); }; const handleIpv6ModeChange = (value: IPv6Mode | string) => { - setNetworkSettings({ ...networkSettings, ipv6_mode: value as IPv6Mode }); + setNetworkSettingsRemote({ ...networkSettings, ipv6_mode: value as IPv6Mode }); }; const handleLldpModeChange = (value: LLDPMode | string) => { @@ -419,7 +419,7 @@ export default function SettingsNetworkRoute() { value={networkSettings.ipv6_mode} onChange={e => handleIpv6ModeChange(e.target.value)} options={filterUnknown([ - // { value: "disabled", label: "Disabled" }, + { value: "disabled", label: "Disabled" }, { value: "slaac", label: "SLAAC" }, // { value: "dhcpv6", label: "DHCPv6" }, // { value: "slaac_and_dhcpv6", label: "SLAAC and DHCPv6" }, diff --git a/web.go b/web.go index f1aa1ab..7dfb696 100644 --- a/web.go +++ b/web.go @@ -562,14 +562,31 @@ func RunWebServer() { r := setupRouter() // Determine the binding address based on the config - bindAddress := ":80" // Default to all interfaces + var bindAddress string + listenPort := 80 // default port + useIPv4 := config.NetworkConfig.IPv4Mode.String != "disabled" + useIPv6 := config.NetworkConfig.IPv6Mode.String != "disabled" + if config.LocalLoopbackOnly { - bindAddress = "localhost:80" // Loopback only (both IPv4 and IPv6) + if useIPv4 && useIPv6 { + bindAddress = fmt.Sprintf("localhost:%d", listenPort) + } else if useIPv4 { + bindAddress = fmt.Sprintf("127.0.0.1:%d", listenPort) + } else if useIPv6 { + bindAddress = fmt.Sprintf("[::1]:%d", listenPort) + } + } else { + if useIPv4 && useIPv6 { + bindAddress = fmt.Sprintf(":%d", listenPort) + } else if useIPv4 { + bindAddress = fmt.Sprintf("0.0.0.0:%d", listenPort) + } else if useIPv6 { + bindAddress = fmt.Sprintf("[::]:%d", listenPort) + } } logger.Info().Str("bindAddress", bindAddress).Bool("loopbackOnly", config.LocalLoopbackOnly).Msg("Starting web server") - err := r.Run(bindAddress) - if err != nil { + if err := r.Run(bindAddress); err != nil { panic(err) } }