mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-05-07 18:58:05 +02:00
device: add device-spec "type:"
Support a device-spec to match by device-type. This matches on the value as shown by nmcli -f GENERAL.TYPE device show
This commit is contained in:
parent
e9e9d44468
commit
3fb60edf9f
4 changed files with 46 additions and 2 deletions
|
|
@ -620,6 +620,11 @@ unmanaged-devices=mac:00:22:68:1c:59:b1;mac:00:1E:65:30:D1:C4;interface-name:eth
|
||||||
<term>s390-subchannels:HWADDR</term>
|
<term>s390-subchannels:HWADDR</term>
|
||||||
<listitem><para>Match the device based on the subchannel address. Globbing is not supported</para></listitem>
|
<listitem><para>Match the device based on the subchannel address. Globbing is not supported</para></listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>type:TYPE</term>
|
||||||
|
<listitem><para>Match the device type. Valid type names are as reported by "<literal>nmcli -f GENERAL.TYPE device show</literal>".
|
||||||
|
Globbing is not supported.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term>except:SPEC</term>
|
<term>except:SPEC</term>
|
||||||
<listitem><para>Negative match of a device. <literal>SPEC</literal> must be explicitly qualified with
|
<listitem><para>Negative match of a device. <literal>SPEC</literal> must be explicitly qualified with
|
||||||
|
|
|
||||||
|
|
@ -996,6 +996,7 @@ nm_utils_find_helper(const char *progname, const char *try_first, GError **error
|
||||||
|
|
||||||
#define MAC_TAG "mac:"
|
#define MAC_TAG "mac:"
|
||||||
#define INTERFACE_NAME_TAG "interface-name:"
|
#define INTERFACE_NAME_TAG "interface-name:"
|
||||||
|
#define DEVICE_TYPE_TAG "type:"
|
||||||
#define SUBCHAN_TAG "s390-subchannels:"
|
#define SUBCHAN_TAG "s390-subchannels:"
|
||||||
#define EXCEPT_TAG "except:"
|
#define EXCEPT_TAG "except:"
|
||||||
|
|
||||||
|
|
@ -1010,6 +1011,37 @@ _match_except (const char *spec_str, gboolean *out_except)
|
||||||
return spec_str;
|
return spec_str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NMMatchSpecMatchType
|
||||||
|
nm_match_spec_device_type (const GSList *specs, const char *device_type)
|
||||||
|
{
|
||||||
|
const GSList *iter;
|
||||||
|
NMMatchSpecMatchType match = NM_MATCH_SPEC_NO_MATCH;
|
||||||
|
|
||||||
|
if (!device_type || !*device_type)
|
||||||
|
return NM_MATCH_SPEC_NO_MATCH;
|
||||||
|
|
||||||
|
for (iter = specs; iter; iter = g_slist_next (iter)) {
|
||||||
|
const char *spec_str = iter->data;
|
||||||
|
gboolean except;
|
||||||
|
|
||||||
|
if (!spec_str || !*spec_str)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
spec_str = _match_except (spec_str, &except);
|
||||||
|
|
||||||
|
if (g_ascii_strncasecmp (spec_str, DEVICE_TYPE_TAG, STRLEN (DEVICE_TYPE_TAG)) != 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
spec_str += STRLEN (DEVICE_TYPE_TAG);
|
||||||
|
if (strcmp (spec_str, device_type) == 0) {
|
||||||
|
if (except)
|
||||||
|
return NM_MATCH_SPEC_NEG_MATCH;
|
||||||
|
match = NM_MATCH_SPEC_MATCH;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return match;
|
||||||
|
}
|
||||||
|
|
||||||
NMMatchSpecMatchType
|
NMMatchSpecMatchType
|
||||||
nm_match_spec_hwaddr (const GSList *specs, const char *hwaddr)
|
nm_match_spec_hwaddr (const GSList *specs, const char *hwaddr)
|
||||||
{
|
{
|
||||||
|
|
@ -1028,7 +1060,8 @@ nm_match_spec_hwaddr (const GSList *specs, const char *hwaddr)
|
||||||
spec_str = _match_except (spec_str, &except);
|
spec_str = _match_except (spec_str, &except);
|
||||||
|
|
||||||
if ( !g_ascii_strncasecmp (spec_str, INTERFACE_NAME_TAG, STRLEN (INTERFACE_NAME_TAG))
|
if ( !g_ascii_strncasecmp (spec_str, INTERFACE_NAME_TAG, STRLEN (INTERFACE_NAME_TAG))
|
||||||
|| !g_ascii_strncasecmp (spec_str, SUBCHAN_TAG, STRLEN (SUBCHAN_TAG)))
|
|| !g_ascii_strncasecmp (spec_str, SUBCHAN_TAG, STRLEN (SUBCHAN_TAG))
|
||||||
|
|| !g_ascii_strncasecmp (spec_str, DEVICE_TYPE_TAG, STRLEN (DEVICE_TYPE_TAG)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!g_ascii_strncasecmp (spec_str, MAC_TAG, STRLEN (MAC_TAG)))
|
if (!g_ascii_strncasecmp (spec_str, MAC_TAG, STRLEN (MAC_TAG)))
|
||||||
|
|
@ -1064,7 +1097,8 @@ nm_match_spec_interface_name (const GSList *specs, const char *interface_name)
|
||||||
spec_str = _match_except (spec_str, &except);
|
spec_str = _match_except (spec_str, &except);
|
||||||
|
|
||||||
if ( !g_ascii_strncasecmp (spec_str, MAC_TAG, STRLEN (MAC_TAG))
|
if ( !g_ascii_strncasecmp (spec_str, MAC_TAG, STRLEN (MAC_TAG))
|
||||||
|| !g_ascii_strncasecmp (spec_str, SUBCHAN_TAG, STRLEN (SUBCHAN_TAG)))
|
|| !g_ascii_strncasecmp (spec_str, SUBCHAN_TAG, STRLEN (SUBCHAN_TAG))
|
||||||
|
|| !g_ascii_strncasecmp (spec_str, DEVICE_TYPE_TAG, STRLEN (DEVICE_TYPE_TAG)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!g_ascii_strncasecmp (spec_str, INTERFACE_NAME_TAG, STRLEN (INTERFACE_NAME_TAG))) {
|
if (!g_ascii_strncasecmp (spec_str, INTERFACE_NAME_TAG, STRLEN (INTERFACE_NAME_TAG))) {
|
||||||
|
|
|
||||||
|
|
@ -93,6 +93,7 @@ typedef enum {
|
||||||
NM_MATCH_SPEC_NEG_MATCH = 2,
|
NM_MATCH_SPEC_NEG_MATCH = 2,
|
||||||
} NMMatchSpecMatchType;
|
} NMMatchSpecMatchType;
|
||||||
|
|
||||||
|
NMMatchSpecMatchType nm_match_spec_device_type (const GSList *specs, const char *device_type);
|
||||||
NMMatchSpecMatchType nm_match_spec_hwaddr (const GSList *specs, const char *hwaddr);
|
NMMatchSpecMatchType nm_match_spec_hwaddr (const GSList *specs, const char *hwaddr);
|
||||||
NMMatchSpecMatchType nm_match_spec_s390_subchannels (const GSList *specs, const char *subchannels);
|
NMMatchSpecMatchType nm_match_spec_s390_subchannels (const GSList *specs, const char *subchannels);
|
||||||
NMMatchSpecMatchType nm_match_spec_interface_name (const GSList *specs, const char *interface_name);
|
NMMatchSpecMatchType nm_match_spec_interface_name (const GSList *specs, const char *interface_name);
|
||||||
|
|
|
||||||
|
|
@ -8531,6 +8531,10 @@ spec_match_list (NMDevice *self, const GSList *specs)
|
||||||
m = nm_match_spec_interface_name (specs, nm_device_get_iface (self));
|
m = nm_match_spec_interface_name (specs, nm_device_get_iface (self));
|
||||||
matched = MAX (matched, m);
|
matched = MAX (matched, m);
|
||||||
}
|
}
|
||||||
|
if (matched != NM_MATCH_SPEC_NEG_MATCH) {
|
||||||
|
m = nm_match_spec_device_type (specs, nm_device_get_type_description (self));
|
||||||
|
matched = MAX (matched, m);
|
||||||
|
}
|
||||||
return matched;
|
return matched;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue