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:
@@ -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;
|
||||||
|
}
|
||||||
|
@@ -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 *
|
||||||
|
@@ -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);
|
||||||
|
@@ -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
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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 ();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user