def update_connection_ip_settings_from_ksdata(connection, network_data): """Update NM connection from kickstart IP configuration in place. :param connection: existing NetworkManager connection to be updated :type connection: NM.RemoteConnection :param network_data: kickstart configuation containing the IP configuration to be applied to the connection :type network_data: pykickstart NetworkData """ # ipv4 settings if network_data.noipv4: method4 = "disabled" elif network_data.bootProto == "static": method4 = "manual" else: method4 = "auto" connection.remove_setting(NM.SettingIP4Config) s_ip4 = NM.SettingIP4Config.new() s_ip4.set_property(NM.SETTING_IP_CONFIG_METHOD, method4) if method4 == "manual": prefix4 = netmask2prefix(network_data.netmask) addr4 = NM.IPAddress.new(socket.AF_INET, network_data.ip, prefix4) s_ip4.add_address(addr4) if network_data.gateway: s_ip4.props.gateway = network_data.gateway connection.add_setting(s_ip4) # ipv6 settings if network_data.noipv6: method6 = "ignore" elif not network_data.ipv6 or network_data.ipv6 == "auto": method6 = "auto" elif network_data.ipv6 == "dhcp": method6 = "dhcp" else: method6 = "manual" connection.remove_setting(NM.SettingIP6Config) s_ip6 = NM.SettingIP6Config.new() s_ip6.set_property(NM.SETTING_IP_CONFIG_METHOD, method6) if method6 == "manual": addr6, _slash, prefix6 = network_data.ipv6.partition("/") if prefix6: prefix6 = int(prefix6) else: prefix6 = 64 addr6 = NM.IPAddress.new(socket.AF_INET6, addr6, prefix6) s_ip6.add_address(addr6) if network_data.ipv6gateway: s_ip6.props.gateway = network_data.ipv6gateway connection.add_setting(s_ip6) # nameservers if network_data.nameserver: for ns in [str.strip(i) for i in network_data.nameserver.split(",")]: if NM.utils_ipaddr_valid(socket.AF_INET6, ns): s_ip6.add_dns(ns) elif NM.utils_ipaddr_valid(socket.AF_INET, ns): s_ip4.add_dns(ns) else: log.error("IP address %s is not valid", ns)