matchclass¶
Description¶
Performs comparisons against the contents of data group. Typically
used for conditional logic control.
Note: matchclass has been deprecated in
v10 in favor of the new class commands. The class
command offers better functionality and performance than matchclass.
Note that you should not use a $:: or :: prefix on the datagroup name
when using the matchclass command (or in any datagroup reference on
9.4.4 or later).
In v9.4.4 - 10, using $::datagroup_name will work but demote the
virtual server from running on all TMMs. For details, see the CMP
compatibility page.
In v11, using $::datagroup_name will result in a TCL runtime error
and reset being sent to the client!
Syntax¶
matchclass <data-group> <operator name> <value>
matchclass <value> <operator name> <data-group>
matchclass <data-group> <operator name> <value>¶
- Compares each member of a data group with the specified value. Returns index of match if found, 0 if no match is found.
matchclass <value> <operator name> <data-group>¶
- Compares the specified value with each member of a data group. Returns index of match if found, 0 if no match is found.
How the match is performed depends on the operator you use with the
matchclass command. Consider the following…
For the equals operator, either form of the command
will produce the same results. Both of the following examples will
perform a full string comparison and return the index of the first
data group item that is exactly “green”:
[matchclass my_data_group equals "green"]
[matchclass "green" equals my_data_group]
However, when using a partial comparison operator, such as
contains, starts_with or
ends_with, the order of comparison does matter.
This example will return the index of the first row that has the
string “green” anywhere in it:
[matchclass my_data_group contains "green"]
And this example will will return the index of the first row
containing any of contiguous characters in the string “green” (g, r,
e, n, gr, re, ee, en, gre, ree, een, gree, reen, and green will all
match):
[matchclass "green" contains my_data_group]
Note: For v10 users: Classes (data groups) used to be accessible
as a global TCL list. Starting in v10, accessing a data group as a
global variable ($::class_name) simply returns the name of the data
group and is no longer a TCL list. You should now use the “class”
command for all data group access as matchclass/findclass have been
deprecated in v10.
Note: The terms Data Group List and Class are synonymous when
referring to matchclass. Data Group Lists are hashed tcl lists
containing data for comparison with live traffic conditions. They may
be created in the admin web interface under Local Traffic/iRules/Data
Group Lists. See Examples below.
Note: The value of the matched item is NOT returned by matchclass. If
you need to return a value for a specific match, the findclass command
might be what you need. (Link below)
Examples¶
To redirect any request whose URI starts with any of the listed
strings defined in the redirectURIs data group (class), first define
the class (Local Traffic >> iRules >> Data Groups). This is how the
object definition appears in the bigip.conf file:
class redirectURIs {
/my/application/directory
/another/appdir
/yet/another
}
Now create a rule which references the class:
when HTTP_REQUEST {
if { [matchclass [HTTP::uri] starts_with redirectURIs] } {
HTTP::redirect "http://www.domain.com/unavailable.html"
}
}
To send AOL-sourced connections to a specific pool. (Note: Use the
“equals” operator for address comparison with matchclass):
when CLIENT_ACCEPTED {
if { [matchclass [IP::remote_addr] equals aol] } {
pool aol_pool
} else {
pool all_pool
}
}
Use matchclass with the TCL “lindex” command to extract the value of
the matched item. (Matchclass index starts at 1, while lindex uses a 0
based index, thus the expr {$var -
1} adjustment):
As noted above, use the class get command instead of
matchclass and lindex for this example!
when HTTP_REQUEST {
set idx [matchclass [HTTP::uri] contains color]
if { -1 != $idx } {
set val [lindex $::color [expr {$idx - 1}]]
log local0. "Found match index = $idx; value = $val"
} else {
log local0. "Didn't find a match"
}
}
As matchclass doesn’t support wildcards, you can use a foreach loop to
go through the class, element by element. Use string compare as it
supports glob style (wildcard) matching:
when RULE_INIT {
# Create a test class (actually a list in this case). This could also be defined as a class/datagroup.
set ::test_class [list abcd abcde abcdef* abcdefg*]
# Loop through the datagroup line by line.
foreach element $::test_class {
# Log the current line.
log local0. "Current \$element: $element"
# Compare the element against the string.
# If the datagroup entry has a wildcard, it should be listed first in the string compare statement.
if {[string match -nocase $element "ABCDEFG"]}{
# Found a match, so log it and break out of the foreach loop.
log local0. "Matched \$element: $element. Exiting loop."
break
}
}
}