ifcfg-rh: add functions to detect well-known ifcfg-rh keys

This adds a lot of meta-data about how we handle ifcfg-rh.

We will use this to prune/delete all variables that are not explicitly
set (dirty) but also well-known.

We could now easily emit a warning when an ifcfg-rh file contains
unused key.

We also could add more meta-data for each key. For example, we write
different files (ifcfg- and keys- files). We could add flags to indicate
that variables are valid in certain files. Currently that's not done.
Also, for simple properties we could associate the key with the
NMSetting property, and treat does generically, like keyfile does.

Anyway, there are potentials. For now, we will use this to clear dirty
variables.
This commit is contained in:
Thomas Haller
2019-12-19 13:26:36 +01:00
parent 3fa86a463c
commit 81e6fe963e
7 changed files with 464 additions and 35 deletions

View File

@@ -620,3 +620,302 @@ nms_ifcfg_rh_utils_is_numbered_tag_impl (const char *key,
NM_SET_OUT (out_idx, idx); NM_SET_OUT (out_idx, idx);
return TRUE; return TRUE;
} }
/*****************************************************************************/
#define _KEY_TYPE(key, flags) { .key_name = ""key"", .key_flags = ((NMS_IFCFG_KEY_TYPE_WELL_KNOWN) | (flags)), }
const NMSIfcfgKeyTypeInfo nms_ifcfg_well_known_keys[] = {
_KEY_TYPE ("ACD_TIMEOUT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("ADDRESS", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
_KEY_TYPE ("ARPING_WAIT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("AUTH_RETRIES", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("AUTOCONNECT_PRIORITY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("AUTOCONNECT_RETRIES", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("AUTOCONNECT_SLAVES", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("BAND", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("BONDING_MASTER", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("BONDING_OPTS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("BOOTPROTO", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("BRIDGE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("BRIDGE_MACADDR", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("BRIDGE_PORT_VLANS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("BRIDGE_UUID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("BRIDGE_VLANS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("BRIDGING_OPTS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("BROWSER_ONLY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("BSSID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("CHANNEL", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("CIPHER_GROUP", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("CIPHER_PAIRWISE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("CONNECTED_MODE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("CONNECTION_METERED", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("CTCPROT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("DCB", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE (KEY_DCB_APP_FCOE_ADVERTISE, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE (KEY_DCB_APP_FCOE_ENABLE, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE (KEY_DCB_APP_FCOE_MODE, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("DCB_APP_FCOE_PRIORITY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE (KEY_DCB_APP_FCOE_WILLING, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE (KEY_DCB_APP_FIP_ADVERTISE, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE (KEY_DCB_APP_FIP_ENABLE, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("DCB_APP_FIP_PRIORITY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE (KEY_DCB_APP_FIP_WILLING, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE (KEY_DCB_APP_ISCSI_ADVERTISE, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE (KEY_DCB_APP_ISCSI_ENABLE, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("DCB_APP_ISCSI_PRIORITY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE (KEY_DCB_APP_ISCSI_WILLING, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE (KEY_DCB_PFC_ADVERTISE, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE (KEY_DCB_PFC_ENABLE, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE (KEY_DCB_PFC_UP, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE (KEY_DCB_PFC_WILLING, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE (KEY_DCB_PG_ADVERTISE, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE (KEY_DCB_PG_ENABLE, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE (KEY_DCB_PG_ID, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE (KEY_DCB_PG_PCT, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE (KEY_DCB_PG_STRICT, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE (KEY_DCB_PG_UP2TC, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE (KEY_DCB_PG_UPPCT, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE (KEY_DCB_PG_WILLING, NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("DEFAULTKEY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("DEFROUTE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("DELAY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("DEVICE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("DEVICETYPE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("DEVTIMEOUT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("DHCPV6C", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("DHCPV6_DUID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("DHCPV6_HOSTNAME", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("DHCPV6_HOSTNAME_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("DHCPV6_IAID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("DHCPV6_SEND_HOSTNAME", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("DHCP_CLIENT_ID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("DHCP_FQDN", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("DHCP_HOSTNAME", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("DHCP_HOSTNAME_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("DHCP_IAID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("DHCP_SEND_HOSTNAME", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("DHCPv6_DUID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("DHCPv6_IAID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("DNS", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
_KEY_TYPE ("DOMAIN", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("ESSID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("ETHTOOL_OPTS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("ETHTOOL_WAKE_ON_LAN", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("FILS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("FILTER", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
_KEY_TYPE ("GATEWAY", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
_KEY_TYPE ("GATEWAYDEV", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("GATEWAY_PING_TIMEOUT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("GENERATE_MAC_ADDRESS_MASK", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("GVRP", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("HWADDR", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("HWADDR_BLACKLIST", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_ALTSUBJECT_MATCHES", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_ANON_IDENTITY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_AUTH_TIMEOUT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_CA_CERT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_CA_CERT_PASSWORD", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_CA_CERT_PASSWORD_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_CLIENT_CERT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_CLIENT_CERT_PASSWORD", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_CLIENT_CERT_PASSWORD_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_DOMAIN_SUFFIX_MATCH", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_EAP_METHODS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_FAST_PROVISIONING", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_IDENTITY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_INNER_AUTH_METHODS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_INNER_CA_CERT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_INNER_CA_CERT_PASSWORD", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_INNER_CA_CERT_PASSWORD_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_INNER_CLIENT_CERT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_INNER_CLIENT_CERT_PASSWORD", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_INNER_CLIENT_CERT_PASSWORD_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_INNER_PRIVATE_KEY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_INNER_PRIVATE_KEY_PASSWORD", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_INNER_PRIVATE_KEY_PASSWORD_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_OPTIONAL", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_PAC_FILE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_PASSWORD", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_PASSWORD_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_PASSWORD_RAW", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_PASSWORD_RAW_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_PEAP_FORCE_NEW_LABEL", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_PEAP_VERSION", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_PHASE1_AUTH_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_PHASE2_ALTSUBJECT_MATCHES", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_PHASE2_DOMAIN_SUFFIX_MATCH", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_PHASE2_SUBJECT_MATCH", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_PRIVATE_KEY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_PRIVATE_KEY_PASSWORD", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_PRIVATE_KEY_PASSWORD_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_SUBJECT_MATCH", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IEEE_8021X_SYSTEM_CA_CERTS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPADDR", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
_KEY_TYPE ("IPV4_DHCP_TIMEOUT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV4_DNS_PRIORITY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV4_FAILURE_FATAL", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV4_ROUTE_METRIC", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV4_ROUTE_TABLE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV6ADDR", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV6ADDR_SECONDARIES", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV6FORWARDING", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV6INIT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV6TUNNELIPV4", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV6_ADDR_GEN_MODE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV6_AUTOCONF", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV6_DEFAULTDEV", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV6_DEFAULTGW", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV6_DEFROUTE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV6_DISABLED", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV6_DNS_PRIORITY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV6_DOMAIN", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV6_FAILURE_FATAL", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV6_PEERDNS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV6_PEERROUTES", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV6_PRIVACY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV6_PRIVACY_PREFER_PUBLIC_IP", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV6_RES_OPTIONS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV6_ROUTE_METRIC", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV6_ROUTE_TABLE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("IPV6_TOKEN", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("KEY", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
_KEY_TYPE ("KEY_MGMT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("KEY_PASSPHRASE", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
_KEY_TYPE ("KEY_TYPE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("LLDP", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("LLMNR", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("MACADDR", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("MAC_ADDRESS_RANDOMIZATION", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("MASTER", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("MASTER_UUID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("MATCH_INTERFACE_NAME", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("MDNS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("METRIC", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
_KEY_TYPE ("MODE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("MTU", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("MULTI_CONNECT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("MVRP", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("NAME", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("NETMASK", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
_KEY_TYPE ("NETTYPE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("NM_CONTROLLED", NMS_IFCFG_KEY_TYPE_IS_PLAIN | NMS_IFCFG_KEY_TYPE_KEEP_WHEN_DIRTY ),
_KEY_TYPE ("NM_USER_", NMS_IFCFG_KEY_TYPE_IS_PREFIX ),
_KEY_TYPE ("ONBOOT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("OPTIONS", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
_KEY_TYPE ("OVS_PORT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("OVS_PORT_UUID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("PAC_SCRIPT", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("PAC_URL", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("PEERDNS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("PEERROUTES", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("PHYSDEV", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("PKEY", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("PMF", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("PORTNAME", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("POWERSAVE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("PREFIX", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
_KEY_TYPE ("PROXY_METHOD", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("QDISC", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
_KEY_TYPE ("REORDER_HDR", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("RES_OPTIONS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("ROUTING_RULE6_", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
_KEY_TYPE ("ROUTING_RULE_", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
_KEY_TYPE ("SEARCH", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("SECONDARY_UUIDS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("SECURITYMODE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("SLAVE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("SRIOV_AUTOPROBE_DRIVERS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("SRIOV_TOTAL_VFS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("SRIOV_VF", NMS_IFCFG_KEY_TYPE_IS_NUMBERED ),
_KEY_TYPE ("SSID_HIDDEN", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("STABLE_ID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("STP", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("SUBCHANNELS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("TEAM_CONFIG", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("TEAM_MASTER", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("TEAM_MASTER_UUID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("TEAM_PORT_CONFIG", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("TYPE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("USERS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("UUID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("VLAN", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("VLAN_EGRESS_PRIORITY_MAP", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("VLAN_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("VLAN_ID", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("VLAN_INGRESS_PRIORITY_MAP", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("WEP_KEY_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("WPA_ALLOW_WPA", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("WPA_ALLOW_WPA2", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("WPA_PSK", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("WPA_PSK_FLAGS", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("WPS_METHOD", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
_KEY_TYPE ("ZONE", NMS_IFCFG_KEY_TYPE_IS_PLAIN ),
};
const NMSIfcfgKeyTypeInfo *
nms_ifcfg_well_known_key_find_info (const char *key, gssize *out_idx)
{
gssize idx;
G_STATIC_ASSERT (G_STRUCT_OFFSET (NMSIfcfgKeyTypeInfo, key_name) == 0);
idx = nm_utils_array_find_binary_search (nms_ifcfg_well_known_keys,
sizeof (nms_ifcfg_well_known_keys[0]),
G_N_ELEMENTS (nms_ifcfg_well_known_keys),
&key,
nm_strcmp_p_with_data,
NULL);
NM_SET_OUT (out_idx, idx);
if (idx < 0)
return NULL;
return &nms_ifcfg_well_known_keys[idx];
}
const NMSIfcfgKeyTypeInfo *
nms_ifcfg_rh_utils_is_well_known_key (const char *key)
{
const NMSIfcfgKeyTypeInfo *ti;
gssize idx;
nm_assert (key);
ti = nms_ifcfg_well_known_key_find_info (key, &idx);
if (ti) {
if (NM_FLAGS_ANY (ti->key_flags, NMS_IFCFG_KEY_TYPE_IS_PLAIN
| NMS_IFCFG_KEY_TYPE_IS_NUMBERED)) {
/* these tags are valid on full match. */
return ti;
}
nm_assert (NM_FLAGS_HAS (ti->key_flags, NMS_IFCFG_KEY_TYPE_IS_PREFIX));
/* a prefix tag needs some extra words afterwards. */
return NULL;
}
/* Not found. Maybe it's a numbered/prefixed key? With idx we got the index where
* we should insert the key. Since the numbered/prefixed keys share a prefix, we can
* find the possible prefix at the index before the insert position. */
idx = ~idx;
if (idx == 0)
return NULL;
ti = &nms_ifcfg_well_known_keys[idx - 1];
if (NM_FLAGS_HAS (ti->key_flags, NMS_IFCFG_KEY_TYPE_IS_NUMBERED)) {
if (nms_ifcfg_rh_utils_is_numbered_tag (key, ti->key_name, NULL))
return ti;
return NULL;
}
if (NM_FLAGS_HAS (ti->key_flags, NMS_IFCFG_KEY_TYPE_IS_PREFIX)) {
gsize l = strlen (ti->key_name);
if ( strncmp (key, ti->key_name, l) == 0
&& key[l] != '\0')
return ti;
return NULL;
}
return NULL;
}

View File

@@ -11,6 +11,45 @@
#include "shvar.h" #include "shvar.h"
/*****************************************************************************/
typedef enum {
NMS_IFCFG_KEY_TYPE_UNKNOWN = 0,
NMS_IFCFG_KEY_TYPE_WELL_KNOWN = (1u << 0),
NMS_IFCFG_KEY_TYPE_IS_PLAIN = (1u << 1),
NMS_IFCFG_KEY_TYPE_IS_NUMBERED = (1u << 2),
NMS_IFCFG_KEY_TYPE_IS_PREFIX = (1u << 3),
/* by default, well knowns keys that are not explicitly set
* by the writer (the unvisited, dirty ones) are removed.
* With this flag, such keys are kept if they are present. */
NMS_IFCFG_KEY_TYPE_KEEP_WHEN_DIRTY = (1u << 4),
} NMSIfcfgKeyTypeFlags;
typedef struct {
const char *key_name;
NMSIfcfgKeyTypeFlags key_flags;
} NMSIfcfgKeyTypeInfo;
const NMSIfcfgKeyTypeInfo nms_ifcfg_well_known_keys[225];
const NMSIfcfgKeyTypeInfo *nms_ifcfg_well_known_key_find_info (const char *key, gssize *out_idx);
static inline NMSIfcfgKeyTypeFlags
nms_ifcfg_well_known_key_find_info_flags (const char *key)
{
const NMSIfcfgKeyTypeInfo *ti;
ti = nms_ifcfg_well_known_key_find_info (key, NULL);
if (!ti)
return NMS_IFCFG_KEY_TYPE_UNKNOWN;
return ti->key_flags;
}
/*****************************************************************************/
gboolean nms_ifcfg_rh_utils_parse_unhandled_spec (const char *unhandled_spec, gboolean nms_ifcfg_rh_utils_parse_unhandled_spec (const char *unhandled_spec,
const char **out_unmanaged_spec, const char **out_unmanaged_spec,
const char **out_unrecognized_spec); const char **out_unrecognized_spec);
@@ -51,6 +90,12 @@ _nms_ifcfg_rh_utils_numbered_tag (char *buf, gsize buf_len, const char *tag_name
{ {
gsize l; gsize l;
#if NM_MORE_ASSERTS > 5
nm_assert (NM_FLAGS_ALL (nms_ifcfg_well_known_key_find_info_flags (tag_name),
NMS_IFCFG_KEY_TYPE_WELL_KNOWN
| NMS_IFCFG_KEY_TYPE_IS_NUMBERED));
#endif
l = g_strlcpy (buf, tag_name, buf_len); l = g_strlcpy (buf, tag_name, buf_len);
nm_assert (l < buf_len); nm_assert (l < buf_len);
if (which != -1) { if (which != -1) {
@@ -90,6 +135,10 @@ nms_ifcfg_rh_utils_is_numbered_tag (const char *key,
/*****************************************************************************/ /*****************************************************************************/
const NMSIfcfgKeyTypeInfo *nms_ifcfg_rh_utils_is_well_known_key (const char *key);
/*****************************************************************************/
extern const char *const _nm_ethtool_ifcfg_names[_NM_ETHTOOL_ID_FEATURE_NUM]; extern const char *const _nm_ethtool_ifcfg_names[_NM_ETHTOOL_ID_FEATURE_NUM];
static inline const char * static inline const char *

View File

@@ -62,6 +62,19 @@ struct _shvarFile {
/*****************************************************************************/ /*****************************************************************************/
#define ASSERT_key_is_well_known(key) \
nm_assert ( ({ \
const char *_key = (key); \
gboolean _is_wellknown = TRUE; \
\
if (!nms_ifcfg_rh_utils_is_well_known_key (_key)) { \
_is_wellknown = FALSE; \
g_critical ("ifcfg-rh key \"%s\" is not well-known", _key); \
} \
\
_is_wellknown; \
}) )
/** /**
* svParseBoolean: * svParseBoolean:
* @value: the input string * @value: the input string
@@ -1017,6 +1030,8 @@ _svGetValue (shvarFile *s, const char *key, char **to_free)
nm_assert (_shell_is_name (key, -1)); nm_assert (_shell_is_name (key, -1));
nm_assert (to_free); nm_assert (to_free);
ASSERT_key_is_well_known (key);
line = NULL; line = NULL;
c_list_for_each (current, &s->lst_head) { c_list_for_each (current, &s->lst_head) {
l = c_list_entry (current, shvarLine, lst); l = c_list_entry (current, shvarLine, lst);
@@ -1252,6 +1267,8 @@ svSetValue (shvarFile *s, const char *key, const char *value)
nm_assert (_shell_is_name (key, -1)); nm_assert (_shell_is_name (key, -1));
ASSERT_key_is_well_known (key);
line = NULL; line = NULL;
c_list_for_each (current, &s->lst_head) { c_list_for_each (current, &s->lst_head) {
l = c_list_entry (current, shvarLine, lst); l = c_list_entry (current, shvarLine, lst);

View File

@@ -16,4 +16,4 @@ CIPHER_GROUP="TKIP CCMP WEP40 WEP104"
KEY_MGMT=WPA-PSK KEY_MGMT=WPA-PSK
WPA_ALLOW_WPA=yes WPA_ALLOW_WPA=yes
WPA_ALLOW_WPA2=yes WPA_ALLOW_WPA2=yes
LAST_ENTRY=no-newline CTCPROT=no-newline

View File

@@ -5,32 +5,32 @@
# don't consider only line-by-line, thus this is # don't consider only line-by-line, thus this is
# expected. # expected.
# #
# Also note that setting NAME will replace the last # Also note that setting IPADDR will replace the last
# occurrence, and delete all previous once. # occurrence, and delete all previous once.
#L1 #L1
NAME=l2 IPADDR=l2
#L2 #L2
NAME=l3 IPADDR=l3
some_key1='' METRIC1=''
some_key2=$'\U0x' METRIC2=$'\U0x'
some_key3=$'x\U0' METRIC3=$'x\U0'
#L4 #L4
NAME=' IPADDR='
NAME=l4x IPADDR=l4x
' '
#Lx-1 #Lx-1
NAME2=not-visible IPADDR2=not-visible
#Lx-2 #Lx-2
NAME2='invalid IPADDR2='invalid
#Lx-3 #Lx-3
#Ly-1 #Ly-1
NAME3='invalid IPADDR3='invalid
#Ly-2 #Ly-2
NAME3=name3-value IPADDR3=name3-value
#Ly-3 #Ly-3

View File

@@ -5,27 +5,27 @@
# don't consider only line-by-line, thus this is # don't consider only line-by-line, thus this is
# expected. # expected.
# #
# Also note that setting NAME will replace the last # Also note that setting IPADDR will replace the last
# occurrence, and delete all previous once. # occurrence, and delete all previous once.
#L1 #L1
#L2 #L2
some_key1='' METRIC1=''
some_key2=$'\U0x' METRIC2=$'\U0x'
some_key3=$'x\U0' METRIC3=$'x\U0'
#L4 #L4
NAME=set-by-test1 IPADDR=set-by-test1
#NM: ' #NM: '
#Lx-1 #Lx-1
#Lx-2 #Lx-2
NAME2=set-by-test2 IPADDR2=set-by-test2
#Lx-3 #Lx-3
#Ly-1 #Ly-1
#Ly-2 #Ly-2
NAME3=set-by-test3 IPADDR3=set-by-test3
#Ly-3 #Ly-3

View File

@@ -2868,7 +2868,7 @@ test_ifcfg_no_trailing_newline (void)
shvarFile *sv; shvarFile *sv;
sv = _svOpenFile (TEST_IFCFG_DIR"/ifcfg-test-wifi-wpa-psk"); sv = _svOpenFile (TEST_IFCFG_DIR"/ifcfg-test-wifi-wpa-psk");
_svGetValue_check (sv, "LAST_ENTRY", "no-newline"); _svGetValue_check (sv, "CTCPROT", "no-newline");
svCloseFile (sv); svCloseFile (sv);
} }
@@ -9781,23 +9781,23 @@ test_write_unknown (gconstpointer test_data)
_nmtst_svFileSetModified (sv); _nmtst_svFileSetModified (sv);
if (g_str_has_suffix (testfile, "ifcfg-test-write-unknown-4")) { if (g_str_has_suffix (testfile, "ifcfg-test-write-unknown-4")) {
_svGetValue_check (sv, "NAME", "l4x"); _svGetValue_check (sv, "IPADDR", "l4x");
_svGetValue_check (sv, "NAME2", ""); _svGetValue_check (sv, "IPADDR2", "");
_svGetValue_check (sv, "NAME3", "name3-value"); _svGetValue_check (sv, "IPADDR3", "name3-value");
svSetValue (sv, "NAME", "set-by-test1"); svSetValue (sv, "IPADDR", "set-by-test1");
svSetValue (sv, "NAME2", NULL); svSetValue (sv, "IPADDR2", NULL);
svSetValue (sv, "NAME2", "set-by-test2"); svSetValue (sv, "IPADDR2", "set-by-test2");
svSetValue (sv, "NAME3", "set-by-test3"); svSetValue (sv, "IPADDR3", "set-by-test3");
_svGetValue_check (sv, "some_key", NULL); _svGetValue_check (sv, "METRIC", NULL);
_svGetValue_check (sv, "some_key1", ""); _svGetValue_check (sv, "METRIC1", "");
_svGetValue_check (sv, "some_key2", ""); _svGetValue_check (sv, "METRIC2", "");
_svGetValue_check (sv, "some_key3", "x"); _svGetValue_check (sv, "METRIC3", "x");
_svGetValue_check (sv, "NAME", "set-by-test1"); _svGetValue_check (sv, "IPADDR", "set-by-test1");
_svGetValue_check (sv, "NAME2", "set-by-test2"); _svGetValue_check (sv, "IPADDR2", "set-by-test2");
_svGetValue_check (sv, "NAME3", "set-by-test3"); _svGetValue_check (sv, "IPADDR3", "set-by-test3");
} }
success = svWriteFile (sv, 0644, &error); success = svWriteFile (sv, 0644, &error);
@@ -10242,6 +10242,69 @@ test_tc_write (void)
/*****************************************************************************/ /*****************************************************************************/
static void
test_well_known_keys (void)
{
gsize i;
for (i = 0; i < G_N_ELEMENTS (nms_ifcfg_well_known_keys); i++) {
const NMSIfcfgKeyTypeInfo *ti = &nms_ifcfg_well_known_keys[i];
g_assert (ti->key_name);
g_assert (ti->key_name[0]);
g_assert (NM_FLAGS_HAS (ti->key_flags, NMS_IFCFG_KEY_TYPE_WELL_KNOWN));
g_assert (nm_utils_is_power_of_two (ti->key_flags & ( NMS_IFCFG_KEY_TYPE_IS_PLAIN
| NMS_IFCFG_KEY_TYPE_IS_NUMBERED
| NMS_IFCFG_KEY_TYPE_IS_PREFIX)));
}
for (i = 1; i < G_N_ELEMENTS (nms_ifcfg_well_known_keys); i++) {
const NMSIfcfgKeyTypeInfo *ti_prev = &nms_ifcfg_well_known_keys[i - 1];
const NMSIfcfgKeyTypeInfo *ti = &nms_ifcfg_well_known_keys[i];
g_assert_cmpstr (ti_prev->key_name, <, ti->key_name);
}
for (i = 0; i < G_N_ELEMENTS (nms_ifcfg_well_known_keys); i++) {
const NMSIfcfgKeyTypeInfo *ti = &nms_ifcfg_well_known_keys[i];
gs_free char *key_name = NULL;
gssize idx;
g_assert (ti == nms_ifcfg_well_known_key_find_info (ti->key_name, &idx));
g_assert_cmpint (i, ==, idx);
key_name = g_strdup (ti->key_name);
g_assert (ti == nms_ifcfg_well_known_key_find_info (key_name, &idx));
g_assert_cmpint (i, ==, idx);
}
#define _test_well_known(key, expected) \
G_STMT_START { \
const NMSIfcfgKeyTypeInfo *_ti; \
const char *_expected = (expected); \
\
_ti = nms_ifcfg_rh_utils_is_well_known_key (""key""); \
if (!_expected) { \
g_assert (!_ti); \
} else { \
g_assert (_ti); \
g_assert_cmpstr (_ti->key_name, ==, _expected); \
} \
} G_STMT_END
#define _test_well_known_plain(key) \
_test_well_known (""key"", ""key"")
_test_well_known_plain ("ONBOOT");
_test_well_known ("NM_USER_", NULL);
_test_well_known ("NM_USER_x", "NM_USER_");
_test_well_known ("IPADDR", "IPADDR");
_test_well_known ("IPADDR1", "IPADDR");
_test_well_known ("IPADDRx", NULL);
}
/*****************************************************************************/
#define TPATH "/settings/plugins/ifcfg-rh/" #define TPATH "/settings/plugins/ifcfg-rh/"
#define TEST_IFCFG_WIFI_OPEN_SSID_LONG_QUOTED TEST_IFCFG_DIR"/ifcfg-test-wifi-open-ssid-long-quoted" #define TEST_IFCFG_WIFI_OPEN_SSID_LONG_QUOTED TEST_IFCFG_DIR"/ifcfg-test-wifi-open-ssid-long-quoted"
@@ -10538,6 +10601,7 @@ int main (int argc, char **argv)
g_test_add_func (TPATH "tc/read", test_tc_read); g_test_add_func (TPATH "tc/read", test_tc_read);
g_test_add_func (TPATH "tc/write", test_tc_write); g_test_add_func (TPATH "tc/write", test_tc_write);
g_test_add_func (TPATH "utils/test_well_known_keys", test_well_known_keys);
return g_test_run (); return g_test_run ();
} }