diff --git a/CHANGELOG.md b/CHANGELOG.md index e5129d41..0080988e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -59,6 +59,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix the issue that the same tag added in `node set` is ignored. #967 - Change too-verbose warning message level from `Warn` to `Debug`. #1025 - Fixed a bug where error occurs when editing node. #1024 +- Optionally detect network and netmask from CIDR IP address. #1016 ### Changed diff --git a/internal/pkg/config/root.go b/internal/pkg/config/root.go index 52f891cc..e8369f14 100644 --- a/internal/pkg/config/root.go +++ b/internal/pkg/config/root.go @@ -9,6 +9,7 @@ package config import ( "fmt" "net" + "net/netip" "os" "reflect" @@ -107,22 +108,30 @@ func (conf *RootConf) SetDynamicDefaults() (err error) { if conf.Ipaddr == "" || conf.Netmask == "" || conf.Network == "" { var mask net.IPMask var network *net.IPNet - var ipaddr net.IP + var ip net.IP + cidr := conf.Ipaddr if conf.Ipaddr == "" { wwlog.Verbose("Configuration has no valid network, going to dynamic values") conn, err := net.Dial("udp", "8.8.8.8:80") if err == nil { defer conn.Close() - ipaddr = conn.LocalAddr().(*net.UDPAddr).IP + ipaddr := conn.LocalAddr().(*net.UDPAddr).IP mask = ipaddr.DefaultMask() sz, _ := mask.Size() - conf.Ipaddr = ipaddr.String() + fmt.Sprintf("/%d", sz) + cidr = ipaddr.String() + fmt.Sprintf("/%d", sz) } else { - conf.Ipaddr = "192.168.1.1/24" + cidr = "192.168.1.1/24" } + } else if addr, err := netip.ParseAddr(conf.Ipaddr); err == nil { + // if the ipaddr does not have mask appended, update it with default generated mask + ipaddr := net.IP(addr.AsSlice()) + sz, _ := ipaddr.DefaultMask().Size() + cidr = fmt.Sprintf("%s/%d", conf.Ipaddr, sz) + // otherwise, the following code will handle the ipaddr format: invalid or xxx.xxx.xxx.xxx/xx } - _, network, err = net.ParseCIDR(conf.Ipaddr) + + ip, network, err = net.ParseCIDR(cidr) if err == nil { mask = network.Mask } else { @@ -136,6 +145,8 @@ func (conf *RootConf) SetDynamicDefaults() (err error) { conf.Network = network.IP.String() wwlog.Verbose("Network is not configured in warewulf.conf, using %s", conf.Network) } + // always update the ipaddr to valid ip + conf.Ipaddr = ip.String() } if conf.DHCP.RangeStart == "" && conf.DHCP.RangeEnd == "" { start := net.ParseIP(conf.Network).To4()