def get_slaves_from_ifcfgs(nm_client, master_option, master_specs, root_path=""): """Get slaves of master specified by master_specs in master_option. :param nm_client: instance of NetworkManager client :type nm_client: NM.Client :param master_option: ifcfg setting containing specification of master :type master_option: str :param master_specs: a list containing sepcification of master: device name or connection uuid or both :type master_specs: list(str) :param root_path: search in the filesystem specified by root path :type root_path: str :returns: slaves specified by interface and ifcfg uuid :rtype: set((str,str)) """ slaves = set() for file_path in get_ifcfg_files_paths( os.path.normpath(root_path + IFCFG_DIR)): ifcfg = IfcfgFile(file_path) ifcfg.read() master = ifcfg.get(master_option) if master in master_specs: iface = ifcfg.get("DEVICE") if not iface: hwaddr = ifcfg.get("HWADDR") iface = get_iface_from_hwaddr(nm_client, hwaddr) if iface: slaves.add((iface, ifcfg.get("UUID"))) return slaves
def get_slaves_from_ifcfgs(nm_client, master_option, master_specs, root_path=""): """Get slaves of master specified by master_specs in master_option. :param nm_client: instance of NetworkManager client :type nm_client: NM.Client :param master_option: ifcfg setting containing specification of master :type master_option: str :param master_specs: a list containing sepcification of master: device name or connection uuid or both :type master_specs: list(str) :param root_path: search in the filesystem specified by root path :type root_path: str :returns: slaves specified by interface and ifcfg uuid :rtype: set((str,str)) """ slaves = set() for file_path in get_ifcfg_files_paths(os.path.normpath(root_path + IFCFG_DIR)): ifcfg = IfcfgFile(file_path) ifcfg.read() master = ifcfg.get(master_option) if master in master_specs: iface = ifcfg.get("DEVICE") if not iface: hwaddr = ifcfg.get("HWADDR") iface = get_iface_from_hwaddr(nm_client, hwaddr) if iface: slaves.add((iface, ifcfg.get("UUID"))) return slaves
def get_kickstart_network_data(ifcfg, nm_client, network_data_class, root_path=""): """Get kickstart data from ifcfg object. :param ifcfg: ifcfg file object :type ifcfg: IfcfgFile :param nm_client: instance of NetworkManager client :type nm_client: NM.Client :param network_data_class: pykickstart network command data class :type: pykickstart BaseData :param root_path: optional root path for ifcfg files to be updated :type root_path: str :returns: network_data object corresponding to the ifcfg object :rtype: network_data_class object instance """ ifcfg.read() kwargs = {} # no network command for non-virtual device slaves if ifcfg.get("TYPE") not in ("Bond", "Team") and ifcfg.get("DEVICETYPE") != "Team": if ifcfg.get("MASTER") or ifcfg.get("TEAM_MASTER") or ifcfg.get( "BRIDGE"): return None # no support for wireless if ifcfg.get("TYPE") == "Wireless": return None # ipv4 and ipv6 if ifcfg.get("ONBOOT") and ifcfg.get("ONBOOT") == "no": kwargs["onboot"] = False if ifcfg.get('MTU') and ifcfg.get('MTU') != "0": kwargs["mtu"] = ifcfg.get('MTU') # ipv4 if not ifcfg.get('BOOTPROTO'): kwargs["noipv4"] = True else: if util.lowerASCII(ifcfg.get('BOOTPROTO')) == 'dhcp': kwargs["bootProto"] = "dhcp" if ifcfg.get('DHCPCLASS'): kwargs["dhcpclass"] = ifcfg.get('DHCPCLASS') elif ifcfg.get('IPADDR'): kwargs["bootProto"] = "static" kwargs["ip"] = ifcfg.get('IPADDR') netmask = ifcfg.get('NETMASK') prefix = ifcfg.get('PREFIX') if not netmask and prefix: netmask = prefix2netmask(int(prefix)) if netmask: kwargs["netmask"] = netmask # note that --gateway is common for ipv4 and ipv6 if ifcfg.get('GATEWAY'): kwargs["gateway"] = ifcfg.get('GATEWAY') elif ifcfg.get('IPADDR0'): kwargs["bootProto"] = "static" kwargs["ip"] = ifcfg.get('IPADDR0') prefix = ifcfg.get('PREFIX0') if prefix: netmask = prefix2netmask(int(prefix)) kwargs["netmask"] = netmask # note that --gateway is common for ipv4 and ipv6 if ifcfg.get('GATEWAY0'): kwargs["gateway"] = ifcfg.get('GATEWAY0') # ipv6 if not ifcfg.get('IPV6INIT') or ifcfg.get('IPV6INIT') == "no": kwargs["noipv6"] = True else: if ifcfg.get('IPV6_AUTOCONF') in ("yes", ""): kwargs["ipv6"] = "auto" else: if ifcfg.get('IPV6ADDR'): kwargs["ipv6"] = ifcfg.get('IPV6ADDR') if ifcfg.get('IPV6_DEFAULTGW') \ and ifcfg.get('IPV6_DEFAULTGW') != "::": kwargs["ipv6gateway"] = ifcfg.get('IPV6_DEFAULTGW') if ifcfg.get('DHCPV6C') == "yes": kwargs["ipv6"] = "dhcp" # ipv4 and ipv6 dnsline = '' for key in ifcfg.info.keys(): if util.upperASCII(key).startswith('DNS'): if dnsline == '': dnsline = ifcfg.get(key) else: dnsline += "," + ifcfg.get(key) if dnsline: kwargs["nameserver"] = dnsline if ifcfg.get("ETHTOOL_OPTS"): kwargs["ethtool"] = ifcfg.get("ETHTOOL_OPTS") if ifcfg.get("ESSID"): kwargs["essid"] = ifcfg.get("ESSID") # hostname if ifcfg.get("DHCP_HOSTNAME"): kwargs["hostname"] = ifcfg.get("DHCP_HOSTNAME") iface = ifcfg.get("DEVICE") if not iface: hwaddr = ifcfg.get("HWADDR") if hwaddr: iface = get_iface_from_hwaddr(nm_client, hwaddr) if iface: kwargs["device"] = iface # bonding # FIXME: dracut has only BOND_OPTS if ifcfg.get("BONDING_MASTER") == "yes" or ifcfg.get("TYPE") == "Bond": slaves = sorted( get_slaves_from_ifcfgs( nm_client, "MASTER", [ifcfg.get("DEVICE"), ifcfg.get("UUID")], root_path=root_path)) if slaves: kwargs["bondslaves"] = ",".join(iface for iface, uuid in slaves) bondopts = ifcfg.get("BONDING_OPTS") if bondopts: sep = "," if sep in bondopts: sep = ";" kwargs["bondopts"] = sep.join(bondopts.split()) # vlan if ifcfg.get("VLAN") == "yes" or ifcfg.get("TYPE") == "Vlan": physdev = ifcfg.get("PHYSDEV") if len(physdev) == NM_CONNECTION_UUID_LENGTH: physdev = get_iface_from_connection(nm_client, physdev) kwargs["device"] = physdev kwargs["vlanid"] = ifcfg.get("VLAN_ID") interface_name = ifcfg.get("DEVICE") default_name = default_ks_vlan_interface_name(kwargs["device"], kwargs["vlanid"]) if interface_name and interface_name != default_name: kwargs["interfacename"] = interface_name # bridging if ifcfg.get("TYPE") == "Bridge": slaves = sorted( get_slaves_from_ifcfgs( nm_client, "BRIDGE", [ifcfg.get("DEVICE"), ifcfg.get("UUID")], root_path=root_path)) if slaves: kwargs["bridgeslaves"] = ",".join(iface for iface, uuid in slaves) bridgeopts = ifcfg.get("BRIDGING_OPTS").replace('_', '-').split() if ifcfg.get("STP"): bridgeopts.append("%s=%s" % ("stp", ifcfg.get("STP"))) if ifcfg.get("DELAY"): bridgeopts.append("%s=%s" % ("forward-delay", ifcfg.get("DELAY"))) if bridgeopts: kwargs["bridgeopts"] = ",".join(bridgeopts) nd = network_data_class(**kwargs) # teaming if ifcfg.get("TYPE") == "Team" or ifcfg.get("DEVICETYPE") == "Team": slaves = sorted( get_slaves_from_ifcfgs( nm_client, "TEAM_MASTER", [ifcfg.get("DEVICE"), ifcfg.get("UUID")], root_path=root_path)) for iface, uuid in slaves: team_port_cfg = get_team_port_config_from_connection( nm_client, uuid) nd.teamslaves.append((iface, team_port_cfg)) teamconfig = get_team_config_from_connection(nm_client, ifcfg.get("UUID")) if teamconfig: nd.teamconfig = teamconfig return nd
def get_ifcfg_file_of_device(nm_client, device_name, device_hwaddr=None, root_path=""): """Get ifcfg file for the device specified by name. :param nm_client: instance of NetworkManager client :type nm_client: NM.Client :param device_name: name of the device :type device_name: str :param device_hwaddr: hardware address of the device :type device_hwaddr: str :param root_path: search in the filesystem specified by root path :type root_path: str :returns: ifcfg file object :rtype: IfcfgFile """ # hwaddr is supplementary (--bindto=mac) ifcfgs = [] for file_path in get_ifcfg_files_paths( os.path.normpath(root_path + IFCFG_DIR)): ifcfg = IfcfgFile(file_path) ifcfg.read() device_type = ifcfg.get("TYPE") or ifcfg.get("DEVICETYPE") if device_type == "Wireless": # TODO check ESSID against active ssid of the device pass elif device_type in ("Bond", "Team", "Bridge", "Infiniband"): if ifcfg.get("DEVICE") == device_name: ifcfgs.append(ifcfg) elif device_type == "Vlan": interface_name = ifcfg.get("DEVICE") if interface_name: if interface_name == device_name: ifcfgs.append(ifcfg) else: physdev = ifcfg.get("PHYSDEV") if len(physdev) == NM_CONNECTION_UUID_LENGTH: physdev = get_iface_from_connection(nm_client, physdev) vlanid = ifcfg.get("VLAN_ID") generated_dev_name = default_ks_vlan_interface_name( physdev, vlanid) if device_name == generated_dev_name: ifcfgs.append(ifcfg) elif device_type == "Ethernet": # Ignore slaves if ifcfg.get("MASTER") or ifcfg.get("TEAM_MASTER") or ifcfg.get( "BRIDGE"): continue device = ifcfg.get("DEVICE") hwaddr = ifcfg.get("HWADDR") if device: if device == device_name: ifcfgs.append(ifcfg) elif hwaddr: if device_hwaddr: if device_hwaddr.upper() == hwaddr.upper(): ifcfgs.append(ifcfg) else: iface = get_iface_from_hwaddr(nm_client, hwaddr) if iface == device_name: ifcfgs.append(ifcfg) elif is_s390(): # s390 setting generated in dracut with net.ifnames=0 # has neither DEVICE nor HWADDR (#1249750) if ifcfg.get("NAME") == device_name: ifcfgs.append(ifcfg) if len(ifcfgs) > 1: log.debug("Unexpected number of ifcfg files found for %s: %s", device_name, [ifcfg.path for ifcfg in ifcfgs]) if ifcfgs: return ifcfgs[0] else: log.debug("Ifcfg file for %s not found", device_name)
def get_kickstart_network_data(ifcfg, nm_client, network_data_class, root_path=""): """Get kickstart data from ifcfg object. :param ifcfg: ifcfg file object :type ifcfg: IfcfgFile :param nm_client: instance of NetworkManager client :type nm_client: NM.Client :param network_data_class: pykickstart network command data class :type: pykickstart BaseData :param root_path: optional root path for ifcfg files to be updated :type root_path: str :returns: network_data object corresponding to the ifcfg object :rtype: network_data_class object instance """ ifcfg.read() kwargs = {} # no network command for non-virtual device slaves if ifcfg.get("TYPE") not in ("Bond", "Team") and ifcfg.get("DEVICETYPE") != "Team": if ifcfg.get("MASTER") or ifcfg.get("TEAM_MASTER") or ifcfg.get("BRIDGE"): return None # no support for wireless if ifcfg.get("TYPE") == "Wireless": return None # ipv4 and ipv6 if ifcfg.get("ONBOOT") and ifcfg.get("ONBOOT") == "no": kwargs["onboot"] = False if ifcfg.get('MTU') and ifcfg.get('MTU') != "0": kwargs["mtu"] = ifcfg.get('MTU') # ipv4 if not ifcfg.get('BOOTPROTO'): kwargs["noipv4"] = True else: if util.lowerASCII(ifcfg.get('BOOTPROTO')) == 'dhcp': kwargs["bootProto"] = "dhcp" if ifcfg.get('DHCPCLASS'): kwargs["dhcpclass"] = ifcfg.get('DHCPCLASS') elif ifcfg.get('IPADDR'): kwargs["bootProto"] = "static" kwargs["ip"] = ifcfg.get('IPADDR') netmask = ifcfg.get('NETMASK') prefix = ifcfg.get('PREFIX') if not netmask and prefix: netmask = prefix2netmask(int(prefix)) if netmask: kwargs["netmask"] = netmask # note that --gateway is common for ipv4 and ipv6 if ifcfg.get('GATEWAY'): kwargs["gateway"] = ifcfg.get('GATEWAY') elif ifcfg.get('IPADDR0'): kwargs["bootProto"] = "static" kwargs["ip"] = ifcfg.get('IPADDR0') prefix = ifcfg.get('PREFIX0') if prefix: netmask = prefix2netmask(int(prefix)) kwargs["netmask"] = netmask # note that --gateway is common for ipv4 and ipv6 if ifcfg.get('GATEWAY0'): kwargs["gateway"] = ifcfg.get('GATEWAY0') # ipv6 if not ifcfg.get('IPV6INIT') or ifcfg.get('IPV6INIT') == "no": kwargs["noipv6"] = True else: if ifcfg.get('IPV6_AUTOCONF') in ("yes", ""): kwargs["ipv6"] = "auto" else: if ifcfg.get('IPV6ADDR'): kwargs["ipv6"] = ifcfg.get('IPV6ADDR') if ifcfg.get('IPV6_DEFAULTGW') \ and ifcfg.get('IPV6_DEFAULTGW') != "::": kwargs["ipv6gateway"] = ifcfg.get('IPV6_DEFAULTGW') if ifcfg.get('DHCPV6C') == "yes": kwargs["ipv6"] = "dhcp" # ipv4 and ipv6 dnsline = '' for key in ifcfg.info.keys(): if util.upperASCII(key).startswith('DNS'): if dnsline == '': dnsline = ifcfg.get(key) else: dnsline += "," + ifcfg.get(key) if dnsline: kwargs["nameserver"] = dnsline if ifcfg.get("ETHTOOL_OPTS"): kwargs["ethtool"] = ifcfg.get("ETHTOOL_OPTS") if ifcfg.get("ESSID"): kwargs["essid"] = ifcfg.get("ESSID") # hostname if ifcfg.get("DHCP_HOSTNAME"): kwargs["hostname"] = ifcfg.get("DHCP_HOSTNAME") iface = ifcfg.get("DEVICE") if not iface: hwaddr = ifcfg.get("HWADDR") if hwaddr: iface = get_iface_from_hwaddr(nm_client, hwaddr) if iface: kwargs["device"] = iface # bonding # FIXME: dracut has only BOND_OPTS if ifcfg.get("BONDING_MASTER") == "yes" or ifcfg.get("TYPE") == "Bond": slaves = sorted(get_slaves_from_ifcfgs(nm_client, "MASTER", [ifcfg.get("DEVICE"), ifcfg.get("UUID")], root_path=root_path)) if slaves: kwargs["bondslaves"] = ",".join(iface for iface, uuid in slaves) bondopts = ifcfg.get("BONDING_OPTS") if bondopts: sep = "," if sep in bondopts: sep = ";" kwargs["bondopts"] = sep.join(bondopts.split()) # vlan if ifcfg.get("VLAN") == "yes" or ifcfg.get("TYPE") == "Vlan": physdev = ifcfg.get("PHYSDEV") if len(physdev) == NM_CONNECTION_UUID_LENGTH: physdev = get_iface_from_connection(nm_client, physdev) kwargs["device"] = physdev kwargs["vlanid"] = ifcfg.get("VLAN_ID") interface_name = ifcfg.get("DEVICE") if interface_name and interface_name != default_ks_vlan_interface_name(kwargs["device"], kwargs["vlanid"]): kwargs["interfacename"] = interface_name # bridging if ifcfg.get("TYPE") == "Bridge": slaves = sorted(get_slaves_from_ifcfgs(nm_client, "BRIDGE", [ifcfg.get("DEVICE"), ifcfg.get("UUID")], root_path=root_path)) if slaves: kwargs["bridgeslaves"] = ",".join(iface for iface, uuid in slaves) bridgeopts = ifcfg.get("BRIDGING_OPTS").replace('_', '-').split() if ifcfg.get("STP"): bridgeopts.append("%s=%s" % ("stp", ifcfg.get("STP"))) if ifcfg.get("DELAY"): bridgeopts.append("%s=%s" % ("forward-delay", ifcfg.get("DELAY"))) if bridgeopts: kwargs["bridgeopts"] = ",".join(bridgeopts) nd = network_data_class(**kwargs) # teaming if ifcfg.get("TYPE") == "Team" or ifcfg.get("DEVICETYPE") == "Team": slaves = sorted(get_slaves_from_ifcfgs(nm_client, "TEAM_MASTER", [ifcfg.get("DEVICE"), ifcfg.get("UUID")], root_path=root_path)) for iface, uuid in slaves: team_port_cfg = get_team_port_config_from_connection(nm_client, uuid) nd.teamslaves.append((iface, team_port_cfg)) teamconfig = get_team_config_from_connection(nm_client, ifcfg.get("UUID")) if teamconfig: nd.teamconfig = teamconfig return nd
def get_ifcfg_file_of_device(nm_client, device_name, device_hwaddr=None, root_path=""): """Get ifcfg file for the device specified by name. :param nm_client: instance of NetworkManager client :type nm_client: NM.Client :param device_name: name of the device :type device_name: str :param hwaddr: hardware address of the device :type hwaddr: str :param root_path: search in the filesystem specified by root path :type root_path: str :returns: ifcfg file object :rtype: IfcfgFile """ # hwaddr is supplementary (--bindto=mac) ifcfgs = [] for file_path in get_ifcfg_files_paths(os.path.normpath(root_path + IFCFG_DIR)): ifcfg = IfcfgFile(file_path) ifcfg.read() device_type = ifcfg.get("TYPE") or ifcfg.get("DEVICETYPE") if device_type == "Wireless": # TODO check ESSID against active ssid of the device pass elif device_type in ("Bond", "Team", "Bridge", "Infiniband"): if ifcfg.get("DEVICE") == device_name: ifcfgs.append(ifcfg) elif device_type == "Vlan": interface_name = ifcfg.get("DEVICE") if interface_name: if interface_name == device_name: ifcfgs.append(ifcfg) else: physdev = ifcfg.get("PHYSDEV") if len(physdev) == NM_CONNECTION_UUID_LENGTH: physdev = get_iface_from_connection(nm_client, physdev) vlanid = ifcfg.get("VLAN_ID") generated_dev_name = default_ks_vlan_interface_name(physdev, vlanid) if device_name == generated_dev_name: ifcfgs.append(ifcfg) elif device_type == "Ethernet": # Ignore slaves if ifcfg.get("MASTER") or ifcfg.get("TEAM_MASTER") or ifcfg.get("BRIDGE"): continue device = ifcfg.get("DEVICE") hwaddr = ifcfg.get("HWADDR") if device: if device == device_name: ifcfgs.append(ifcfg) elif hwaddr: if device_hwaddr: if device_hwaddr.upper() == hwaddr.upper(): ifcfgs.append(ifcfg) else: iface = get_iface_from_hwaddr(nm_client, hwaddr) if iface == device_name: ifcfgs.append(ifcfg) elif is_s390(): # s390 setting generated in dracut with net.ifnames=0 # has neither DEVICE nor HWADDR (#1249750) if ifcfg.get("NAME") == device_name: ifcfgs.append(ifcfg) if len(ifcfgs) > 1: log.debug("Unexpected number of ifcfg files found for %s: %s", device_name, [ifcfg.path for ifcfg in ifcfgs]) if ifcfgs: return ifcfgs[0] else: log.debug("Ifcfg file for %s not found", device_name)